如何在ConversationalRetrievalChain回答中嵌入PDF文档元数据标识?
解决Langchain ConversationalRetrievalChain回答中嵌入PDF元数据标识的问题
核心问题在于需要让LLM明确关联检索到的文档内容与对应的元数据,并在回答中主动标注。以下是具体实现步骤:
1. 自定义文档格式化逻辑
将每个检索到的文档内容与元数据(如PDF标识)绑定,让上下文信息自带来源标识,让LLM能直接感知内容对应的文档:
def format_docs_with_metadata(docs): formatted_content = [] for doc in docs: # 从元数据中提取PDF标识,这里假设元数据键为"doc_name",可根据实际调整 doc_id = doc.metadata.get("doc_name", "unlabeled_doc") # 将内容与来源拼接 formatted_doc = f"{doc.page_content}\n(来源:{doc_id})" formatted_content.append(formatted_doc) return "\n\n".join(formatted_content)
2. 定制Prompt模板
明确告知LLM必须基于带来源的上下文回答,且每个信息点都要标注对应文档标识:
from langchain.prompts import PromptTemplate custom_prompt = PromptTemplate( input_variables=["chat_history", "question", "context"], template="""基于以下上下文回答用户问题,**每个具体信息必须标注对应来源的文档标识**: 上下文: {context} 历史对话记录: {chat_history} 用户问题:{question} 回答要求: - 严格基于上下文内容,不得编造信息 - 每个提及的具体数据/信息后,必须标注其来源的文档标识(如:(来源:doc01)) """ )
3. 重构ConversationalRetrievalChain
将自定义的文档格式化逻辑和Prompt整合到链中:
from langchain.chains import ConversationalRetrievalChain # 初始化链时传入自定义配置 qa_chain = ConversationalRetrievalChain.from_llm( llm=your_llm_instance, # 替换为你的LLM模型(如GPT-3.5/4、Llama等) retriever=your_vector_retriever, # 替换为你的向量检索器 # 传入自定义Prompt combine_docs_chain_kwargs={"prompt": custom_prompt}, # 指定文档格式化函数 document_prompt=PromptTemplate( input_variables=["page_content", "metadata"], template="{page_content}\n(来源:{metadata['doc_name']})" ), return_source_documents=True # 可选,开启后可返回检索到的原始文档,方便调试 )
关键说明
- 之前仅遍历文档元数据无效的原因:LLM无法直接将孤立的元数据列表与回答内容关联,必须将来源标识与内容绑定后传入上下文,同时通过Prompt强制标注要求。
- 如果模型标注仍不准确,可在Prompt中添加示例(如:"例如:XXX铝型材(来源:doc01),YYY铝型材(来源:doc02)"),强化模型的格式认知。
- 确保元数据中的PDF标识(如
doc_name)在文档加载时已正确存入,可通过print(doc.metadata)确认。
内容的提问来源于stack exchange,提问作者user2295798
相关产品推荐
相关产品推荐

