LangChain中自定义带Retriever的工具调用时返回空内容的问题
问题分析与解决方法
核心问题
你的代码仅完成了工具与LLM绑定的步骤,但未处理模型发起的工具调用请求——模型返回空内容是因为它判定需要调用工具获取信息,而你既没执行工具调用,也没把工具返回的结果回传给模型生成最终回答。
从返回的AIMessage能明确看到:
finish_reason: tool_calls:模型明确表示需要调用工具获取信息tool_calls字段已生成调用custom_tool的指令,但你没有执行该调用并推进对话流程。
额外小问题
返回结果的additional_kwargs中工具名为wiki_tool,但你创建的工具名是custom_tool,这属于工具定义的不一致问题,需要确保工具名统一。
修复后完整代码示例
from langchain.chat_models import ChatOpenAI from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import FAISS from langchain.tools.retriever import create_retriever_tool from langchain.agents import AgentExecutor, create_tool_calling_agent from langchain import hub # 初始化LLM与检索工具 llm = ChatOpenAI(temperature=0, model="gpt-4o", api_key=api_key) embeddings = OpenAIEmbeddings() db = FAISS.from_documents(docs, embeddings) retriever = db.as_retriever(search_kwargs={"k":4}) tool = create_retriever_tool( retriever, name="custom_tool", description="用于检索文档中的信息,当用户询问的内容需要从文档获取时调用", ) # 用工具调用Agent处理完整流程 prompt = hub.pull("hwchase17/openai-functions-agent") agent = create_tool_calling_agent(llm, [tool], prompt) agent_executor = AgentExecutor(agent=agent, tools=[tool], verbose=True) # 发起查询 result = agent_executor.invoke({"input": "Who are Steve Jobs?"}) print(result["output"])
关键改动说明
- 使用
create_tool_calling_agent和AgentExecutor封装整个工具调用流程,会自动完成:- 判断是否需要调用工具
- 执行工具调用获取检索结果
- 将结果回传给模型生成自然语言回答
- 替换直接调用
llm_with_tools.invoke的方式,改用AgentExecutor处理工具调用的完整逻辑
内容的提问来源于stack exchange,提问作者Enoch
相关产品推荐
相关产品推荐

