当前位置: 首页 > news >正文

Function Calling:让大模型学会使用工具

Function Calling:让大模型学会使用工具

其实从实际来讲,Function Calling并不是让大模型自己调用工具,而是大模型告诉用户自己需要调用哪些工具,然后再由程序去调用工具。

这么做有什么好处呢?模型的知识是有限的,为了让模型的回答更精准,我们需要提供问题相关的上下文,上下文与问题关联性越大,模型的回答就越准确,而Function Calling可以给大模型提供精准的上下文。从另外一个角度讲,大模型本身其实只能回答用户问题,但是引入Function Calling可以拓展模型的能力边界,理想情况下模型的能力可以与程序所具有的能力一样。

Function Calling的框架流程

  1. 用户提问
  2. 模型生成需要使用的工具集
  3. 调用工具并整合结果
  4. 返回工具调用结果给大模型并输出最终结果

python 编码实现

from openai import OpenAI
import json
"""
1. 初始化 OpenAI 客户端
2. 定义一个函数,向模型发送消息
3. 定义工具函数
4. 定义模型可以调用的工具
5. 向模型发送用户消息
6. 处理模型的响应,包括工具调用
7. 根据工具调用调用相应的函数
8. 将结果发送回模型
9. 打印模型的最终响应
"""client = OpenAI(api_key="sk-*********************", #替换成你自己的APIkeybase_url="https://api.deepseek.com",
)def send_messages(messages):response = client.chat.completions.create(model="deepseek-chat",messages=messages,tools=tools)return response.choices[0].messagedef get_weather(location):# 模拟获取天气信息的函数# 实际应用中可以调用天气API获取实时数据return f"The weather in {location} is sunny with a temperature of 40℃."tools = [{"type": "function","function": {"name": "get_weather","description": "Get weather of an location, the user shoud supply a location first","parameters": {"type": "object","properties": {"location": {"type": "string","description": "The city and state, e.g. San Francisco, CA",}},"required": ["location"]},}},
]messages = [{"role": "user", "content": "How's the weather in Hangzhou?"}]
message = send_messages(messages)   # Send the initial user message 模型判断是否需要调用工具,需要调用工具时会返回tool_calls
messages.append(message)tool = message.tool_calls[0]
if tool.function.name == "get_weather":location = json.loads(tool.function.arguments)content = get_weather(location)messages.append({"role": "tool", "tool_call_id": tool.id, "content": content})message = send_messages(messages)print(f"Model>\t {message.content}")
http://www.dtcms.com/a/296680.html

相关文章:

  • es0102---语法格式、数据类型、整合springboot、创建库、创建映射、新增数据、自定义查询
  • tensorflow搭建神经网络
  • SQL基础⑩ | 数据类型篇
  • 哈希表模拟实现
  • Java学习日记_廖万忠
  • Spring Cloud Alibaba Sentinel 源码阅读之流量控制算法
  • C++编程基础四大件
  • Bright Data 实战指南:从竞品数据抓取到电商策略优化全流程
  • 探秘 VSAR软件:CAN报文转DBC信号的便捷工具
  • 力扣189:轮转数组
  • 5 个适合创意创作的网站,灵感不设限
  • 基于markdown封装的前端文档编辑工具,markdown.js的解析与应用
  • 蚁群优化算法(ACO)求解旅行商问题(TSP)
  • 碳油 PCB 技术解析:高精度制造与多场景应用实践
  • Python爬虫案例:Scrapy+XPath解析当当网网页结构
  • Spring Boot 3整合Spring AI实战:9轮面试对话解析AI应用开发
  • FreeRTOS—计数型信号量
  • 亚马逊Prime Day变革:精细化运营时代的号角
  • 基础05-Java控制流程:掌握if-else、switch和循环语句
  • 使用adb 发送广播 动态改变app内的值
  • 【PyTorch】图像二分类项目-部署
  • 【数字IC验证学习------- SOC 验证 和 IP验证和形式验证的区别】
  • NOTEPAD!NPCommand函数分析之comdlg32!GetSaveFileNameW--windows记事本源代码分析
  • 暑假集训篇之并发处理①练习题
  • prometheus监控k8s的metric详解-01-apiserver部分-05-其他
  • 局域网TCP通过组播放地址rtp推流和拉流实现实时喊话
  • 猎板碳油 PCB和普通PCB的区别
  • 【OpenCV实现多图像拼接】
  • kafka消费者组消费进度(Lag)深入理解
  • Redis--哨兵机制详解