如何让LangChain的ConversationalRetrievalChain携带Chromadb元数据至Prompt
解决ConversationalRetrievalChain中LLM无法获取文档元数据的问题
要让LLM同时获取文档的page_content和关联的filename、candidatename元数据,有两种直接可行的方案:
方案一:入库前将元数据嵌入文档内容
在将PDF文档存入向量库前,手动把元数据(候选人姓名、简历文件名)追加到文档内容的开头或结尾,这样检索返回的内容本身就包含元数据,LLM自然能读取到。
示例代码:
# 加载PDF文档后,遍历处理每个文档 for doc in docs: # 将元数据插入到内容头部 doc.page_content = f"候选人姓名:{doc.metadata['candidatename']}\n简历文件名:{doc.metadata['filename']}\n\n{doc.page_content}" # 处理完成后,再将docs存入vectorstore vectorstore.add_documents(docs)
方案二:自定义文档格式化模板
通过修改ConversationalRetrievalChain的文档组合逻辑,让每个文档在传给LLM前自动带上元数据信息。
示例代码:
from langchain.chains.combine_documents.stuff import StuffDocumentsChain from langchain.chains.llm import LLMChain from langchain.prompts import PromptTemplate, DocumentPromptTemplate # 定义单个文档的输出模板,包含元数据字段 document_prompt = DocumentPromptTemplate( input_variables=["page_content", "metadata"], template="候选人姓名:{metadata.candidatename}\n简历文件名:{metadata.filename}\n\n{page_content}" ) # 定义LLM的回答提示模板 combine_prompt = PromptTemplate( input_variables=["context", "question"], template="根据以下简历信息回答问题:\n\n{context}\n\n问题:{question}\n回答:" ) # 创建文档组合链 llm_chain = LLMChain(llm=llm, prompt=combine_prompt) combine_docs_chain = StuffDocumentsChain( llm_chain=llm_chain, document_variable_name="context", document_prompt=document_prompt ) # 初始化ConversationalRetrievalChain时传入自定义的组合链 conversation_chain = ConversationalRetrievalChain.from_llm( llm=llm, retriever=SelfQueryRetriever.from_llm(llm, vectorstore, document_content_description, metadata_field_info), memory=memory, verbose=True, combine_docs_chain=combine_docs_chain )
这两种方案都能确保LLM在生成回答时,同时获取到文档内容和对应的元数据信息。方案一适合提前预处理文档,方案二更灵活,无需修改原始文档内容。
内容的提问来源于stack exchange,提问作者the programmer
相关产品推荐
相关产品推荐

