工具调用 (tool calling)
创作时间:
作者:
@小白创作中心
工具调用 (tool calling)
引用
CSDN
1.
https://m.blog.csdn.net/weixin_52002907/article/details/143918041
本文将详细介绍如何使用Mistral模型进行工具调用。通过具体的代码示例,展示如何创建工具、绑定模型、调用工具以及处理工具调用结果。文章还包含了在实际使用中遇到的问题及解决方案,适合AI开发者参考学习。
工具调用 (tool calling)
- 创建工具:通过@tool装饰器创建工具
- 工具绑定:工具需要连接到支持工具调用的模型
- 工具调用:模型可以决定是否使用工具并确保其响应符合工具的输入模式
- 工具调用的结果只生成相关参数,不会生成最终答案
使用模型的工具调用过程中遇到的一些问题
- 使用免费的大模型API
- 使用glm-4-flash模型
- 问题一:在使用工具调用函数.tool_calls时只能转化一个问题。例如What is 3 * 12? Also, what is 11 + 49?只能转化3 * 12的部分
- 问题二:在生成ToolMessages时会出现问题,以至于无法进行后续输出结果
- 使用mistral-tiny模型(可能是模型参数不够)
- 与glm-4-flash模型问题一一样,但ToolMessages正常,最终只能得到一个结果
- 使用mistral-large-latest模型
- 在最后输出结果出现服务器报错,(可能是使用免费额度的问题)
- 使用本地ollama平台部署的miatral模型
- 无法使用bind_tools
- 综合以上问题选择mistral-tiny模型来作为本篇笔记的模型
# 加载环境变量
import os
from dotenv import load_dotenv
load_dotenv()
print("MISTRAL_API_KEY:", os.getenv("MISTRAL_API_KEY"))
MISTRAL_API_KEY: *********************************
# 导入mistral模型
from langchain_mistralai import ChatMistralAI
# chat_model=ChatMistralAI(model="mistral-large-latest")
chat_model=ChatMistralAI(model="mistral-tiny")
chat_model.invoke("你好")
AIMessage(content='你好!欢迎来问我问题!我会尽力回答你的问题。', additional_kwargs={}, response_metadata={'token_usage': {'prompt_tokens': 6, 'total_tokens': 29, 'completion_tokens': 23}, 'model': 'mistral-tiny', 'finish_reason': 'stop'}, id='run-722b629f-09b8-42db-b41f-c612f03317fc-0', usage_metadata={'input_tokens': 6, 'output_tokens': 23, 'total_tokens': 29})
使用Pydantic类创建工具
from pydantic import BaseModel,Field
class add(BaseModel):
"""将两个数相加"""
a:int=Field(...,description="第一个数")
b:int=Field(...,description="第二个数")
class multiply(BaseModel):
"""将两个数相乘"""
a:int=Field(...,description="第一个数")
b:int=Field(...,description="第二个数")
tools=[add,multiply]
model_with_tools=chat_model.bind_tools(tools=tools)
query="3*12等于多少?"
model_with_tools.invoke(query)
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'jZIqBB1h8', 'type': 'function', 'function': {'name': 'multiply', 'arguments': '{"a": 3, "b": 12}'}}]}, response_metadata={'token_usage': {'prompt_tokens': 187, 'total_tokens': 213, 'completion_tokens': 26}, 'model': 'mistral-tiny', 'finish_reason': 'tool_calls'}, id='run-b31c7597-08f2-4a01-a226-bfc5e6c9afd4-0', tool_calls=[{'name': 'multiply', 'args': {'a': 3, 'b': 12}, 'id': 'jZIqBB1h8', 'type': 'tool_call'}], usage_metadata={'input_tokens': 187, 'output_tokens': 26, 'total_tokens': 213})
工具调用
query="3乘12等于多少,以及11加22等于多少?"
model_with_tools.invoke(query).tool_calls
[{'name': 'multiply',
'args': {'a': 3, 'b': 12},
'id': 'cGtT91ASZ',
'type': 'tool_call'}]
用解析器对结果进一步处理
from langchain_core.output_parsers import PydanticToolsParser
chain=model_with_tools | PydanticToolsParser(tools=tools)
chain.invoke(query)
[multiply(a=3, b=12)]
将工具输出传递给模型
- 工具调用的结果这是生成相应的参数并没有生成最终结果,需要再构建消息队列传递给模型才能生成最终结果
from langchain_core.tools import tool
@tool
def add(a:int,b:int)->int:
"""将两个数相加"""
return a+b
@tool
def multiply(a:int,b:int)->int:
"""将两个数相乘"""
return a*b
tools=[add,multiply]
model_with_tools=chat_model.bind_tools(tools=tools)
# 构建消息列表
from langchain_core.messages import HumanMessage
query="3乘12等于多少,以及11加22等于多少?"
messages=[HumanMessage(content=query)]
ai_message=model_with_tools.invoke(messages)
print(ai_message) #模型返回的全部结果
print(ai_message.tool_calls) #模型返回的工具调用
messages.append(ai_message)
print(messages)
content='' additional_kwargs={'tool_calls': [{'id': '7fbmjpuoQ', 'type': 'function', 'function': {'name': 'multiply', 'arguments': '{"a": 3, "b": 12}'}}]} response_metadata={'token_usage': {'prompt_tokens': 165, 'total_tokens': 191, 'completion_tokens': 26}, 'model': 'mistral-tiny', 'finish_reason': 'tool_calls'} id='run-82682fd1-9bcf-4578-8b2d-a2849f14050e-0' tool_calls=[{'name': 'multiply', 'args': {'a': 3, 'b': 12}, 'id': '7fbmjpuoQ', 'type': 'tool_call'}] usage_metadata={'input_tokens': 165, 'output_tokens': 26, 'total_tokens': 191}
[{'name': 'multiply', 'args': {'a': 3, 'b': 12}, 'id': '7fbmjpuoQ', 'type': 'tool_call'}]
[HumanMessage(content='3乘12等于多少,以及11加22等于多少?', additional_kwargs={}, response_metadata={}), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': '7fbmjpuoQ', 'type': 'function', 'function': {'name': 'multiply', 'arguments': '{"a": 3, "b": 12}'}}]}, response_metadata={'token_usage': {'prompt_tokens': 165, 'total_tokens': 191, 'completion_tokens': 26}, 'model': 'mistral-tiny', 'finish_reason': 'tool_calls'}, id='run-82682fd1-9bcf-4578-8b2d-a2849f14050e-0', tool_calls=[{'name': 'multiply', 'args': {'a': 3, 'b': 12}, 'id': '7fbmjpuoQ', 'type': 'tool_call'}], usage_metadata={'input_tokens': 165, 'output_tokens': 26, 'total_tokens': 191})]
# 将工具调用结果添加到消息列表中
for tool_call in ai_message.tool_calls:
selected_tool={ #从字典中选择对应的工具
"add":add, #加法工具,add对应用tool修饰过的函数(工具对象)
"multiply":multiply #乘法工具
}[tool_call["name"].lower()] #获取工具调用返回的名称并转化成小写,最后从定义的字典的获取对应的工具
tool_msg=selected_tool.invoke(tool_call) #执行工具调用,select_tool获取到的是工具对象可以使用invoke,返回ToolMessage对象
messages.append(tool_msg)
messages
[HumanMessage(content='3乘12等于多少,以及11加22等于多少?', additional_kwargs={}, response_metadata={}),
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': '7fbmjpuoQ', 'type': 'function', 'function': {'name': 'multiply', 'arguments': '{"a": 3, "b": 12}'}}]}, response_metadata={'token_usage': {'prompt_tokens': 165, 'total_tokens': 191, 'completion_tokens': 26}, 'model': 'mistral-tiny', 'finish_reason': 'tool_calls'}, id='run-82682fd1-9bcf-4578-8b2d-a2849f14050e-0', tool_calls=[{'name': 'multiply', 'args': {'a': 3, 'b': 12}, 'id': '7fbmjpuoQ', 'type': 'tool_call'}], usage_metadata={'input_tokens': 165, 'output_tokens': 26, 'total_tokens': 191}),
ToolMessage(content='36', name='multiply', tool_call_id='7fbmjpuoQ')]
# 将工具结果传递给模型计算出最后结果
model_with_tools.invoke(messages)
AIMessage(content='三乘十二等于三十六。\n\n[-1, {"name": "add", "arguments": {"a": 11, "b": 22}, "id": "526f7p3j6"}]', additional_kwargs={}, response_metadata={'token_usage': {'prompt_tokens': 220, 'total_tokens': 274, 'completion_tokens': 54}, 'model': 'mistral-tiny', 'finish_reason': 'stop'}, id='run-2dc03724-072c-4db8-bcd7-d1e5741312a4-0', usage_metadata={'input_tokens': 220, 'output_tokens': 54, 'total_tokens': 274})
热门推荐
如何适应高原反应?
信创产业深度解析:定义、规划、应用与未来展望
每天该吃多少盐?就要5克!
轮胎安全线怎么看?胎纹深度如何判断?3大方式检查轮胎是否需要更换
什么才是真正的自律?自律不是自虐,教你3大法宝实现真正自律!
楼上噪音太吵?教你如何选择合适的吸音棉
小学生如何提高400米跑步技巧(从正确的姿势到科学的训练)
网贷逾期6万怎么办?这份详细解决方案请收好
融资概念是什么
如何在日常生活中方便输入各种特殊符号的方法与技巧分享
工伤保险费用的报销范围包括哪些
致敬80后:一群了不起的奋斗者
冒充熟人诈骗来袭,你做好防范了吗?
办公室文员:完整的职位指南
钢笔前端如何拆卸
山西这条高铁要通车了,晚到10年,将打通太原入京第二高铁大通道
驾乘人员补充意外险和驾乘险区别
《修仙家族模拟器2》技能选择与法宝搭配攻略
学医有哪些要求
从国内外数据看疫苗变迁:Vero细胞疫苗占有率攀升,引领疫苗接种新风尚
怎样理财才能收益最大 7点关键要点必须掌握
异地办理身份证需要什么条件
化身“蜘蛛侠“,多方联动紧急救助八旬病弱老人
管理者应当具备的六大素质
如何用精准的语言描述一支笔:不同场景下的笔的描写技巧
计算机软考是否可以直接评定职称?
减轻公司债务负担的方法有哪些
《哪吒2之魔童闹海》:国漫崛起的新高度
GB/T 18356-2007贵州茅台酒执行标准内容
教育部学历证书电子注册备案表的申请流程是什么