如何将Chainlit连接至持久化ChromaDB,实现多用户共享向量库
解决Chainlit RAG应用连接共享持久化Chroma向量库的问题
步骤1:预初始化持久化Chroma向量库
先单独运行一次脚本,把需要共享的PDF文档导入Chroma并持久化存储,后续所有Chainlit会话直接复用这个库:
from langchain.document_loaders import PyPDFLoader from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma # 加载目标PDF(替换为你的文件路径) loader = PyPDFLoader("target_document.pdf") documents = loader.load_and_split() # 初始化Embeddings并创建持久化Chroma库 embeddings = OpenAIEmbeddings() # 指定本地持久化目录,所有会话将共享此目录下的向量数据 db = Chroma.from_documents( documents=documents, embedding=embeddings, persist_directory="./shared_chroma_db" ) # 强制持久化数据到磁盘 db.persist()
步骤2:修改Chainlit应用代码,连接共享向量库
移除原代码中每次会话要求用户上传PDF的逻辑,改为在应用启动时直接连接已有的持久化Chroma库:
import chainlit as cl from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.chains import RetrievalQA from langchain.llms import OpenAI # 全局初始化:仅在应用启动时执行一次,复用共享向量库 embeddings = OpenAIEmbeddings() db = Chroma( persist_directory="./shared_chroma_db", embedding_function=embeddings ) retriever = db.as_retriever() qa_chain = RetrievalQA.from_chain_type( llm=OpenAI(temperature=0), chain_type="stuff", retriever=retriever ) @cl.on_chat_start async def start_session(): # 告知用户已连接共享知识库,无需上传文件 await cl.Message(content="已接入共享知识库,可直接提问。").send() @cl.on_message async def handle_message(message: cl.Message): # 调用QA链处理用户查询并返回结果 result = qa_chain({"query": message.content}) await cl.Message(content=result["result"]).send()
关键注意事项
- 目录权限:确保
./shared_chroma_db目录在Chainlit运行环境中具备读写权限,所有会话都能访问该目录 - 知识库更新:若需新增/替换文档,重新运行步骤1的初始化脚本即可,Chroma会自动更新向量数据
- 环境变量:运行脚本和Chainlit应用时,需设置
OPENAI_API_KEY环境变量以调用OpenAI的Embeddings和LLM服务
内容的提问来源于stack exchange,提问作者raju
相关产品推荐
相关产品推荐

