【GPT入门】第20课 langchain的function calling 初步体验
1. langchain的function calling 非常简洁
- 在方法名说明方法用途和参数作用
- 增加@tool 标签
- langchain方法自动把@tool转为方法定义,后续方法调用都很简洁
下面代码用支持单函数与多函数调用,自己体验一下
query = “3 加 4的和 的 5 倍是多少?” 这个会调用两次函数
query = " 4的 5 倍是多少?"
2. 代码
from langchain_core.messages import HumanMessage
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
@tool
def add(a: int, b: int) -> int:
"""Add two integers together.
Args:
a: The first integer.
b: The second integer.
"""
return a + b
@tool
def multiply(a: int, b: int) -> int:
"""Multiply two integers together.
Args:
a: The first integer.
b: The second integer.
"""
return a * b
import json
# model_name = 'gpt-4o-mini'
# model_name = 'gpt-4'
# llm = ChatOpenAI(model_name=model_name)
llm = ChatOpenAI()
llm_with_tools = llm.bind_tools([add, multiply])
query = "3 加 4的和 的 5 倍是多少?"
# query = " 4的 5 倍是多少?"
messages = [HumanMessage(content=query)]
output = llm_with_tools.invoke(messages)
print(output)
print("------------tool_calls:")
print(json.dumps(output.tool_calls, indent=4))
messages.append(output)
avaliable_tools = {"add":add, "multiply": multiply}
for tool_call in output.tool_calls:
selected_tools = avaliable_tools[tool_call["name"].lower()] # tool_call就是一个字典
tool_msg = selected_tools.invoke(tool_call)
messages.append(tool_msg)
print("tool_msg:, type:", type(tool_msg)) # <class 'langchain_core.messages.tool.ToolMessage'>
print(tool_msg)
# content='20' name='multiply' tool_call_id='call_e5EY7klNZlBD8W68y7X0BcYD'
new_output = llm_with_tools.invoke(messages)
for message in messages:
print("message.dump:")
print(json.dumps(message.model_dump(), indent=4, ensure_ascii=False))
print(new_output.content)
3. 执行结果:
C:\ProgramData\anaconda3\envs\gptLearning\python.exe E:\workspace\gptLearning\gptLearning\ls10\functionCalling\ls01_tools.py
content='' additional_kwargs={'tool_calls': [{'id': 'call_0HGpTdeo2zm9G6zZPbewVi8g', 'function': {'arguments': '{"a": 3, "b": 4}', 'name': 'add'}, 'type': 'function'}, {'id': 'call_m6Uc0OfQ9ea0uTyFNbwEWIBq', 'function': {'arguments': '{"a": 7, "b": 5}', 'name': 'multiply'}, 'type': 'function'}], 'refusal': None} response_metadata={'token_usage': {'completion_tokens': 49, 'prompt_tokens': 121, 'total_tokens': 170, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': 'fp_0165350fbb', 'finish_reason': 'tool_calls', 'logprobs': None} id='run-e83caecd-ca6f-4851-b35e-b5ea8f2804a2-0' tool_calls=[{'name': 'add', 'args': {'a': 3, 'b': 4}, 'id': 'call_0HGpTdeo2zm9G6zZPbewVi8g', 'type': 'tool_call'}, {'name': 'multiply', 'args': {'a': 7, 'b': 5}, 'id': 'call_m6Uc0OfQ9ea0uTyFNbwEWIBq', 'type': 'tool_call'}] usage_metadata={'input_tokens': 121, 'output_tokens': 49, 'total_tokens': 170, 'input_token_details': {}, 'output_token_details': {}}
------------tool_calls:
[
{
"name": "add",
"args": {
"a": 3,
"b": 4
},
"id": "call_0HGpTdeo2zm9G6zZPbewVi8g",
"type": "tool_call"
},
{
"name": "multiply",
"args": {
"a": 7,
"b": 5
},
"id": "call_m6Uc0OfQ9ea0uTyFNbwEWIBq",
"type": "tool_call"
}
]
tool_msg:, type: <class 'langchain_core.messages.tool.ToolMessage'>
content='7' name='add' tool_call_id='call_0HGpTdeo2zm9G6zZPbewVi8g'
tool_msg:, type: <class 'langchain_core.messages.tool.ToolMessage'>
content='35' name='multiply' tool_call_id='call_m6Uc0OfQ9ea0uTyFNbwEWIBq'
message.dump:
{
"content": "3 加 4的和 的 5 倍是多少?",
"additional_kwargs": {},
"response_metadata": {},
"type": "human",
"name": null,
"id": null,
"example": false
}
message.dump:
{
"content": "",
"additional_kwargs": {
"tool_calls": [
{
"id": "call_0HGpTdeo2zm9G6zZPbewVi8g",
"function": {
"arguments": "{\"a\": 3, \"b\": 4}",
"name": "add"
},
"type": "function"
},
{
"id": "call_m6Uc0OfQ9ea0uTyFNbwEWIBq",
"function": {
"arguments": "{\"a\": 7, \"b\": 5}",
"name": "multiply"
},
"type": "function"
}
],
"refusal": null
},
"response_metadata": {
"token_usage": {
"completion_tokens": 49,
"prompt_tokens": 121,
"total_tokens": 170,
"completion_tokens_details": null,
"prompt_tokens_details": null
},
"model_name": "gpt-3.5-turbo-0125",
"system_fingerprint": "fp_0165350fbb",
"finish_reason": "tool_calls",
"logprobs": null
},
"type": "ai",
"name": null,
"id": "run-e83caecd-ca6f-4851-b35e-b5ea8f2804a2-0",
"example": false,
"tool_calls": [
{
"name": "add",
"args": {
"a": 3,
"b": 4
},
"id": "call_0HGpTdeo2zm9G6zZPbewVi8g",
"type": "tool_call"
},
{
"name": "multiply",
"args": {
"a": 7,
"b": 5
},
"id": "call_m6Uc0OfQ9ea0uTyFNbwEWIBq",
"type": "tool_call"
}
],
"invalid_tool_calls": [],
"usage_metadata": {
"input_tokens": 121,
"output_tokens": 49,
"total_tokens": 170,
"input_token_details": {},
"output_token_details": {}
}
}
message.dump:
{
"content": "7",
"additional_kwargs": {},
"response_metadata": {},
"type": "tool",
"name": "add",
"id": null,
"tool_call_id": "call_0HGpTdeo2zm9G6zZPbewVi8g",
"artifact": null,
"status": "success"
}
message.dump:
{
"content": "35",
"additional_kwargs": {},
"response_metadata": {},
"type": "tool",
"name": "multiply",
"id": null,
"tool_call_id": "call_m6Uc0OfQ9ea0uTyFNbwEWIBq",
"artifact": null,
"status": "success"
}
3 加 4 的和是 7,7 的 5 倍是 35。
Process finished with exit code 0
``