from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, ToolMessage
from agent_learn.config import Config
conf = Config()
# print(f'conf.model_name: {conf.model_name}')
# todo: 第一步:定义工具函数
@tool
def add(a: int, b: int) -> int:
"""
将数字a与数字b相加
Args:
a: 第一个数字
b: 第二个数字
"""
return a + b
@tool
def multiply(a: int, b: int) -> int:
"""
将数字a与数字b相乘
Args:
a: 第一个数字
b: 第二个数字
"""
return a * b
# 定义 JSON 格式的工具 schema
tools = [add, multiply]
# todo: 第二步:初始化模型
llm = ChatOpenAI(base_url=conf.base_url,
model=conf.model_name,
api_key=conf.api_key,
temperature=0.2)
# 绑定工具,允许模型自动选择工具
llm_with_tools = llm.bind_tools(tools, tool_choice="auto")
# todo: 第三步:调用回复
query = "2+1等于多少?"
# query = '什么是机器学习?'
# 使用列表的方式来存储对话信息
messages = [HumanMessage(query)]
try:
# todo: 第一次调用
ai_msg = llm_with_tools.invoke(messages)
messages.append(ai_msg)
print(f"\n第一轮调用后结果:\n{messages}")
# todo: 处理工具调用
# 判断消息中是否有tool_calls,以判断工具是否被调用
if hasattr(ai_msg, "tool_calls") and ai_msg.tool_calls:
for tool_call in ai_msg.tool_calls:
# 基于工具名称获取对应的函数
func = {"add": add, "multiply": multiply}[tool_call["name"].lower()]
# 解析参数,并调用对应的函数【因为原始的函数使用了注解,现在就是一个被langchain封装后的方法,调用时需要使用invoke进行调用】
tool_result = func.invoke(tool_call["args"])
# 将工具调用结果添加到messages中,用于下一次调用
messages.append(ToolMessage(content=tool_result, tool_call_id=tool_call["id"]))
print(f"\n工具调用结果添加到messages后:\n{messages}")
# todo: 第二次调用,将工具结果传回模型以生成最终回答
final_response = llm_with_tools.invoke(messages)
print(f"\n最终模型响应:\n{final_response.content}")
else:
print("模型未生成工具调用,直接返回文本:")
print(ai_msg.content)
except Exception as e:
print(f"调用失败:{e}")