如何用LangChain对接Docker部署的Chroma DB实现指定知识库问答?
基于Docker部署的Chroma DB与LangChain实现专属知识库问答
1. 连接Docker部署的Chroma DB
由于Chroma是Docker部署的,需通过HTTP远程连接而非本地文件存储。先确认Chroma容器的端口映射(默认容器内8000端口映射到主机8000),然后初始化Chroma向量存储时指定目标collection为"president",必须保证嵌入模型与文件上传时使用的完全一致,否则检索会失效。
代码示例:
from langchain.vectorstores import Chroma from langchain.embeddings.openai import OpenAIEmbeddings # 若用开源嵌入模型,可替换为以下代码 # from langchain.embeddings import HuggingFaceEmbeddings # 初始化嵌入模型(和文件上传时的模型保持一致) embeddings = OpenAIEmbeddings(api_key="你的API密钥") # 开源模型示例 # embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") # 连接Docker部署的Chroma DB,指定目标collection chroma_db = Chroma( collection_name="president", embedding_function=embeddings, persist_directory="http://localhost:8000" # Docker容器映射的主机地址+端口 )
2. 构建检索式问答链
使用LangChain的RetrievalQA链,将Chroma作为检索源结合LLM实现专属知识库问答。小知识库推荐用stuff链类型,大知识库可根据上下文限制切换为map_reduce或refine。
代码示例:
from langchain.chains import RetrievalQA from langchain.llms import OpenAI # 若用开源LLM,可替换为以下代码 # from langchain.llms import HuggingFacePipeline # 初始化LLM llm = OpenAI(api_key="你的API密钥", temperature=0) # 开源LLM示例(需提前配置HuggingFacePipeline) # llm = HuggingFacePipeline(pipeline=你的LLM管道) # 构建问答链 qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=chroma_db.as_retriever(search_kwargs={"k": 3}), # 检索前3条相关文档 return_source_documents=True # 可选:返回参考的源文档 ) # 测试问答 query = "关于总统的主要政策有哪些?" result = qa_chain({"query": query}) print("回答:", result["result"]) # 可选:打印参考的源文档片段 print("\n参考文档:") for doc in result["source_documents"]: print(doc.page_content[:200] + "...")
3. 关键注意事项
- 嵌入模型一致性:文件上传生成嵌入的模型必须和问答阶段的模型完全相同,否则向量无法匹配,检索结果失效。
- 容器网络配置:若Web应用与Chroma容器不在同一主机,需将
persist_directory改为Chroma容器的可访问IP+端口,同时确保容器防火墙允许该端口的HTTP请求。 - 链类型与检索参数调优:文档数量多、单篇篇幅长时,替换为
map_reduce或refine链类型;通过search_kwargs={"k": N}调整检索文档数量,平衡上下文负担与信息完整性。
内容的提问来源于stack exchange,提问作者Christoffer Nielsen
相关产品推荐
相关产品推荐

