如何在RAG LLM检索调用中捕获Prompt、响应及上下文数据?
RAG调用时捕获Prompt、响应及上下文数据的实现方案
实现思路
要实现调用检索端点时的全数据捕获,只需在原函数基础上扩展返回内容,把需要的prompt、响应、上下文文档以及传入的参数都包含进去,同时可按需添加持久化逻辑(比如保存到本地文件)。
修改后的完整代码示例
def response_llm(prompt, text1, text2, int1, int2): # 保存原始prompt并拼接最终请求prompt original_prompt = prompt if len(text1) > 1: prompt += "\n text1: " + text1 if len(text2) > 1: prompt += "\n text2: " + text2 # 获取检索到的上下文文档,并转换为可序列化格式 retrieved_docs = retriever.get_relevant_documents(prompt) context_docs = [{"page_content": doc.page_content, "metadata": doc.metadata} for doc in retrieved_docs] # 初始化QA链 qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True ) # 获取LLM响应 llm_response = qa_chain(prompt) # 构造包含所有捕获数据的返回结果 return { "original_prompt": original_prompt, "final_prompt": prompt, "response": llm_response["result"], "retrieved_context": context_docs, "qa_source_documents": [{"page_content": doc.page_content, "metadata": doc.metadata} for doc in llm_response["source_documents"]], "text1": text1, "text2": text2, "int1": int1, "int2": int2 }
关键说明
- Prompt捕获:同时保留原始输入prompt和拼接后的最终prompt,便于后续追溯请求内容的变化。
- 上下文数据捕获:
- 直接通过
retriever.get_relevant_documents获取检索结果,转换为字典格式保留文档内容与元数据。 - 同步保留QA链返回的
source_documents,确保上下文数据的完整性(若QA链内部有二次检索逻辑,两者可能存在差异)。
- 直接通过
- 参数留存:将传入的
text1、text2、int1、int2一并返回,方便关联调用时的输入参数。 - 可选持久化:如果需要长期存储捕获数据,可在函数末尾添加写入逻辑,比如保存到JSON文件:
import json with open("rag_call_records.json", "a", encoding="utf-8") as f: json.dump(return_data, f, ensure_ascii=False) f.write("\n")
调用示例
# 调用函数获取全量捕获数据 rag_record = response_llm( prompt="解释RAG的核心作用", text1="面向AI入门用户", text2="需要简洁易懂的表述", int1=1, int2=2 ) # 查看捕获的关键数据 print("最终请求Prompt:\n", rag_record["final_prompt"]) print("\nLLM响应内容:\n", rag_record["response"]) print("\n检索到的上下文文档数量:", len(rag_record["retrieved_context"])) print("\n第一个上下文文档内容:\n", rag_record["retrieved_context"][0]["page_content"])
内容的提问来源于stack exchange,提问作者Vallalar_dev
相关产品推荐
相关产品推荐

