如何在ReAct LangChain框架中为agent.run传递上下文并集成PDF检索工具
将LangChain PDF检索Chain与Agent集成的实现方法
核心思路是把你的PDF检索Chain封装成LangChain的Tool,让Agent可以自主判断是否需要调用该工具获取PDF上下文,再生成回答。以下是具体实现步骤:
1. 封装PDF检索Chain为Tool
你的现有Chain通过chain.run(input_documents=..., question=...)调用,需要把它包装成符合Agent调用规范的Tool。注意Tool的调用函数需接收单个字符串参数(用户问题),因此要把获取相关PDF文档的逻辑(比如向量库检索)内嵌进去:
from langchain.tools import Tool # 假设你已定义好PDF检索chain(pdf_retrieval_chain)和向量存储(vector_store) def pdf_retrieval_func(query): # 从向量库检索与问题相关的PDF文档片段 relevant_docs = vector_store.similarity_search(query) # 调用原有chain获取结果 return pdf_retrieval_chain.run(input_documents=relevant_docs, question=query) # 创建Tool实例 pdf_tool = Tool( name="PDF文档检索工具", func=pdf_retrieval_func, description="当用户的问题需要从已上传的PDF文档中提取信息时使用,直接输入用户的问题即可返回对应内容。" )
2. 初始化包含该Tool的Agent
将封装好的Tool加入Agent的工具列表,选择合适的Agent类型初始化(推荐根据场景选择,比如对话场景用CHAT_CONVERSATIONAL_REACT_DESCRIPTION):
from langchain.agents import initialize_agent, AgentType from langchain.chat_models import ChatOpenAI # 初始化大语言模型(以GPT-3.5为例) llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo") # 构建Agent agent = initialize_agent( tools=[pdf_tool], llm=llm, agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, verbose=True # 开启日志可查看Agent的思考和工具调用过程 )
3. 使用Agent提问
现在可以直接用agent.run()调用,Agent会自动判断是否需要调用PDF检索工具:
# 示例提问 response = agent.run("PDF中关于数据加密的具体流程是什么?") print(response)
关键注意事项
- Tool描述要精准:Agent依赖Tool的描述判断是否调用,所以要明确说明工具的适用场景,避免Agent误判。
- 文档检索逻辑内嵌:Agent调用工具时仅传递问题字符串,因此必须把获取
input_documents的逻辑(比如向量检索)放到Tool的调用函数中。 - Agent类型适配:单轮提问场景可选择
ZERO_SHOT_REACT_DESCRIPTION,多轮对话场景优先用CHAT_CONVERSATIONAL_REACT_DESCRIPTION。
内容的提问来源于stack exchange,提问作者Aditya Bansal
相关产品推荐
相关产品推荐

