LangChain调用自定义工具
下面的示例代码连接的是本地Ollama中的QWen2.5。
方式1 解析tool_calls
解析LLM返回的tool_calls信息,再调用tool。自定义函数必须使用tool注解。
from langchain_core.tools import tool
from langchain.chat_models import init_chat_model
from langchain.schema import HumanMessage
from langchain_openai import ChatOpenAI
@tool
def controllLight(status: bool):
"""用于控制灯的开关,若为True则为开灯,若为False则为关灯
"""
print(f"light status : {status}")
client = ChatOpenAI(
api_key="qwen",
model="qwen2.5",
base_url="http://127.0.0.1:11434/v1",
)
tools = [controllLight]
llm_with_tools = client.bind_tools(tools)
query = "关闭灯"
messages = [HumanMessage(query)]
resp = llm_with_tools.invoke(messages)
print(resp.tool_calls)
for tool_call in resp.tool_calls:
selected_tool = {"controllLight": controllLight}[tool_call["name"]]
tool_msg = selected_tool.invoke(tool_call)
messages.append(tool_msg)
相对于自己解析出参数值,然后再手动调用函数来说,此方式更方便。
执行后响应:
light status : True
方式2 链式调用
使用LangChain的链式调用。
from langchain_core.tools import tool
from langchain.schema import HumanMessage
from langchain_openai import ChatOpenAI
@tool
def controllLight(status: bool):
"""用于控制灯的开关,若为True则为开灯,若为False则为关灯
"""
print(f"light status : {status}")
client = ChatOpenAI(
api_key="qwen2.5",
model="qwen2.5",
base_url="http://127.0.0.1:11434/v1",
)
tools = [controllLight]
llm_with_tools = client.bind_tools(tools)
query = "打开灯"
messages = [HumanMessage(query)]
chain = llm_with_tools | (lambda msg: msg.tool_calls[0]["args"]) | controllLight
resp = chain.invoke(messages)
此方式比较通用,不需要处理参数。但需要把方法绑定到链式调用中。会导致程序可复用性较差。