bind_tools
是 LangChain 中与 BaseChatOpenAI
类相关的一个重要方法,用于将工具绑定到语言模型上。我来详细介绍一下这个方法的用法和功能。
bind_tools
方法详解
bind_tools
是 LangChain 框架中提供的一个方法,允许您将一系列工具(tools)直接绑定到 BaseChatOpenAI
实例上,这样模型就可以在需要时调用这些工具。
基本语法
def bind_tools(
self,
tools: Sequence[Union[Dict[str, Any], Tool, Callable]],
*,
tool_choice: Optional[Union[str, Dict[str, str]]] = None,
**kwargs,
) -> Runnable:
参数解释
tools
: 要绑定的工具列表。可以是字典格式的工具定义、LangChain Tool 对象或可调用函数。tool_choice
: 控制模型如何选择工具,可以是:"auto"
: 让模型自动选择是否使用工具"required"
: 强制模型必须使用工具{"type": "function", "function": {"name": "tool_name"}}
: 指定必须使用特定工具
**kwargs
: 其他传递给基础方法的关键字参数
返回值
返回一个 Runnable
对象,可以像使用原始 LLM 一样使用,但现在具有工具调用能力。
使用示例
from langchain.chat_models import ChatOpenAI
from langchain.tools import tool
# 定义工具函数
@tool
def get_weather(location: str, unit: str = "celsius") -> str:
"""获取指定位置的天气信息"""
# 这里是示例代码,实际情况下会调用天气API
if location.lower() == "beijing":
return "北京今天晴朗,温度25°C"
elif location.lower() == "shanghai":
return "上海今天多云,温度28°C"
else:
return f"{location}的天气数据暂时无法获取"
@tool
def calculator(expression: str) -> str:
"""计算数学表达式的结果"""
try:
return str(eval(expression))
except Exception as e:
return f"计算错误: {str(e)}"
# 创建ChatOpenAI实例
chat = ChatOpenAI(temperature=0)
# 绑定工具
chat_with_tools = chat.bind_tools([get_weather, calculator])
# 使用绑定了工具的模型
response = chat_with_tools.invoke("北京今天的天气怎么样?顺便帮我计算一下23*45是多少")
print(response.content)
与 function_call
的区别
bind_tools
是 LangChain 较新的 API,它与之前的 function_call
方法相比有以下优势:
- 更符合 LangChain 的 Runnable 接口设计
- 可以将工具作为一个组件绑定到模型上,使代码更简洁
- 更容易与 LangChain 的其他组件(如 Chains 和 Agents)集成
- 支持 LangChain Tool 对象,而不仅仅是函数定义
在链(Chain)中使用
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnablePassthrough
# 创建一个提示模板
prompt = ChatPromptTemplate.from_template("用户问题: {question}")
# 构建链
chain = (
{"question": RunnablePassthrough()}
| prompt
| chat.bind_tools([get_weather, calculator])
)
# 运行链
result = chain.invoke("请告诉我上海的天气,并计算125除以5")
print(result.content)
在代理(Agent)中使用
from langchain.agents import create_openai_functions_agent
from langchain.agents import AgentExecutor
from langchain.prompts import ChatPromptTemplate
# 创建代理提示
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有用的助手,可以回答问题并使用工具来获取信息。"),
("human", "{input}")
])
# 创建绑定了工具的模型
llm_with_tools = chat.bind_tools([get_weather, calculator])
# 创建代理
agent = create_openai_functions_agent(llm_with_tools, [get_weather, calculator], prompt)
# 创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=[get_weather, calculator], verbose=True)
# 执行
result = agent_executor.invoke({"input": "北京和上海哪个城市温度更高?同时计算它们温度的平均值。"})
print(result["output"])
bind_tools
方法极大地简化了在 LangChain 中将工具与语言模型集成的过程,使您可以创建更强大、更灵活的应用程序。这是 LangChain 0.1.0 版本后引入的更现代化的 API 设计的一部分。