在本教程中,我们将指导您创建与 Llama Index 集成的 Chainlit 应用。

即将构建的应用预览

先决条件

在深入了解之前,请确保满足以下先决条件

  • 已安装并可正常工作的 Chainlit
  • 已安装 Llama Index 包
  • 一个 OpenAI API 密钥
  • 对 Python 编程有基本了解

步骤 1: 设置您的数据目录

在您的应用根目录下创建一个名为 data 的文件夹。下载 state of the union 文件(或您选择的任何文件),并将其放入 data 文件夹中。

步骤 2: 创建 Python 脚本

在您的项目目录中创建一个名为 app.py 的新 Python 文件。此文件将包含您的 LLM 应用的主要逻辑。

步骤 3: 编写应用逻辑

app.py 中,导入必要的包,并定义一个函数来处理新的聊天会话,另一个函数来处理来自 UI 的传入消息。

在本教程中,我们将使用 RetrieverQueryEngine。以下是脚本的基本结构

app.py
import os
import openai
import chainlit as cl

from llama_index.core import (
    Settings,
    StorageContext,
    VectorStoreIndex,
    SimpleDirectoryReader,
    load_index_from_storage,
)
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core.query_engine.retriever_query_engine import RetrieverQueryEngine
from llama_index.core.callbacks import CallbackManager
from llama_index.core.service_context import ServiceContext

openai.api_key = os.environ.get("OPENAI_API_KEY")

try:
    # rebuild storage context
    storage_context = StorageContext.from_defaults(persist_dir="./storage")
    # load index
    index = load_index_from_storage(storage_context)
except:
    documents = SimpleDirectoryReader("./data").load_data(show_progress=True)
    index = VectorStoreIndex.from_documents(documents)
    index.storage_context.persist()


@cl.on_chat_start
async def start():
    Settings.llm = OpenAI(
        model="gpt-3.5-turbo", temperature=0.1, max_tokens=1024, streaming=True
    )
    Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
    Settings.context_window = 4096

    service_context = ServiceContext.from_defaults(callback_manager=CallbackManager([cl.LlamaIndexCallbackHandler()]))
    query_engine = index.as_query_engine(streaming=True, similarity_top_k=2, service_context=service_context)
    cl.user_session.set("query_engine", query_engine)

    await cl.Message(
        author="Assistant", content="Hello! Im an AI assistant. How may I help you?"
    ).send()


@cl.on_message
async def main(message: cl.Message):
    query_engine = cl.user_session.get("query_engine") # type: RetrieverQueryEngine

    msg = cl.Message(content="", author="Assistant")

    res = await cl.make_async(query_engine.query)(message.content)

    for token in res.response_gen:
        await msg.stream_token(token)
    await msg.send()

此代码为每个聊天会话设置了一个 RetrieverQueryEngine 实例。每当用户发送消息时,都会调用 RetrieverQueryEngine 来生成响应。

回调处理程序负责监听中间步骤并将其发送到 UI。

步骤 4: 启动应用

要启动您的 LLM 应用,打开终端,导航到包含 app.py 的目录,并运行以下命令

chainlit run app.py -w

-w 标志启用自动重新加载,这样您在修改应用时就不必每次都重新启动服务器。您的聊天机器人 UI 现在应该可以在 http://localhost:8000 访问了。