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

一、前言

    每个模型都有自己的限制,有些情况下它们无法满足复杂的业务需求。但是,可以通过一个外置函数的方式,例如:"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 tracebackfrom transformers import AutoTokenizer, AutoModelForCausalLMmodelPath = "/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 = hismessages.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 responseexcept Exception:traceback.print_exc()def loadTokenizer():tokenizer = AutoTokenizer.from_pretrained(modelPath, use_fast=False, trust_remote_code=True)return tokenizerdef loadModel():model = AutoModelForCausalLM.from_pretrained(modelPath, device_map="auto", trust_remote_code=True).cuda()model = model.eval()# print(model)return modeldef 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.hqwc.cn/news/611310.html

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

相关文章

7.接口自动化测试-Allure报告

1.环境搭建 &#xff08;1&#xff09;下载并解压allure.zip&#xff0c;不要用中文路径&#xff0c;将bin目录配置到path环境变量 官网&#xff1a;Allure下载 &#xff08;2&#xff09;cmd安装allure-pytest第三方库 pip install allure-pytest 检测是否安装成功 pip show …

从大量数据到大数据,King’s SDMS仪器数据采集及科学数据管理系统的应用

对于实验室或检测机构&#xff0c;仪器设备是所有业务开展的基础&#xff0c;数据则是核心命脉&#xff0c;而传统的仪器设备原始数据收集方式&#xff0c;效率低耗时长、操作流程不规范、不易保存与查找、错误率高、易篡改等成了制约检测机构持续高速发展的瓶颈和弊端&#xf…

Erlang中常用数据结构原理及其实现

文章目录 一、Erlang 简介二、数据结构2.1、元组&#xff08;Tuple&#xff09;2.1.1、示例&#xff1a;2.1.2、实现&#xff1a; 2.2、列表&#xff08;List&#xff09;2.2.1、示例2.2.2、实现2.2.3、原理 3. 字典&#xff08;Dictionary&#xff09;3.1、创建字典3.2、添加和…

ELK 日志分析系统(一)

一、概念 二、详解 2.1 Elasticsearch 核心概念 2.1.1 接近实时(NRT) 2.1.2 cluster集群 2.1.3 Node节点 2.1.4 index索引 2.1.5 类型&#xff08;type&#xff09; 2.1.6 文档&#xff08;document) 2.1.7 分片和副本(shards & replicas) 2.2 Logstash主要组件 …

UE_导入内容_Maya静态网格体导出为FBX的常规设置

注意事项&#xff1a;单位设置统一为cm&#xff1b;轴朝向&#xff0c;Maya默认y轴朝上&#xff0c;UE4 z轴向上&#xff1b;变换枢轴&#xff0c;UE4会将导入模型前世界中心作为枢轴中心&#xff0c;要旋转就需要注意了&#xff1b;法线&#xff0c;UE4内材质默认单面显示&…

记录一个Kafka客户端Offset Explore连不上的问题

我昨天把集群重装了一下&#xff0c;再连这个工具就连不上了&#xff08;你先把zk和kafka在集群启起来&#xff09;&#xff0c;报错截图如下&#xff1a; 英文翻译过来大概就是说遍历zk指定路径不存在&#xff0c;我还以为zk的问题&#xff0c;回去又把zk的文档翻了一遍&#…

HCIE考试第四题:业务个性化配置

文章目录 业务个性化配置题目与做题步骤如下4业务个性化配置4.1.创建节点池solo-2【4.13中的同步创建了】4.1.1.创建Namespace4.1.2.创建节点池和节点4.2.镜像制作solo:2.04.3.创建sol0-2.0日录4.4.NFS环境检查4.5.修改Dockerfie4.6.构建镜像solo:2.0并上传到SWR【4.2-4.6为1小…

锐化空间滤波器--二阶微分图像增强(提高清晰度的另一种方式)

书上一阶微分的定义可以理解&#xff0c;毕竟这里不死数学上的曲线的概念&#xff0c;而是像素点上的曲线。所以&#xff0c;不同于数学的严格单调递增曲线的导数是大于等于零&#xff0c;这里的严格单调递增曲线&#xff0c;只能是大于零。 至于二阶微分的定义&#xff0c;就…

项目4-图书管理系统2+统一功能处理

1. 拦截器&#xff08;Interceptor&#xff09; 我们完成了强制登录的功能, 后端程序根据Session来判断用户是否登录, 但是实现⽅法是比较麻烦的。 所需要处理的内容&#xff1a; • 需要修改每个接⼝的处理逻辑 • 需要修改每个接⼝的返回结果 • 接⼝定义修改, 前端代码也需…

解决宝塔的FTP无法使用被动模式

问题&#xff1a;宝塔安装完ftp管理软件之后&#xff0c;无法使用被动模式连接 解决&#xff1a; 提示&#xff1a; 如果还是不行&#xff0c;那么要看看防火墙和安全组有没有放行被动模式的端口&#xff0c;宝塔安装的pure-ftpd软件的被动模式端口默认是39000至400…

界面设计【1】-项目的UI设计css

引言&#xff1a; 本篇博客对简单的css html界面设计做了简要介绍 这篇博客主要就是介绍了做横向项目中&#xff0c;CSS界面设计与优化。 界面设计【1】-项目的UI设计css 1. 什么是css?2. css编程demo3. 可视化效果 1. 什么是css? CSS是层叠样式表&#xff08;Cascading S…

深入解析:虚拟内存——理解现代计算机内存管理的关键概念

目录 一、引言 二、程序的“搬家”记&#xff1a;从硬盘到内存 1. 把剧本搬上舞台 2. 分配角色和位置 3. 开始排练与演出 三、虚拟内存&#xff1a;理想与现实的桥梁 1.虚拟内存&#xff1a;运行原理 2. 虚拟内存&#xff1a;让每个程序都有个“私人剧场” 3. 虚拟内…