一、 插件分享:
由于LLamaIndex框架以及接下来的chainlit框架文档均为英文,且专业名词较多,先在这里分享一个Google插件:沉浸式翻译
,在Google商店搜索即可,根据安装提示使用,在这里就不多赘述了
接上次:https://blog.youkuaiyun.com/RX0117/article/details/144970806
二、界面实现:
1.常用的界面模块
- chainlit,官网:https://docs.chainlit.io/get-started/overview
- stremlit, 官网:https://streamlit.io/
- gradio,官网:https://www.gradio.app/
今天我们选择使用chainlit框架实现
2.安装chainlit
pip install chainlit
检查安装是否成功
chainlit hello
如果出现以下报错
主要原因是pydantic的版本问题,安装pydantic为2.9.2版本即可
pip uninstall pydantic
pip install pydantic==2.9.2
再次执行终端命令
chainlit hello
一个最基本的页面就显示出来了,我们在终端按住Ctrl+c退出后发现项目内多出来两个文件,.chainlit
和chainlit.md
这两个是chainlit的项目配置文件
3.界面构建
来到官网,找到搜索框
我们搜索llama index
往下翻,找到官网app源码
我们将main.py以及.chainlit和chainlit.md删除,并创建一个pro文件夹,用于后续文件管理,在pro中创建app.py,将llms.py移入pro中
官网的app.py代码这里我就复制下来给大家
注:有些地方我们需要删除或更改,暂时不可直接使用
官网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()
由于我们使用的具体配置与官方的不同,需要对app.py进行删减
app.py简化版
import chainlit as cl
from llama_index.core import Settings
from llama_index.core.chat_engine import SimpleChatEngine
from llms import deepseek_llm
@cl.on_chat_start
async def start():
# 初始化大型语言模型(LLM)设置
Settings.llm = deepseek_llm()
# 创建一个简单的聊天引擎实例
chat_engine = SimpleChatEngine.from_defaults()
# 将聊天引擎对象存储到用户会话中
cl.user_session.set('chat_engine', chat_engine)
# 发送一条欢迎消息
await cl.Message(
author="Assistant", content="你好!我是 AI 助⼿。有什么可以帮助你的吗?"
).send()
# chainlit消息事件处理函数
@cl.on_message
async def main(message: cl.Message):
# 从用户会话中获取chat_engine聊天引擎对象
chat_engine = cl.user_session.get('chat_engine')
# 初始化一个空的消息对象,内容为空,作者名为"Assistant"
msg = cl.Message(content='', author="Assistant")
# 使用chat_engine的stream_chat方法处理接收到的消息内容,并将结果转换为异步响应
res = await cl.make_async(chat_engine.stream_chat)(message.content)
# 流式输出界面
# 遍历生成响应内容。逐个令牌输出
for token in res.response_gen:
await msg.stream_token(token)
await msg.send()
然后我们打开终端在终端使用命令,进入pro文件夹
注:一定要进入pro文件夹
cd pro
再使用运行命令
注:chainlit run 文件名(一定要有文件名后缀) -w
chainlit run app.py -w
启动完成后
我们的pro文件夹下会多出几个文件,其中一些是关于chainlit的配置文件,后续需要使用
构建好的基本界面
4.小结
这里简单解释一下app.py中的代码功能
这段代码实现了基于AI的聊天应用,主要包含了两个主要的异步函数:
1.strat()函数:
- 当聊天开始时执行
- 初始化语言模型和聊天引擎,并发送欢迎消息给用户
- main(message: cl.Message)函数:
- 处理用户发送的消息
- 使用聊天引擎生成回复内容并反馈给用户,以流式输出的方式发送给用户。