工具如何传递给LLM?OpenAI聊天模型Prompt组装与LangChain调试疑问
问题解答
1. OpenAI Chat API中消息数组与工具的组装方式
OpenAI Chat API的工具调用并非将工具定义直接拼入Prompt文本,而是通过独立的tools参数传递工具元数据,消息数组仍保持system/user/assistant/tool等角色结构:
- 先构造工具定义数组,每个工具包含
type(固定为function)、function(含name和parameters); - 调用API时,将工具数组作为
tools参数传入,同时传入正常的消息数组; - 当模型决定调用工具时,会返回带有
tool_calls字段的assistant消息; - 执行工具后,需将工具结果以
role="tool"的消息加入消息数组,继续后续交互。
2. LangChain调试日志看不到工具传递痕迹的原因
create_openai_tools_agent基于OpenAI原生工具调用API实现,工具定义是作为API请求的额外参数(而非消息内容)传递给LLM的:
- langchain.debug日志仅打印发送给LLM的消息数组内容(即
system和human消息),不会显示API的tools参数部分; - 只有当工具执行完成,将结果以
role="tool"的消息加入数组后,后续的LLM调用日志才会显示这条工具消息; - 测试代码中首次调用LLM时,工具是通过API参数传递的,所以日志里看不到,但模型能识别并调用工具。
3. OpenAI API是否必须使用System:/Human:这类标识
不需要。这些前缀是客户端或框架为可读性添加的展示格式,OpenAI API本身只关注消息对象中的role字段(如system/user/assistant/tool),只要role值正确,消息内容里不需要包含这些前缀标识。
测试代码
from langchain import hub from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_community.tools.tavily_search import TavilySearchResults from langchain_openai import ChatOpenAI import langchain langchain.debug = True prompt = hub.pull("hwchase17/openai-tools-agent") tools = [TavilySearchResults(max_results=1)] llm = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0) agent = create_openai_tools_agent(llm, tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=tools) agent_executor.invoke({"input": "what is LangChain?"})
内容的提问来源于stack exchange,提问作者BPDev
相关产品推荐
相关产品推荐

