You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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封装整个工具调用流程,会自动完成:
    1. 判断是否需要调用工具
    2. 执行工具调用获取检索结果
    3. 将结果回传给模型生成自然语言回答
  • 替换直接调用llm_with_tools.invoke的方式,改用AgentExecutor处理工具调用的完整逻辑

内容的提问来源于stack exchange,提问作者Enoch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:37:14