开源模型应用落地-chatglm3-6b-function call-入门篇(六)

news2024/11/26 13:27:57

一、前言

    每个模型都有自己的限制,有些情况下它们无法满足复杂的业务需求。但是,可以通过一个外置函数的方式,例如:"Function Call",让开发者能够更加灵活地利用大型语言模型,帮助开发者在特定场景下解决问题。


二、术语

2.1、Function Call

     Function Call 是一项强大的功能,它允许开发者向模型提供不同的函数来执行特定的任务,根据用户的输入和要求。这些函数可以接受输入参数,并根据当前的任务提供相关的输出。


三、前置条件

3.1. windows or linux操作系统均可

3.2. 下载chatglm3-6b模型

从huggingface下载:https://huggingface.co/THUDM/chatglm3-6b/tree/main

从魔搭下载:魔搭社区汇聚各领域最先进的机器学习模型,提供模型探索体验、推理、训练、部署和应用的一站式服务。https://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/fileshttps://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/files

 3.3. 创建虚拟环境&安装依赖

conda create --name chatglm3 python=3.10
conda activate chatglm3
pip install protobuf transformers==4.30.2 cpm_kernels torch>=2.0 sentencepiece accelerate

四、技术实现

# -*-  coding = utf-8 -*-
import traceback

from transformers import AutoTokenizer, AutoModelForCausalLM

modelPath = "/model/chatglm3-6b"

def get_weather(region):
    low_region = region.lower()
    if 'guangzhou' == low_region:
        return '21 ~ 28℃ 多云 无持续风向<3级'
    elif 'shenzhen' == low_region:
        return '22 ~ 28℃ 晴 西南风3级'
    else:
        return '6 ~ 18℃ 晴 北风4级'


funcList = {
    "weather": get_weather
}

def chat(model, tokenizer, message, history, system):
    messages = []
    if system is not None:
        messages.append(system)

    if history is not None:
        for his in history:
            user, assistant = his
            messages.append({"role": "user", "content": user})
            messages.append({"role": "assistant", 'metadata': '', "content": assistant})

    print(messages)
    try:
        response = model.chat(tokenizer, message, messages, max_length=2048, top_p=0.9, temperature=0.45, repetition_penalty=1.1, do_sample=True)
        return response

    except Exception:
        traceback.print_exc()


def loadTokenizer():
    tokenizer = AutoTokenizer.from_pretrained(modelPath, use_fast=False, trust_remote_code=True)
    return tokenizer


def loadModel():
    model = AutoModelForCausalLM.from_pretrained(modelPath, device_map="auto", trust_remote_code=True).cuda()
    model = model.eval()
    # print(model)
    return model


def main():
    model = loadModel()
    tokenizer = loadTokenizer()

    message = "广州今天的天气如何?"
    history = []

    tools = [
        {'name': 'weather', 'description': '获取指定地区实时天气',
         'parameters':
             {
                 'type': 'object',
                 'properties':
                     {'region':
                         {
                             'description': '待查询天气的区域'
                         }
                     },
                 'required': []
             }
         }
    ]

    system = {
        "role": "system",
        "content": "Answer the following questions as best as you can. You have access to the following tools:",
        "tools": tools
    }

    response,_ = chat(model, tokenizer, message, history, system)

    print(response)

    if 'name' not in response:
        print('本地方法名称没返回!')

    if 'parameters' not in response:
        print('本地方法参数没返回!')

    func_name = response['name']
    parameters = response['parameters']

    if 'region' not in parameters:
        print('地区参数没返回!')

    region = parameters['region']

    print(fun, region)

    if func_name in funcList:
        func = funcList[func_name]
        result = func(region)
        print(result)
    else:
        print(f'{func_name}方法不存在!')


if __name__ == "__main__":
    main()

调用结果:


五、附带说明

5.1. 流程说明

1. 设置本地函数(实际业务可以是调第三方的API、查询数据库、查询缓存等逻辑)

def get_weather(region):
    low_region = region.lower()
    if 'guangzhou' == low_region:
        return '21 ~ 28℃ 多云 无持续风向<3级'
    elif 'shenzhen' == low_region:
        return '22 ~ 28℃ 晴 西南风3级'
    else:
        return '6 ~ 18℃ 晴 北风4级'

2. 设置本地函数列表

funcList = {
    "weather": get_weather
}

示例只有一个本地函数,实际可以有N个

3. 设置本地函数的描述

tools = [
        {'name': 'weather', 'description': '获取指定地区实时天气',
         'parameters':
             {
                 'type': 'object',
                 'properties':
                     {'region':
                         {
                             'description': '待查询天气的区域'
                         }
                     },
                 'required': []
             }
         }
    ]

4. 在System Prompt中,指定可使用的本地函数库

 system = {
        "role": "system",
        "content": "Answer the following questions as best as you can. You have access to the following tools:",
        "tools": tools
    }

5. 模型调用,获取本地函数的方法名和参数列表

response,_ = chat(model, tokenizer, message, history, system)

print(response)
if 'name' not in response:
    print('本地方法名称没返回!')

if 'parameters' not in response:
    print('本地方法参数没返回!')

func_name = response['name']
parameters = response['parameters']

if 'region' not in parameters:
    print('地区参数没返回!')

region = parameters['region']

6. 本地函数调用

if func_name in funcList:
    func = funcList[func_name]
    result = func(region)
    print(result)
else:
    print(f'{func_name}方法不存在!')

7. 再次调用模型,对本地调用结果进行汇总加工处理(此处代码省略)

5.2. 优化地方

1. ChatGLM3推理返回的本地函数参数是“Guangzhou”,而Prompt提示语是:“广州今天的天气如何?”。两者之间是存在信息差,为此,可以优化的地方是:

    # 修改模型参数和System Prompt,让模型更准确返回我们所需要的格式

    # 在本地函数中,去判断输入的语种,当输入是中文的时候,可以转化成拼音或英文

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

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

相关文章

《QT实用小工具·十九》回车跳转到不同的编辑框

1、概述 源码放在文章末尾 该项目实现通过回车键让光标从一个编辑框跳转到另一个编辑框&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget>namespace Ui { class Widget; }class Widget : p…

【Nacos】Nacos最新版的安装、配置过程记录和踩坑分享

Nacos是什么&#xff1f;有什么功能&#xff1f;大家可以自行联网&#xff08;推荐 https://cn.bing.com/&#xff09;搜索&#xff0c;这里就不做介绍了。 简单的看了下官网&#xff0c;安装最新版的Nacos&#xff08;v2.3.2&#xff09;需要使用到JDK&#xff08;1.8.0&…

JS原生DOM操作 - 获得元素/网页大小/元素宽高

文章目录 获得元素的方法获取页面元素位置宽高概念方法获得网页/元素宽高clientHeight和clientWidth&#xff1a;scrollHeight和scrollWidth&#xff1a;window.innerWidth&#xff1a;element.style.width&#xff1a; offsetXXX 获得网页元素的宽高和相对父元素位置&#xff…

关于运行阿里云直播Demo pub get 报的错

flutter --version dart --version 如何使用Flutter框架推流_音视频终端 SDK(Apsara Video SDK)-阿里云帮助中心MediaBox音视频SDK下载指南_音视频终端 SDK(Apsara Video SDK)-阿里云帮助中心 终端输入 dart pub --trace get --no-precompile 打印详细报错信息 详细咨…

⭐Unity 里调用弹出电脑系统文件选择窗 (选择图片/文件)

今天遇到的需求要从Uinty里调用选择程序外的图片&#xff0c;类似手机环境下拿图库的照片一样。 效果如下: 话不多说 直接上代码&#xff01; 1.编辑器模式下 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using Syst…

Android Studio开发学习(六)———TableLayout(表格布局)、FrameLayout(帧布局)

目录 前言 一、Tablelayout &#xff08;一&#xff09;Tablelayout的相关简介 &#xff08;二&#xff09;TableLayout使用方法 1. 当TableLayout下面写控件、则控件占据一行的大小。(自适应一行&#xff0c;不留空白) 2.多个组件占据一行&#xff0c;则配合TableRow实现…

RocketMQ之Topic和Tag最佳实践

一、Topic是什么&#xff1f;它的作用&#xff1f; Topic即主题&#xff0c;是消息队列中用于对消息进行分类和组织的一种机制&#xff0c;它有以下三种作用&#xff1a; 标识消息分类&#xff1a;RocketMQ的主题用于对消息进行分类和组织。通过为不同类型的消息分配不同的主题…

FireProx:一款功能强大的AWS API网关管理与IP地址轮换代理工具

关于FireProx FireProx是一款功能强大的AWS API网关安全管理工具&#xff0c;该工具可以帮助广大研究人员创建实现唯一IP地址轮换的实时HTTP转发代理。 在发送网络请求或进行网络交互时&#xff0c;实现源IP地址轮换是一个非常复杂的过程&#xff0c;虽然社区中也有相关的工具…

ShardingSphere再回首

概念&#xff1a; 连接&#xff1a;通过协议 方言及库存储的适配&#xff0c;连接数据和应用&#xff0c;关注多模数据苦之间的合作 增量&#xff1a;抓取库入口流量题提供重定向&#xff0c; 流量变形(加密脱敏)/鉴权/治理(熔断限流)/分析等 可插拔&#xff1a;微内核 DDL:cr…

皮具5G智能制造工厂数字孪生可视化平台,推进企业数字化转型

皮具5G智能制造工厂数字孪生可视化平台&#xff0c;推进企业数字化转型。随着信息技术的快速发展&#xff0c;数字化转型已成为企业提升竞争力、实现可持续发展的关键路径。皮具行业&#xff0c;作为一个传统的手工制造业&#xff0c;正面临着巨大的市场变革和技术挑战。如何在…

(Java)数据结构——图(第十节)AOE网以及关键路径

目录 前言 AOE网 AOE网的两个性质&#xff1a; AOE网的五个时间 事件的最早发生时间Ve[k] 活动的最早开始时间E[i] 事件的最迟发生时间Vl[k] 活动的最晚开始时间L[i] 活动的时间余量 关于关键路径的缩短 代码实现思路 前言 本博客是博主用于复习数据结构以及算法的博…

蓝桥杯备赛刷题——css

新鲜的蔬菜 这题需要使用grid 我不会 去学一下 一.什么是grid Grid 布局与 Flex 布局有一定的相似性&#xff0c;都可以指定容器内部多个项目的位置。但是&#xff0c;它们也存在重大区别。 Flex 布局是轴线布局&#xff0c;只能指定"项目"针对轴线的位置&#…

(非技术) 基因遗传相关知识学习笔记

目录 一、基因遗传名词解释 二、什么叫显性遗传和隐性遗传&#xff1f; 三、如何确定遗传性质呢&#xff1f;是显性还是隐性&#xff1f; 四、常规例子1&#xff1a; 五、常规例子2&#xff1a; 六、实际案例&#xff1a; 七、思考题&#xff1a; 八、参考&#xff1a; …

【Redis深度解析】揭秘Cluster(集群):原理、机制与实战优化

Redis Cluster是Redis官方提供的分布式解决方案&#xff0c;通过数据分片与节点间通信机制&#xff0c;实现了水平扩展、高可用与数据容灾。本文将深入剖析Redis Cluster的工作原理、核心机制&#xff0c;并结合实战经验分享优化策略&#xff0c;为您打造坚实可靠的Redis分布式…

Qt QProcess详解

1.简介 QProcess提供了在 Qt 应用程序中启动外部程序的方法。通过QProcess&#xff0c;你可以启动一个进程&#xff0c;与它通信&#xff08;发送输入和读取输出&#xff09;&#xff0c;检查它的状态&#xff0c;以及等待它完成。这个类在执行系统命令、运行其他程序或脚本时…

铸铁试验平台和铸铁实验平台的主要区别在哪——北重制造厂家

铸铁试验平台和铸铁实验平台的主要区别在于其使用目的、实验内容和功能。 首先&#xff0c;铸铁试验平台主要用于铸铁工艺试验和工艺参数优化。通过模拟铸铁工艺过程&#xff0c;对不同工艺参数进行试验&#xff0c;从而得到最佳的铸铁工艺参数。铸铁试验平台一般具有温度控制、…

DL00295-基于AirSim仿真环境的无人机深度强化学习算法路径规划完整实现含详细说明文档

-创建了一个开放的AI Gym环境&#xff0c;包括多旋翼和固定翼无人机的运动学模型。 -提供了一些UE4环境来训练和测试深度强化学习DRL导航策略。 -基于AirSim和SB3。 完整代码链接见文末。 DL00295-基于AirSim仿真环境的无人机深度强化学习算法路径规划完整实现含详细说明文档

如何在前端项目中使用opencv.js | opencv.js入门

系列文章目录 如何在前端项目中使用opencv.js | opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js 如何从 public 路径加载人脸特征点检测模型tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图tensorflow.js 使用 opencv.js 将人脸…

docker 部署最新版 MySQL 实战

文章目录 前言简介第一步&#xff1a;搜索并拉取镜像1.1 搜索镜像1.2 拉取MySQL镜像1.3 查看MySQL镜像 第二步&#xff1a;生成MySQL容器2.1 运行MySQL镜像2.2 查看运行容器 第三步&#xff1a;验证服务可用性3.1 关闭防火墙3.2 连接MySQL 总结 前言 请各大网友尊重本人原创知…

独家原创 | Matlab实现INFO-BiTCN-BiGRU-Attention多输入单输出回归预测

独家原创 | Matlab实现INFO-BiTCN-BiGRU-Attention多输入单输出回归预测 目录 独家原创 | Matlab实现INFO-BiTCN-BiGRU-Attention多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现INFO-BiTCN-BiGRU-Attention向量加权算法优化双向时间卷积…