如何正确连接ChromaDB集合与LangChain,调用自有嵌入数据获取结果?
ChromaDB与LangChain连接问题:使用预生成嵌入调用自有数据的解决方案
问题根源
你的代码返回ChatGPT默认回复,核心原因有两点:
- Chroma数据存储结构错误:LangChain的Chroma集成期望
documents字段存储用于上下文的完整文本内容,而你将title存入documents、实际文本放在metadatas,导致检索时无法获取有效上下文。 - 未验证检索结果有效性:若检索器未返回自有数据,LLM会自动使用默认逻辑生成回复。
修正步骤与代码
1. 调整Chroma数据存储映射
将实际文本内容存入documents字段,标题等辅助信息放入metadatas,确保检索时能拿到正确的上下文:
# 修正字段映射逻辑 documents = list(embedded_df['text'].values) # 存储实际文本内容 metadatas = embedded_df[['title']].to_dict(orient='record') # 标题作为元数据 embedding_list = list(embedded_df['text_embedding'].values) idx = [str(i) for i in range(len(embedded_df))] collection.add( documents=documents, embeddings=embedding_list, metadatas=metadatas, ids=idx )
2. 验证检索结果
在构建QA链前,先确认检索器能返回自有数据,避免因检索为空导致LLM默认回复:
# 测试检索器输出 retrieved_docs = retriver.get_relevant_documents(query) print("检索到的文档:") for doc in retrieved_docs: print(doc.page_content)
若此处无输出,需排查:
- 预生成的embedding与查询用的
text-embedding-ada-002模型是否一致 embedded_df['text_embedding']是否为合法的浮点数组格式
3. 自定义Prompt强制使用上下文
通过自定义Prompt约束LLM必须基于检索到的上下文回答,避免其生成默认内容:
from langchain.prompts import PromptTemplate prompt_template = """使用以下上下文回答用户问题,不知道答案就直接说明,禁止编造内容。 上下文: {context} 问题: {question} 回答:""" PROMPT = PromptTemplate( template=prompt_template, input_variables=["context", "question"] ) # 用自定义Prompt构建QA链 qa = RetrievalQA.from_chain_type( llm=llm, chain_type='stuff', retriever=retriver, chain_type_kwargs={"prompt": PROMPT} )
完整修正代码
from langchain.embeddings.openai import OpenAIEmbeddings from langchain.chat_models import ChatOpenAI from langchain.vectorstores import Chroma from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate import chromadb # 初始化Chroma客户端与集合 chroma_client = chromadb.Client() collection = chroma_client.create_collection(name="Testing") # 修正数据存储映射 documents = list(embedded_df['text'].values) metadatas = embedded_df[['title']].to_dict(orient='record') embedding_list = list(embedded_df['text_embedding'].values) idx = [str(i) for i in range(len(embedded_df))] collection.add( documents=documents, embeddings=embedding_list, metadatas=metadatas, ids=idx ) # 初始化嵌入函数(与预生成embedding模型保持一致) embedding_func = OpenAIEmbeddings(model='text-embedding-ada-002') langchainChroma = Chroma(client=chroma_client, collection_name='Testing', embedding_function=embedding_func) # 初始化LLM与检索器 llm = ChatOpenAI() retriver = langchainChroma.as_retriever(search_kwargs={"k":2}) # 验证检索结果 retrieved_docs = retriver.get_relevant_documents("What is your most favorite food?") print("检索到的文档:") for doc in retrieved_docs: print(doc.page_content) # 自定义Prompt构建QA链 prompt_template = """使用以下上下文回答用户问题,不知道答案就直接说明,禁止编造内容。 上下文: {context} 问题: {question} 回答:""" PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"]) qa = RetrievalQA.from_chain_type( llm=llm, chain_type='stuff', retriever=retriver, chain_type_kwargs={"prompt": PROMPT} ) # 执行查询 query = """What is your most favorite food?""" result = qa.run(query) print(result)
内容的提问来源于stack exchange,提问作者lima
相关产品推荐
相关产品推荐

