如何在Python的LangChain中返回回答所依赖的上下文
实现方法
要在返回结果中添加算法依赖的文档段落,需要调整RAG链的结构,同时保留检索到的原始文档对象和最终回答结果,最后将两者合并输出。具体修改步骤如下:
1. 调整链的输入结构,保留原始文档
将原来仅生成格式化上下文文本的逻辑,改为同时获取原始文档对象和格式化后的上下文文本——前者用于后续提取依赖段落,后者用于给大模型生成回答提供上下文。
修改链的起始部分:
from langchain_core.runnables import RunnableParallel, RunnablePassthrough # 同时获取原始文档和格式化后的上下文 input_chain = RunnableParallel( context_docs=compression_retriever, # 保留检索到的原始Document对象 formatted_context=compression_retriever | format_docs, # 格式化后的文本给prompt question=RunnablePassthrough() # 透传用户查询 )
2. 定义结果合并函数
编写函数将大模型的回答结果(解析后的price/unit)与原始文档的段落、元数据合并:
def combine_response_with_context(response, context_docs): # 将原始文档转换为字典列表,包含段落内容和元数据(如页码、来源) context_paragraphs = [ { "page_content": doc.page_content, "metadata": doc.metadata } for doc in context_docs ] # 合并回答和上下文信息 return { **response, "context": context_paragraphs }
3. 重构完整RAG链
将输入链、回答生成逻辑、结果合并逻辑串联起来:
rag_chain = ( input_chain # 生成结构化回答 | RunnablePassthrough.assign( structured_response=lambda x: rag_prompt.format_prompt( context=x["formatted_context"], question=x["question"] ) | llm | output_parser ) # 合并回答与上下文 | lambda x: combine_response_with_context(x["structured_response"], x["context_docs"]) )
4. 调用链并查看结果
执行查询后,返回的结果会包含price、unit和context三个键,其中context是一个列表,每个元素对应回答依赖的文档段落及其元数据:
query = "What is the price? How many units?" response = rag_chain.invoke(query, config={"configurable": {"session_id": "abc123"}}) # 示例输出结构 { "price": 500000.0, "unit": 3, "context": [ { "page_content": "Property appraised value: $500,000...", "metadata": {"source": "/Appraisal.pdf", "page": 15} }, { "page_content": "Total residential units: 3...", "metadata": {"source": "/Appraisal.pdf", "page": 20} } ] }
内容的提问来源于stack exchange,提问作者Nicolas REY
相关产品推荐
相关产品推荐

