详解LLM大模型是如何理解并使用 tools ?

前文

大家肯定对使用大模型的函数回调或者说 Tools 已经耳熟能详了,那么他们具体内部是如何运作的呢,本文就此事会详细给大家介绍具体的细节。

tools

首先是大家最熟悉的环节,定义两个 tool 的具体实现,其实就是两个函数:

  • get_current_weather:基于给定的城市获取天气
  • get_current_time:查询当前时间

我这里为了演示说明,所以只是简单实现了功能,里面的逻辑并不复杂,大家可以看下面的代码,然后将这两个函数的具体功能描述以及对参数的定义使用 json 格式存放在列表 tools 中。tools 中的这些对于函数的功能描述或者参数的定义描述等等信息后面会传入到大模型中,大模型会解析改写成它能理解的 prompt 。所以这里按照固定的格式写 tools ,就是为了源代码中能够解析出相关的内容。具体可以看继续后面。

pythondef get_current_weather(location):if '上海' in location.lower():return json.dumps({'location': '上海', 'temperature': '10度'}, ensure_ascii=False)elif '杭州' in location.lower():return json.dumps({'location': '杭州', 'temperature': '12度'}, ensure_ascii=False)else:return json.dumps({'location': location, 'temperature': 'unknown'}, ensure_ascii=False)def get_current_time():current_datetime = datetime.now()formatted_time = current_datetime.strftime('%Y-%m-%d %H:%M:%S')return f"当前时间:{formatted_time}。"tools = [{'name': 'get_current_weather','description': '基于给定的城市获取天气','parameters': {'type': 'object','properties': {'location': {'type': 'string','description': '城市名称',},},'required': ['location'],},},{"name": "get_current_time","description": "获取当前时间","parameters": {}}
]

查询天气

首先演示查询天气的 tool ,此时我们先给大模型定义一个 system 级别的角色定义,将其设定为一个可以使用工具的帮手,可以从我在 tools 定义的两个工具中挑出合适的工具完成任务。理论上我提问“上海天气如何”,然后大模型能够自动挑选出 get_current_weather 这个工具来完成天气查询任务。我这里使用的是 qwen-max 模型,大家可以换成自己的,大模型选用不是本文重点,大家不必特别关心。

整个过程分为以下几步:

  1. 给大模型传入问题 上海天气如何
  2. 大模型自己从 tools 中挑选可以解决用户问题的工具 get_current_weather
  3. 使用工具 get_current_weather 和大模型提取出来的参数 上海 获取天气情况
  4. 将天气情况传给大模型
  5. 大模型结合用户的问题,以及得到的天气情况,总结返回最后的结果。

具体第 2 和 3 步是如何实现的呢,其实大模型在拿到我们定义的存放函数信息的 json 格式的 tools 之后,将里面所有的 tools 内容拼接成了一个很长的 prompt,通过 debug ,我这里拿到了使用 qwen-max 的中间结果如下,可以看出其实就是将我们最原始的 system 定义的内容填充入了 tools 的内容供大模型理解,并按照固定的参数定义从用户的问题中提取参数,这些对原有的对话信息进行修改的过程普通用户是没有感觉的,也不会改变用户真实的对话信息,因为已经封装入了 api 中直接供大家使用了。

csharp[Message({'role': 'system', 'content': '你是一个有用的帮手,可以使用合适的工具解决我的我问题
# 工具
## 你拥有如下工具:
### get_current_weather
get_current_weather: 基于给定的城市获取天气 输入参数:{"type": "object", "properties": {"location": {"type": "string", "description": "城市名称"}}, "required": ["location"]}
### get_current_time
get_current_time: 获取当前时间 输入参数:{}
## 你可以在回复中插入零次、一次或多次以下命令以调用工具:
✿FUNCTION✿: 工具名称,必须是[get_current_weather,get_current_time]之一。
✿ARGS✿: 工具输入
✿RESULT✿: 工具结果,需将图片用![](url)渲染出来。
✿RETURN✿: 根据工具结果进行回复'}),Message({'role': 'user', 'content': '上海天气如何'})]

代码如下:

inidef get_weather():llm = get_chat_model({'model': 'qwen-max',  'model_server': 'dashscope', 'api_key': 'sk-c69985b9a3c94cd5a56f8cd003a3cf08'})messages = [{'role': 'system', 'content': "你是一个有用的帮手,可以使用合适的工具解决我的我问题"}, {'role': 'user', 'content': "上海天气如何"}]response = llm.chat(messages=messages, functions=tools, stream=False)print(f'# Assistant 回复 1:\n{response}')messages.extend(response)if messages:last_response = messages[-1]if last_response.get('function_call', None):function_name = last_response['function_call']['name']if function_name == 'get_current_weather':function_args = json.loads(last_response['function_call']['arguments'])function_response = get_current_weather(function_args.get('location'))print(f'# Function 回复:\n{function_response}')messages.append({'role': 'function', 'name': function_name, 'content': function_response, })print(f'# All messages:\n {messages}')response = llm.chat(messages=messages,  functions=tools, stream=False)print(f'# Assistant 回复 2:{response}')

日志打印:

css# Assistant 回复 1:[{'role': 'assistant', 'content': '', 'function_call': {'name': 'get_current_weather', 'arguments': '{"location": "上海"}'}}]# Function 回复:{"location": "上海", "temperature": "10度"}# All messages:[{'role': 'system', 'content': '你是一个有用的帮手,可以使用合适的工具解决我的我问题'},
{'role': 'user', 'content': '上海天气如何'},
{'role': 'assistant', 'content': '', 'function_call': {'name': 'get_current_weather', 'arguments': '{"location": "上海"}'}},
{'role': 'function', 'name': 'get_current_weather', 'content': '{"location": "上海", "temperature": "10度"}'}]# Assistant 回复 2:[{'role': 'assistant', 'content': '上海现在的天气是10度。'}]

查询时间

相信大家看了上面的解释已经对整个内部的细节有了一个新的认识,这里我在简单举例,让大模型自动挑选 tools 中的工具完成查看时间的任务。过程和上面一样,不再具体赘述。

大模型结合 tools 改写的 prompt 如下:

vbnet[Message({'role': 'system', 'content': '你是一个有用的帮手,可以使用合适的工具解决我的我问题# 工具## 你拥有如下工具:### get_current_weatherget_current_weather: 基于给定的城市获取天气 输入参数:{"type": "object", "properties": {"location": {"type": "string", "description": "城市名称"}}, "required": ["location"]}### get_current_timeget_current_time: 获取当前时间 输入参数:{}## 你可以在回复中插入零次、一次或多次以下命令以调用工具:✿FUNCTION✿: 工具名称,必须是[get_current_weather,get_current_time]之一。
✿ARGS✿: 工具输入
✿RESULT✿: 工具结果,需将图片用![转存失败,建议直接上传图片文件](<转存失败,建议直接上传图片文件 url>)渲染出来。
✿RETURN✿: 根据工具结果进行回复'}),Message({'role': 'user', 'content': '当前时间几点了'})]

代码如下:

inidef get_time():llm = get_chat_model({'model': 'qwen-max',  'model_server': 'dashscope', 'api_key': '你的key'})messages = [{'role': 'system', 'content': "你是一个有用的帮手,可以使用合适的工具解决我的我问题"}, {'role': 'user', 'content': "当前时间几点了"}]response = llm.chat(messages=messages, functions=tools, stream=False)print(f'# Assistant 回复 1:\n{response}')messages.extend(response)if messages:last_response = messages[-1]if last_response.get('function_call', None):function_name = last_response['function_call']['name']if function_name == 'get_current_time':function_response = get_current_time()print(f'# Function 回复:\n{function_response}')messages.append({'role': 'function', 'name': function_name, 'content': function_response, })print(f'# All messages:\n {messages}')response = llm.chat(messages=messages,  functions=tools, stream=False)print(f'# Assistant 回复 2:{response}')

日志打印:

bash# Assistant 回复 1:[{'role': 'assistant', 'content': '', 'function_call': {'name': 'get_current_time', 'arguments': '{}'}}]# Function 回复:当前时间:2024-06-12 19:00:48。# All messages:[{'role': 'system', 'content': '你是一个有用的帮手,可以使用合适的工具解决我的我问题'},
{'role': 'user', 'content': '当前时间几点了'},
{'role': 'assistant', 'content': '', 'function_call': {'name': 'get_current_time', 'arguments': '{}'}},
{'role': 'function', 'name': 'get_current_time', 'content': '当前时间:2024-06-12 19:00:48。'}]# Assistant 回复 2:[{'role': 'assistant', 'content': '当前时间是2024年6月12日19点00分48秒。'}]

总结

所以从上面的例子可以看出来,本质上大模型理解 tools 还是在拼写 prompt ,我们如果不使用 api ,直接自己拼写可以使用的函数信息,其实也是可以实现上述的功能。

如何系统的去学习AI大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
      - L1.4.1 知识大模型
      - L1.4.2 生产大模型
      - L1.4.3 模型工程方法论
      - L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
      - L2.1.1 OpenAI API接口
      - L2.1.2 Python接口接入
      - L2.1.3 BOT工具类框架
      - L2.1.4 代码示例
    • L2.2 Prompt框架
      - L2.2.1 什么是Prompt
      - L2.2.2 Prompt框架应用现状
      - L2.2.3 基于GPTAS的Prompt框架
      - L2.2.4 Prompt框架与Thought
      - L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
      - L2.3.1 流水线工程的概念
      - L2.3.2 流水线工程的优点
      - L2.3.3 流水线工程的应用
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
      - L3.1.1 Agent模型框架的设计理念
      - L3.1.2 Agent模型框架的核心组件
      - L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
      - L3.2.1 MetaGPT的基本概念
      - L3.2.2 MetaGPT的工作原理
      - L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
      - L3.3.1 ChatGLM的特点
      - L3.3.2 ChatGLM的开发环境
      - L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
      - L3.4.1 LLAMA的特点
      - L3.4.2 LLAMA的开发环境
      - L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

学习计划:

  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的所有 ⚡️ 大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

全套 《LLM大模型入门+进阶学习资源包↓↓↓ 获取~

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言:sprintf与snprintf

C语言提供了强大的格式化输出的接口&#xff0c;可以输出到不同的文件或者字符串等&#xff0c;以sprintf和snprintf为例介绍一下 sprintf 格式化输出到字符串 函数签名 int sprintf(char *str, const char *format, ...);与printf相比就是多了前面的char*参数&#xff0c;…

PointNet数据预处理+网络训练

PointNet数据预处理网络训练 数据预处理分类网络的训练分割网络训练分类和分割的结果 数据预处理 数据预处理&#xff0c;这里仅介绍一个shapenetdataset&#xff1b; class ShapeNetDataset(data.Dataset):def __init__(self,root,npoints2500,classificationFalse,class_ch…

前端应熟知的各种宽度高度

目录 一、window对象- 浏览器对象模型 二、Document对象-文档对象模型 前端做项目时经常需要使用到各种宽度高度&#xff0c;可以从两个地方获得这些数据。 一、window对象- 浏览器对象模型 浏览器对象模型 (BOM) 使 JavaScript 有能力与浏览器"对话"。 所有浏览…

动态图形设计:创造视觉运动的艺术

什么是动态设计&#xff1f;动态设计是一个设计领域&#xff0c;指在用户界面中使用动态效果的设计。简单地说是为了移动用户界面上的元素而设计的。良好的动态设计可以吸引用户的注意&#xff0c;提高用户体验和满意度。动态设计也是界面设计与动态设计的结合&#xff0c;将设…

无人机螺旋桨理论教学培训课程

本文档为一份详细的关于TYTO机器人公司提供的电机和螺旋桨理论及其实验操作的指南。指南首先概述了材料、实验目标以及实验的介绍部分&#xff0c;随后详细阐述了理论问题、实验步骤和附录内容。实验目的在于通过实际测试来测量和理解不同螺旋桨参数对无人机性能的影响&#xf…

上海亚商投顾:沪指5连阴 工业母机概念逆势走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数今日继续调整&#xff0c;沪指午后一度跌近1%&#xff0c;随后探底回升跌幅收窄&#xff0c;创业板指…

如何确保消息不被重复消费

一、重复消费问题出现的原因 导致重复消费的原因可能出现在生产者&#xff0c;也可能出现在 MQ 或 消费者。这里说的重复消费问题是指同一个数据被执行了两次&#xff0c;不单单指 MQ 中一条消息被消费了两次&#xff0c;也可能是 MQ 中存在两条一模一样的消费。 生产者&…

基于Python的求职招聘管理系统【附源码】

摘 要 随着互联网技术的不断发展&#xff0c;人类的生活已经逐渐离不开网络了&#xff0c;在未来的社会中&#xff0c;人类的生活与工作都离不开数字化、网络化、电子化与虚拟化的数字技术。从互联网的发展历史、当前的应用现状和发展趋势来看&#xff0c;我们完全可以肯定&…

金融企业数据跨境流动的核心需求是什么?如何才能落地?

在金融行业&#xff0c;涉及到的数据跨境流动的场景多种多样&#xff0c;主要涉及到金融机构的跨国经营、全球贸易以及服务贸易等多个方面&#xff1a; 企业跨国经营&#xff1a;当金融机构进行跨国经营时&#xff0c;如银行在海外设立分支机构或进行跨境投资&#xff0c;会涉及…

408数据结构-图的应用1-最小生成树 自学知识点整理

前置知识&#xff1a;图的遍历 图的应用是408初试历年考查的重点。不过一般而言&#xff0c;这部分内容直接以算法设计题形式考查的可能性极小&#xff0c;更多的是结合图的实例来考查算法的具体操作过程&#xff0c;要求掌握的是手推模拟给定图的各个算法执行过程。此外&#…

说点智驾领域的实话!感知|定位|规划控制|就业……

你们有没有一种感觉&#xff0c;近几年自动驾驶技术栈迭代太快&#xff0c;自己稍不留神就与当下主流技术产生脱节了。 其实说实话&#xff0c;并非只有你如此&#xff0c;行业内的工程师都有类似感受。 智能驾驶行业交流群&#xff1a;点击进 分享几个我们最近聊天中的几位朋…

【动态内存】详解

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【Git】版本控制器的方式:SVN集中式版本控制工具和Git分布式版本控制工具

一、应用场景 二、版本控制器的方式 三、SVN 集中式版本控制工具 四、Git 分布式版本控制工具 五、Git工作流程 一、应用场景 Git 在开发过程中提供了多种应用场景&#xff0c;帮助开发团队高效地管理代码、协同工作&#xff0c;并保证代码质量。以下是一些具体应用场景和相应…

Rocky Linux设置静态IP

[connection] idens160 uuidcd246f67-c929-362a-809d-f1b44ddc5d25 typeethernet autoconnect-priority-999 interface-nameens160 timestamp1719094243[ethernet][ipv4] ## 在IPV4下面修改如下内容 methodmanual address192.…

每日一题——Python实现PAT乙级1030 完美数列(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 初次尝试 再次尝试 代码结构 时间复杂度分析 空间复杂度分析 总结 我要更强 时…

【OpenCV 图像处理 Python版】图像处理的基本操作

文章目录 1.图像的 IO 操作1.1 图像读取 imread1.2 图像显示1.2.1 opencv 方式1.2.2 matplotlib 方式 1.3 图像保存 imwrite 2.绘制几何图形1. 绘制直线2. 绘制矩形3. 绘制圆形4. 绘制多边形5. 添加文字 3.获取并修改图像中的像素点3.1 获取像素值3.2 修改像素值3.3 获取和修改…

零基础想学编程,选择哪一门语言更好就业?(非常详细)零基础入门到精通,收藏这一篇就够了_c#就业方向

编程语言的用途广泛&#xff0c;它们各自在不同的领域和应用场景中发挥着重要作用。 零基础初学者在选择编程语言时&#xff0c;可以从就业方向入手选择。 【一一帮助安全学习&#xff0c;所有资源获取处一一】 ①网络安全学习路线 ②20份渗透测试电子书 ③安全攻防357页笔记 …

Maven高级理解属性

属性 在这一章节内容中&#xff0c;我们将学习两个内容&#xff0c;分别是 属性版本管理 属性中会继续解决分模块开发项目存在的问题&#xff0c;版本管理主要是认识下当前主流的版本定义方式。 4.1 属性 4.1.1 问题分析 讲解内容之前&#xff0c;我们还是先来分析问题: …

pdf压缩,pdf压缩在线,pdf压缩在线网页版

当我们遇到PDF文件过大&#xff0c;需要压缩其容量大小时&#xff0c;通常是为了更方便地传输、存储或分享这些文件。PDF文件的大小可能因其包含的图像、字体等元素的数量和质量而有所不同。下面&#xff0c;我们将详细介绍压缩PDF容量大小的方法&#xff0c;帮助您轻松实现文件…

Vite打包速度为什么比webpack快,打包的优劣势在哪里?

大家都有被webpack打包速度搞崩溃的时候&#xff0c;修改一处地方&#xff0c;想预览效果&#xff0c;要等上半天。 Vite比Webpack快的原因 ESM&#xff08;ES Module&#xff09;原生支持&#xff1a; Vite基于ESM构建&#xff0c;利用浏览器原生支持的ESM模块加载方式&…