基于Chainlit和Llamalndex的智能RAG聊天机器人实现详解
本文将详细介绍如何使用Chainlit和LlamaIndex构建一个功能完整的RAG(Retrieval-Augmented Generation)聊天机器人。通过分析项目代码,我将解释每个模块的设计思路和技术实现
项目结构:
①app.py:Web界面主程序 ②base_rag.py:RAG核心逻辑
③embeddings.py:嵌入模型配置 ④llms.py:大语音模型配置
⑤main.py:命令行测试程序
逻辑代码分析
一、Web界面模块(app.py)
import chainlit as cl
from llama_index.core import Settings
from base_rag import create_chat_model@cl.on_chat_start
async def start():Settings.llm = moonshot_llm()chat_engine = await create_chat_model()cl.user_session.set("chat_engine", chat_engine)await cl.Message(author="Assistant", content="你好!我是 AI 助⼿,请开始提问。").send()
这里使用@cl.on_chat_start装饰器处理聊天开始事件,使用user_session保存会话状态
二、RAG核心模块(base_rag.py)
def create_index():"""构建向量数据索引"""data = SimpleDirectoryReader(input_dir="data", recursive=True).load_data()index = VectorStoreIndex.from_documents(data)index.storage_context.persist(persist_dir="index")
这里使用data目录下的所有文档,将索引持久化到index目录
async def create_chat_model():storage_context = StorageContext.from_defaults(persist_dir="index")index = load_index_from_storage(storage_context)memory = ChatMemoryBuffer.from_defaults(token_limit=1024)chat_engine = index.as_chat_engine(chat_mode=ChatMode.CONTEXT,memory=memory,system_prompt=("你是一个AI助手,请回答问题。"))return chat_engine
这块代码是聊天引擎的设计,使用了上下文模式,记忆缓冲,以及定义AI助手是谁
三、嵌入模型配置(embeddings.py)
def embed_model_local_bge_small(**kwargs):embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-zh-v1.5",cache_folder=r"../embed_cache",**kwargs)return embed_model
这里使用的嵌入模型为BAAI/bge-small-zh-v1.5,它是专为中文优化的轻量级嵌入模型
四、大语音模型配置(llms.py)
# 模型注册机制
MOONSHOT__MODELS: Dict[str,int] = {"kimi-k2-0711-preview": 128000}
ALL_AVAILABLE_MODELS.update(MOONSHOT__MODELS)
CHAT_MODELS.update(MOONSHOT__MODELS)def moonshot_llm(**kwargs):llm = OpenAI(api_key="sk-lqJDVWaSWOBCPlNZHlWGlK1BLDpKcNOlefbf0VT9lBtys2pZ",model="kimi-k2-0711-preview",api_base="https://api.moonshot.cn/v1",temperature=0.6,**kwargs)return llm
这块代码使用了多模型设计,统一使用OpenAI兼容的API接口,便于模型切换降低维护成本
五、命令行测试模块(main.py)
# 月之暗面配置
Settings.llm = moonshot_llm()
chat_engine = SimpleChatEngine.from_defaults()
chat_engine.streaming_chat_repl()
提供快速便捷的测试环境,验证模型配置是否正确
技术亮点
一、异步流式响应
@cl.on_message
async def main(message: cl.Message):query_engine = cl.user_session.get("chat_engine")msg = cl.Message(content="", author="Assistant")res = await cl.make_async(query_engine.stream_chat)(message.content)for token in res.response_gen:await msg.stream_token(token)await msg.send()
实时显示生成内容,提示用户体验
二、灵活的模型切换
只需要在Settings.llm修改代码,即可切换不同的大语音模型
部署和使用
1、准备好知识库文档:将文档放入data目录
2、构建索引:运行 python base_rag.py
3、启动Web服务:运行 chainlit run app.py
4、命令行测试:运行 python main.py