LLM代码实现-Qwen(Function Calling)

简介

Function Calling 是一种让 Chat Completion 模型调用外部函数的能力,可以让模型不仅仅根据自身的数据库知识进行回答,而是可以额外挂载一个函数库,然后根据用户提问去函数库检索,按照实际需求调用外部函数并获取函数运行结果,再基于函数运行结果进行回答,或者是通过函数调用来调用工具。

Qwen 官方给出的 Function Calling 方法是基于 openai 接口的,这篇文章就从如何利用 Qwen 仿 OpenAI 接口开始写起。

OpenAI_API

在 Qwen 官方给出的代码中有一个 openai_api.py 脚本,可以在 _get_args() 函数中对参数进行配置后运行 (主要需要修改模型路径)。

def _get_args():parser = ArgumentParser()parser.add_argument("-c","--checkpoint-path",type=str,default="qwen/Qwen-1_8B-Chat",help="Checkpoint name or path, default to %(default)r",)parser.add_argument("--api-auth", help="API authentication credentials")parser.add_argument("--cpu-only", action="store_true", help="Run demo with CPU only")parser.add_argument("--server-port", type=int, default=8000, help="Demo server port.")parser.add_argument("--server-name",type=str,default="0.0.0.0",help="Demo server name. Default: 127.0.0.1, which is only visible from the local computer."" If you want other computers to access your server, use 0.0.0.0 instead.",)parser.add_argument("--disable-gc", action="store_true",help="Disable GC after each response generated.")args = parser.parse_args()return args

修改完成后运行:

python openai_api.py

接着可以运行以下代码以调用接口进行对话:

import openai
import jsonopenai.api_base = 'http://localhost:8000/v1'
openai.api_key = 'none'def call_qwen(messages):response = openai.ChatCompletion.create(model='Qwen', messages=messages)response = response.choices[0]['message']response = json.loads(json.dumps(response, ensure_ascii=False))print('input:', messages)print('output:', response)return responseif __name__ == '__main__':messages = [{'role': 'user', 'content': '你好'}]response = call_qwen(messages)

Function Calling

首先介绍一下 Function Calling 的具体流程。

  1. 使用用户查询和函数参数中定义的一组外部函数库。
  2. 模型可以选择调用任意外部函数;如果是这样,内容将是符合自定义架构的字符串化 JSON 对象(注意:模型可能会生成无效的 JSON 或幻觉参数)。
  3. 在代码中将字符串解析为 JSON,并使用提供的参数调用函数(如果存在)。
  4. 通过将函数响应追加为新消息来再次调用模型,并让模型将结果汇总返回给用户。

外部函数库

首先我们需要定义一个外部函数库,这个函数库是一个列表,可以添加多个函数,列表中每个函数都为 json 格式,每个函数格式固定,以下是一个关于控制开关灯光的函数例子。

functions = [{"name_for_human": "灯光控制","name_for_model": "contral","description_for_model": "灯光控制可以帮助用户开关灯"+ " Format the arguments as a JSON object.","parameters": [{"name": "switch","description": "用于控制灯的开关,若为True则为开灯,若为false则为关灯","required": True,"schema": {"type": "bool"},}],}
]# 各参数作用# "name_for_human":函数名字(对人类)
# "name_for_model":函数名字(对模型)
# "description_for_model":描述函数的作用,让模型能够判断什么时候调用这个函数
# "parameters":返回结果中的参数,该键对应的值为一个列表,可以返回多个参数
#     "name":参数的名字
#     "description":参数的描述,用于让模型判断这个参数填入什么
#     "required":这个参数是否是必要的
#     "schema":可以指定这个参数的数据类型

调用函数库方式如下,这里创建了一个 contral 函数假装调用了接口来进行开关灯操作:

import openai
import jsonopenai.api_base = "http://localhost:8006/v1"
openai.api_key = "none"def contral(response):if response.choices[0].message.function_call:result = eval(response.choices[0].message.function_call.arguments)switch = "开灯" if result["switch"] else "关灯"print(switch)def call_qwen(messages, functions=None):print(messages)if functions:response = openai.ChatCompletion.create(model="Qwen", messages=messages, functions=functions)else:response = openai.ChatCompletion.create(model="Qwen", messages=messages)print(response)result = response.choices[0].message.function_callif result:if result.name == "contral":contral(response)print(response.choices[0].message.content)return responseif __name__ == "__main__:functions = [{"name_for_human": "灯光控制","name_for_model": "contral","description_for_model": "灯光控制可以帮助用户开关灯"+ " Format the arguments as a JSON object.","parameters": [{"name": "switch","description": "用于控制灯的开关,若为True则为开灯,若为false则为关灯","required": True,"schema": {"type": "bool"},}],}]messages = [{"role": "user", "content": "帮我开一下灯"}]call_qwen(messages, functions)

返回结果如下:

# messages
[{'role': 'user', 'content': '帮我开一下灯'}]# response
{"model": "Qwen","object": "chat.completion","choices": [{"index": 0,"message": {"role": "assistant","content": "Thought: \u9700\u8981\u4f7f\u7528\u706f\u5149\u63a7\u5236API\u6765\u5b9e\u73b0\u5f00\u706f\u64cd\u4f5c","function_call": {"name": "contral","arguments": "{\"switch\": True}"}},"finish_reason": "function_call"}],"created": 1706839240
}# switch
开灯# response.choices[0].message.content(json 会导致"content"中的中文会变为Unicode,取出来后就是正常的)
Thought: 需要使用灯光控制API来实现开灯操作

Function Calling 是一种非常有用的功能,可以让Chat Completion模型更加灵活地应对各种场景比如自动发邮件、控制机械臂、上网搜索用户提问中的相关信息后回答,调用其他厂家的 api 接口……通过调用外部函数进行输出格式化,可以让Chat Completion模型更加贴合实际需求,并提供更加优质、高效、个性化的服务。怎么用就取决于大家的想象力了。

在这里插入图片描述

大模型&AI产品经理如何学习

求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。

1.学习路线图

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

在这里插入图片描述

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方图片前往获取

3.技术文档和电子书

这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
在这里插入图片描述

4.LLM面试题和面经合集

这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

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

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

相关文章

Unknown command: “create-react-app“

在创建react项目时出现报错" Unknown command: "create-react-app" " 解决方法: 配置全局变量," win r " 打开cmd窗口,输入下列命令,回车等待结束即可: npx create-react-app my-pro…

Docker部署项目时的服务端口设置——给容器添加新端口映射

Docker给容器添加新端口映射 1 Docker安装Ubuntu22.042 创建新容器3 给容器添加端口映射3.1 查看运行的容器3.2 查看容器挂载目录3.3 停止容器3.4 停止docker服务3.5 进入容器挂载目录3.6 修改config.v2.json文件3.7 修改hostconfig.json文件3.8 启动docker3.9 启动容器 4 端口…

七款最佳的渗透测试工具(非常详细)零基础入门到精通,收藏这一篇就够了

渗透测试工具是模拟对计算机系统、网络或 Web 应用程序的网络攻击的软件应用程序,它们的作用是在实际攻击者之前发现安全漏洞。它们可以作为系统的压力测试,揭示哪些区域可能会受到真正的威胁。 本文我将介绍七款最佳的渗透测试工具。 1 Kali Linux K…

【数据结构入门】排序算法之插入排序与选择排序

目录 前言 一、排序的概念及运用 1.排序的概念 2.排序的运用 3.常见排序算法 二、插入排序与选择排序 2.1插入排序 2.1.1直接插入排序 1)基本思想 2)具体步骤 3)算法特性 4)算法实现 2.1.2希尔排序 1) 基本思想 2&…

【前端面试】leetcode树javascript

写一个树 // 定义二叉树节点 function TreeNode(val, left, right) {this.val = (val === undefined ? 0 : val)this.left = (left === undefined ? null : left)this.right = (right === undefined ? null : right) }// 示例使用 const root = new TreeNode(1,new TreeNod…

Web APIs第一天

第一天&#xff1a;DOM获取元素&#xff0c;获取元素&#xff0c;修改属性 声明新变量&#xff0c;一般默认const&#xff0c;如果变量的值不变&#xff0c;则使用const。如果变量的值变化&#xff0c;则使用let。var已经被淘汰了。 <script>const arr [red, pink]arr.…

怎样在公司将手机屏幕(远程)投屏到家里的大电视上?

我不住家里&#xff0c;前几次回去都会替老爸老妈清理手机。这两个星期没空回去&#xff0c;老爸吐槽手机用几天就又卡了&#xff0c;其实就是清理一些手机缓存的问题。 我说我远程控制他的手机&#xff0c;给他清理一下。他一听“控制”就不喜欢&#xff0c;说我大了&#xf…

3600关成语填字APP游戏ACCESS\EXCEL数据库

成语类的APP游戏在最近一两年内非常的火爆&#xff0c;其主要原因是几乎所有中国人都能够冲个几十上百关&#xff0c;学习和趣味共享。看图猜成语类的数据之前已经弄到过很多&#xff0c;今天这份成语填字的倒是头一份。 该数据做成的APP效果如下&#xff1a; 数据以\符号分隔…

Java JVM 垃圾回收算法详解

Java 虚拟机&#xff08;JVM&#xff09;是运行 Java 应用程序的核心&#xff0c;它的垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制是 JVM 中非常重要的一个部分。垃圾回收的主要任务是自动管理内存&#xff0c;回收那些不再被使用的对象&#xff0c;从而释放内…

【机器学习】机器学习引领未来:赋能精准高效的图像识别技术革新

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 机器学习基础与图像识别原理&#x1f341;机器学习概述&#xff1a;监督学习、无监督学习与强化学…

Ubuntu系统+宝塔面板部署Frp内网穿透服务

一、搭建目的 上次在局域网中搭建了自己的个人网盘之后&#xff0c;上传文件、照片都很方便&#xff0c;但是只能限制在内网中访问&#xff01;所以这次再搭建一个内网穿透服务器&#xff0c;这样不管在哪里都能访问到家里的云盘&#xff01; 二、内网穿透Frp是什么&#xff1…

【超详细】Linux开发环境搭建指南 | Ubuntu

文章目录 虚拟机安装对比Virtual Box 下载ubuntu 操作系统下载Virtual Box 安装安装ubuntu设置中文语言共享文件夹设置添加输入法安装步骤&#xff0c;参考官方教程 安装 vscode解决主机不能通过ssh连接宿主机网络连接几种网络连接区别主机和宿主机相互 ping通 网络代理 虚拟机…

智能未来:低代码与AI如何重塑企业应用开发

引言 在当今瞬息万变的商业环境中&#xff0c;企业面临着前所未有的挑战与机遇。数字化转型已经成为各行各业的必然趋势&#xff0c;而在这一过程中&#xff0c;应用开发的效率与智能化程度成为企业竞争力的重要衡量标准。传统的开发模式往往需要大量的时间和资源&#xff0c;而…

图像边缘检测技术详解:利用OpenCV实现Sobel算子

图像边缘检测技术详解&#xff1a;利用OpenCV实现Sobel算子 前言Sobel算子的原理代码演示结果展示结语 前言 在数字图像处理的广阔领域中&#xff0c;边缘检测技术扮演着至关重要的角色。无论是在科学研究、工业自动化&#xff0c;还是在日常生活中的智能设备中&#xff0c;我们…

《大道平渊》· 廿壹 —— 杀心篇:何谓 “杀心”?本质上,就是寻求杀心的一个过程。

《大道平渊》 "行有不得&#xff0c;反求诸己。" ——《论语 学而》 指的是遇事遭困&#xff0c;须在自身寻因&#xff0c;而非怨天尤人&#xff0c;一味地归咎于外因。 凡事向内求也&#xff0c;多多自省&#xff0c;提高自身的修养和能力&#xff0c;取得成功。…

Hadoop 下载

下载法一&#xff1a;官方下载 hadoop官网 1.选择要下载的版本&#xff0c;这里我以3.4.0为例进行说明&#xff1b; 2.跳转后&#xff0c;选择对应系统架构的&#xff0c;进行下载&#xff1b; 下载法二&#xff1a;国内镜像源下载 1.阿里云 这里我以mac m1为案例&#x…

Netlify 为静态站点部署 Waline 评论系统

目录 1 准备工作2 简介2.1 Netlify2.2 Waline2.3 Leancloud 3 开始搭建3.1 Fork 仓库3.2 设置 Leancloud3.3 部署 Netlify3.4 查看评论系统 从我建成个人网站以来&#xff0c;一个月了&#xff0c;竟然还没配置过评论系统&#xff0c;一直用的别人的 awa。 那么今天就稍微研究…

源代码为啥要进行加密?怎么给源代码进行加密?

在当今高度数字化的世界里&#xff0c;软件开发已经成为企业竞争力的重要组成部分。源代码作为软件的核心资产&#xff0c;包含了企业的核心技术和商业机密&#xff0c;因此其安全性至关重要。然而&#xff0c;源代码泄露的风险始终存在&#xff0c;无论是由于内部人员的不当行…

神仙公司名单(北京篇)

欢迎来到小落科技每日分享频道 大家好&#xff0c;秋招已经火热进行中了&#xff0c;不知道大家准备得怎么样了&#xff1f;特别是咱们25届的小伙伴们&#xff0c;有没有找到心仪的目标&#xff1f; 想必大家最近和我一样&#xff0c;忙着在各种招聘平台上搜罗信息&#xff0c…

云计算实训41——部署project_exam_system项目(续)

# 创建脚本&#xff0c;可以在java环境中运行任何的jar包或者war包#!/bin/bash/usr/local/jdk/bin/java -jar /java/src/*.?ar一、思路分析 &#xff08;1&#xff09;nginx 1、下载镜像&#xff0c;将本地的dist项目的目录挂载在容器的/usr/share/nginx/html/ 2、启动容器 …