LangGraph+ChatOpenAI+Ollama自定义工具函数调用报错问题求助
解决LangGraph自定义工具调用失败的问题
核心原因
自定义工具未正确注册到LangGraph的工具列表,或工具格式不符合LangChain规范,导致Agent无法识别。
具体修复步骤
1. 让自定义工具符合LangChain规范
不管是本地函数还是外部脚本的工具,都需要用LangChain的@tool装饰器或StructuredTool类包装,赋予标准的描述和参数定义。
测试用fake_search示例:
from langchain.tools import tool @tool def fake_search(query: str) -> str: """模拟搜索工具,返回固定测试结果""" return f"模拟搜索结果:{query}的相关信息"
外部脚本external_tools.py中的工具:
# external_tools.py from langchain.tools import tool @tool def external_search(query: str) -> str: """外部脚本中的自定义搜索工具""" return f"外部搜索结果:{query}"
2. 正确将自定义工具加入Agent的工具集合
构建Agent时,要把自定义工具和社区工具一起传入工具列表,确保Agent能识别所有可用工具。
from langchain_community.tools import TavilySearchResults from langgraph.prebuilt import create_react_agent from langchain_openai import ChatOpenAI # 导入自定义工具 from external_tools import external_search from local_tools import fake_search # 初始化LLM(可选ChatOpenAI或Ollama) llm = ChatOpenAI(model="gpt-3.5-turbo") # llm = ChatOllama(model="llama3") # 组装工具列表:社区工具 + 自定义工具 tools = [ TavilySearchResults(max_results=1), fake_search, external_search ] # 创建Agent agent = create_react_agent(llm, tools)
3. 自定义Agent逻辑的工具调用检查
如果不用create_react_agent而是自定义Agent流程,要确保工具调用节点正确匹配工具集合:
from langgraph.graph import StateGraph, END from langchain_core.messages import ToolMessage def call_tool(state): tool_calls = state["messages"][-1].tool_calls results = [] for tc in tool_calls: # 通过工具名称匹配对应工具 tool = {t.name: t for t in tools}[tc["name"]] result = tool.invoke(tc["args"]) results.append(ToolMessage(content=str(result), tool_call_id=tc["id"])) return {"messages": results} # 构建图时关联工具调用节点 graph_builder = StateGraph(AgentState) graph_builder.add_node("call_tool", call_tool)
4. 验证工具名称一致性
LLM生成的工具调用名称必须和自定义工具的name属性完全一致(大小写敏感),可通过打印确认:
print(fake_search.name) # 输出:fake_search
如需自定义工具名称,可在装饰器中指定:
@tool(name="my_custom_search") def fake_search(query: str) -> str: """模拟搜索工具,返回固定测试结果""" return f"模拟搜索结果:{query}的相关信息"
常见错误排查
- 未用LangChain工具装饰器包装:普通函数无法被Agent识别,必须用
@tool或StructuredTool处理。 - 工具未加入Agent工具列表:即使定义了工具,未传入Agent的工具集合,Agent也无法调用。
- 工具描述缺失:
@tool的文档字符串是LLM识别工具的关键,必须清晰描述功能和参数。
内容的提问来源于stack exchange,提问作者swv
相关产品推荐
相关产品推荐

