CP04大语言模型ChatGLM3-6B特性代码解读(2)

CP04大语言模型ChatGLM3-6B特性代码解读(2)

文章目录

  • CP04大语言模型ChatGLM3-6B特性代码解读(2)
    • 构建对话demo_chat.py
      • 定义client对象
      • 与LLM进行对话
    • 构建工具调用demo_tool.py
      • 定义client对象
      • 定义工具调用提示词
      • 定义main,传递参数
      • 在main方法中,实现一个for循环,只循环5次,以完成工具调用Role之间的一轮对话
      • 在`for response in client.generate_stream`循环内对response按条件处理
    • 构建代码解释器demo_ci.py
      • 定义代码解释器提示词
      • 定义IPY内核以及client对象
      • 在main方法中,实现一个for循环,只循环5次,以完成工具调用Role之间的一轮对话
      • 在`for response in client.generate_stream`循环内对response按条件处理
      • 代码解释器调用的提示词过程

对话模式、工具模式、代码解释器模式例程阅读理解。
在这里插入图片描述

ChatGLM3-6B已经进行了中文场景的训练,可以直接运用于中文场景。在生成模型中使用自定义LogitsProcessor中怎样使用logits processor来改变生成过程中的概率,进而改变生成的结果。
CLI代码包括:

conversation.py
demo_ci.py
main.py
client.py
demo_chat.py
demo_tool.py
tool_registry.py

上一篇解读了client.py和conversation.py,本篇解读完其他代码。

构建对话demo_chat.py

首先定义client对象,然后调用client.generate_stream()方法获得response。

定义client对象

from client import get_client
from conversation import postprocess_text, preprocess_text, Conversation, Roleclient = get_client()

与LLM进行对话

  • 定义main,输入参数
def main(prompt_text: str,system_prompt: str,top_p: float = 0.8,temperature: float = 0.95,repetition_penalty: float = 1.0,max_new_tokens: int = 1024,retry: bool = False
):
  • 在for循环中进行对话
        for response in client.generate_stream(system_prompt,tools=None,history=history,do_sample=True,max_new_tokens=max_new_tokens,temperature=temperature,top_p=top_p,stop_sequences=[str(Role.USER)],repetition_penalty=repetition_penalty,):

构建工具调用demo_tool.py

之前的文章《CP01大语言模型ChatGLM3-6B使用CLI代码进行代码调用初体验》介绍了工具调用,可以发现一个完整的工具调用需要在<|system|><|user|><|assistant|><|observation|>这几个Role之间进行一轮对话,才能完成。demo_tool.py中也是用for response in client.generate_stream来完成一轮对话,以实现工具调用。
在这里插入图片描述
当前8℃,百度查询今天是3-8℃:
在这里插入图片描述

定义client对象

client = get_client()

定义工具调用提示词

按照json结构定义一个变量,定义名为get_current_weather的工具:

EXAMPLE_TOOL = {"name": "get_current_weather","description": "Get the current weather in a given location","parameters": {"type": "object","properties": {"location": {"type": "string","description": "The city and state, e.g. San Francisco, CA",},"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},},"required": ["location"],}
}

定义main,传递参数

def main(prompt_text: str,top_p: float = 0.2,temperature: float = 0.1,repetition_penalty: float = 1.1,max_new_tokens: int = 1024,truncate_length: int = 1024,retry: bool = False
):

在main方法中,实现一个for循环,只循环5次,以完成工具调用Role之间的一轮对话

注意这里system没有传入提示词。

        for _ in range(5):output_text = ''for response in client.generate_stream(system=None,tools=tools,history=history,do_sample=True,max_new_tokens=max_new_tokens,temperature=temperature,top_p=top_p,stop_sequences=[str(r) for r in (Role.USER, Role.OBSERVATION)],repetition_penalty=repetition_penalty,):

for response in client.generate_stream循环内对response按条件处理

                token = response.tokenif response.token.special:print("\n==Output:==\n", output_text)match token.text.strip():case '<|user|>':append_conversation(Conversation(Role.ASSISTANT,postprocess_text(output_text),), history, markdown_placeholder)return# Initiate tool callcase '<|assistant|>':append_conversation(Conversation(Role.ASSISTANT,postprocess_text(output_text),), history, markdown_placeholder)output_text = ''message_placeholder = placeholder.chat_message(name="tool", avatar="assistant")markdown_placeholder = message_placeholder.empty()continuecase '<|observation|>':tool, *call_args_text = output_text.strip().split('\n')call_args_text = '\n'.join(call_args_text)append_conversation(Conversation(Role.TOOL,postprocess_text(output_text),tool,), history, markdown_placeholder)message_placeholder = placeholder.chat_message(name="observation", avatar="user")markdown_placeholder = message_placeholder.empty()try:code = extract_code(call_args_text)args = eval(code, {'tool_call': tool_call}, {})except:st.error('Failed to parse tool call')returnoutput_text = ''if manual_mode:st.info('Please provide tool call results below:')returnelse:with markdown_placeholder:with st.spinner(f'Calling tool {tool}...'):observation = dispatch_tool(tool, args)if len(observation) > truncate_length:observation = observation[:truncate_length] + ' [TRUNCATED]'append_conversation(Conversation(Role.OBSERVATION, observation), history, markdown_placeholder)message_placeholder = placeholder.chat_message(name="assistant", avatar="assistant")markdown_placeholder = message_placeholder.empty()st.session_state.calling_tool = Falsebreakcase _:st.error(f'Unexpected special token: {token.text.strip()}')return

构建代码解释器demo_ci.py

代码解释器与代码调用实现过程类似,是一种特殊的工具调用。也是在<|system|><|user|><|assistant|><|observation|>这几个Role之间进行一轮对话,才能完成
,在这几个Role之外,多了<|interpreter|>。

定义代码解释器提示词

SYSTEM_PROMPT = '你是一位智能AI助手,你叫ChatGLM,你连接着一台电脑,但请注意不能联网。在使用Python解决任务时,你可以运行代码并得到结果,如果运行结果有错误,你需要尽可能对代码进行改进。你可以处理用户上传到电脑上的文件,文件默认存储路径是/mnt/data/。'

定义IPY内核以及client对象

IPYKERNEL = os.environ.get('IPYKERNEL', 'chatglm3-demo')client = get_client()

在main方法中,实现一个for循环,只循环5次,以完成工具调用Role之间的一轮对话

注意这里system参入了提示词。

for _ in range(5):output_text = ''for response in client.generate_stream(system=SYSTEM_PROMPT,tools=None,history=history,do_sample=True,max_new_token=max_new_tokens,temperature=temperature,top_p=top_p,stop_sequences=[str(r) for r in (Role.USER, Role.OBSERVATION)],repetition_penalty=repetition_penalty,):

for response in client.generate_stream循环内对response按条件处理

                if response.token.special:print("\n==Output:==\n", output_text)match token.text.strip():case '<|user|>':append_conversation(Conversation(Role.ASSISTANT,postprocess_text(output_text),), history, markdown_placeholder)return# Initiate tool callcase '<|assistant|>':append_conversation(Conversation(Role.ASSISTANT,postprocess_text(output_text),), history, markdown_placeholder)message_placeholder = placeholder.chat_message(name="interpreter", avatar="assistant")markdown_placeholder = message_placeholder.empty()output_text = ''continuecase '<|observation|>':code = extract_code(output_text)display_text = output_text.split('interpreter')[-1].strip()append_conversation(Conversation(Role.INTERPRETER,postprocess_text(display_text),), history, markdown_placeholder)message_placeholder = placeholder.chat_message(name="observation", avatar="user")markdown_placeholder = message_placeholder.empty()output_text = ''with markdown_placeholder:with st.spinner('Executing code...'):try:res_type, res = execute(code, get_kernel())except Exception as e:st.error(f'Error when executing code: {e}')returnprint("Received:", res_type, res)if truncate_length:if res_type == 'text' and len(res) > truncate_length:res = res[:truncate_length] + ' [TRUNCATED]'append_conversation(Conversation(Role.OBSERVATION,'[Image]' if res_type == 'image' else postprocess_text(res),tool=None,image=res if res_type == 'image' else None,), history, markdown_placeholder)message_placeholder = placeholder.chat_message(name="assistant", avatar="assistant")markdown_placeholder = message_placeholder.empty()output_text = ''breakcase _:st.error(f'Unexpected special token: {token.text.strip()}')breakoutput_text += response.token.textdisplay_text = output_text.split('interpreter')[-1].strip()markdown_placeholder.markdown(postprocess_text(display_text + '▌'))

代码解释器调用的提示词过程

在这里插入图片描述

观察以下过程,发现代码解释器在运行前,先注册了一个工具[registered tool],名为’name’: ‘random_number_generator’。不难看出,代码解释器就是一个工具调用的过程。

Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████| 7/7 [01:09<00:00, 9.88s/it]
[registered tool] {‘description’: ‘Generates a random number x, s.t. range[0] <= x < range[1]’,
‘name’: ‘random_number_generator’,
‘params’: [{‘description’: ‘The random seed used by the generator’,
‘name’: ‘seed’,
‘required’: True,
‘type’: ‘int’},
{‘description’: ‘The range of the generated numbers’,
‘name’: ‘range’,
‘required’: True,
‘type’: ‘tuple[int, int]’}]}
[registered tool] {‘description’: ‘Get the current weather for city_name’,
‘name’: ‘get_weather’,
‘params’: [{‘description’: ‘The name of the city to be queried’,
‘name’: ‘city_name’,
‘required’: True,
‘type’: ‘str’}]}
[registered tool] {‘description’: ‘Use shell to run command’,
‘name’: ‘get_shell’,
‘params’: [{‘description’: ‘The command should run in Linux shell’,
‘name’: ‘query’,
‘required’: True,
‘type’: ‘str’}]}

== Input ==
请生成一个代码,实现心形,并绘制

History
[{‘role’: ‘system’, ‘content’: ‘你是一位智能AI助手,你叫ChatGLM,你连接着一台电脑,但请注意不能联网。在使用Python解决任务时,你可以运行代码并得到结果,如果运行结果有错误,你需要尽可能对代码进行改进。你可以处理用户上传到电脑上的文件,文件默认存储路径是/mnt/data/。’}, {‘role’: ‘user’, ‘content’: ‘请生成一个代码,实现心形’}, {‘role’: ‘assistant’, ‘content’: “好的,我将为您提供一个简单的Python代码来绘制一个心形。这里我们将使用matplotlib库,这是一个用于绘制2D图形的强大工具。\n\npython\nimport matplotlib.pyplot as plt\nimport numpy as np\n\ndef draw_heart(size=600, color='red'):\n # 参数方程\n x = size * np.cos(np.linspace(0, np.pi, size))\n y = size * np.sin(np.linspace(0, np.pi, size))\n \n plt.figure(figsize=(8, 8))\n plt.plot(x, y, 'r')\n plt.axis('equal') # 确保心形在各个方向上均勻分布\n plt.title('Heart Shape')\n plt.xlabel('X-axis')\n plt.ylabel('Y-axis')\n plt.grid(True)\n plt.gca().set_aspect('equal', adjustable='box')\n plt.show()\n\ndraw_heart()\n\n\n上述代码”}]

Output:
interpreter

import matplotlib.pyplot as plt
import numpy as npdef draw_heart(size=600, color='red'):# 参数方程x = size * np.cos(np.linspace(0, np.pi, size))y = size * np.sin(np.linspace(0, np.pi, size))plt.figure(figsize=(8, 8))plt.plot(x, y, 'r')plt.axis('equal')  # 确保心形在各个方向上均勻分布plt.title('Heart Shape')plt.xlabel('X-axis')plt.ylabel('Y-axis')plt.grid(True)plt.gca().set_aspect('equal', adjustable='box')plt.show()draw_heart()

Backend kernel started with the configuration: /tmp/tmpkspqb3jz.json
{‘control_port’: 60651,
‘hb_port’: 56547,
‘iopub_port’: 57651,
‘ip’: ‘127.0.0.1’,
‘key’: b’f588594c-281de24e935be8cae16fda73’,
‘shell_port’: 33721,
‘signature_scheme’: ‘hmac-sha256’,
‘stdin_port’: 41243,
‘transport’: ‘tcp’}
Code kernel started.
Received: image <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=695x395 at 0x7F0FE3C57C70>

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

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

相关文章

接口测试需求分析

测试接口的时候&#xff0c;可能很多人都会想&#xff0c;按着研发给的接口协议文档来测&#xff0c;不就好了吗&#xff1f; 其实&#xff0c;对于接口的测试&#xff0c;还需要有点深度的需求分析&#xff0c;然后再进行对应的测试。对于接口测试&#xff0c;这里有个不太详…

利用nginx内部访问特性实现静态资源授权访问

在nginx中&#xff0c;将静态资源设为internal&#xff1b;然后将前端的静态资源地址改为指向后端&#xff0c;在后端的响应头部中写上静态资源地址。 近期客户对我们项目做安全性测评&#xff0c;暴露出一些安全性问题&#xff0c;其中一个是有些静态页面&#xff08;*.html&…

Android 开发一个耳返程序(录音,实时播放)

本文目录 点击直达 Android 开发一个耳返程序程序编写1. 配置 `AndroidManifast.xml`2.编写耳返管理器3. 录音权限申请4. 使用注意最后我还有一句话要说怕相思,已相思,轮到相思没处辞,眉间露一丝Android 开发一个耳返程序 耳返程序是声音录入设备实时播放的一种程序,理论上…

XFF伪造 [MRCTF2020]PYWebsite1

打开题目 直接查看源码 看到一个./flag.php 访问一下 购买者的ip已经被记录&#xff0c;本地可以看到flag&#xff0c;那么使用xff或者client-ip伪造一下ip试试 bp抓包 加一个X-Forwarded-For头 得到flag

关于git子模块实践(一)

背景 在日常项目开发中&#xff0c;随着项目的迭代&#xff0c;不可避免的是主项目会引入到很多三方库&#xff0c;或者自研的一些模块。有一种场景&#xff0c;就是这些模块&#xff0c;是随着开发而进行迭代&#xff0c;且多个项目公用的&#xff0c;这种情况&#xff0c;在…

探讨javascript中运算符优先级

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 深入理解JavaScript运算符优先级运算符优先级概述示例演示示例1&#xff1a;加法和乘法运算符的优先级示…

86、移除推理路径上的所有内存操作

动态申请内存的影响,前两节已经介绍过了,细心的朋友可能会发现,在使用 C++实现的 resnet50 代码中,还存在一处动态申请内存的操作。 那就是对于每一层的输入或输出 feature map 数据进行内存申请,比如在 3rd_preload/ops/conv2d.cc 文件中,卷积的计算中存在对于输出 fea…

MaxScale实现mysql8读写分离

MaxScale 实验环境 中间件192.168.150.24MaxScale 22.08.4主服务器192.168.150.21mysql 8.0.30从服务器192.168.150.22mysql 8.0.30从服务器192.168.150.23mysql 8.0.30 读写分离基于主从同步 1.先实现数据库主从同步 基于gtid的主从同步配置 主库配置 # tail -3 /etc/my.…

Aigtek电压放大器的应用场合有哪些

电压放大器是一种主要用于信号处理的重要电子设备&#xff0c;它可以将输入的低电压信号放大到较高的输出电压水平。在各个应用领域中&#xff0c;电压放大器发挥着重要的作用。下面西安安泰点击将介绍电压放大器的应用场合。 通信系统&#xff1a;电压放大器在通信系统中具有重…

ant-design-charts 对带缩略轴柱状图 根据数据自定义列处理, 以颜色为例

摘要 本文主要对ant-design-charts中带缩略柱状图进行自定义列处理 ant-design-charts版本&#xff1a;1.4.2 1、定义数据 const data1 [{"a": "七台河","b": 52827.32,c: 2},{"a": "万县","b": 20000,c: 1},…

队列的基本操作——常见队列的对比分析(c语言完整代码包含注释)

目录 一、队列 1.1基本概念 1.2基本操作 1.3 队列分类 1.3.1带头队列 1.3.2不带头队列 1.3.3 循环带头队列 1.3.4 循环不带头队列 1.3.5 总结 二、代码实现 2.1带头队列 2.2不带头队列 2.3循环带头队列 2.4循环不带头队列 一、队列 1.1基本概念 队列&#xff08…

openGauss学习笔记-227 openGauss性能调优-系统调优-其他因素对LLVM性能的影响

文章目录 openGauss学习笔记-227 openGauss性能调优-系统调优-其他因素对LLVM性能的影响 openGauss学习笔记-227 openGauss性能调优-系统调优-其他因素对LLVM性能的影响 LLVM优化效果不仅依赖于数据库内部具体的实现&#xff0c;还与当前所选择的硬件环境等有关。 表达式调用C…

Ubuntu 20.04.1 共享samba给windows 10

通过ssh登录ubuntu&#xff0c;修改/etc/下的smb配置文件&#xff0c; uidq4932hzh57415u:/work$ cat /etc/samba/smb.conf [global] security ads realm V01.NET workgroup V01 idmap uid 10000-20000 idmap gid 10000-20000 winbind enum users yes winbind enum grou…

pandas/geopandas 笔记:判断地点在不在路网上 不在路网的点和路网的距离

0 导入库 import osimport pandas as pd pd.set_option(display.max_rows,5)import osmnx as oximport geopandas as gpd from shapely.geometry import Point 1 读取数据 假设我们有 如下的数据&#xff1a; 1.1 新加坡室外基站位置数据 cell_stationpd.read_csv(outdoor…

耐腐蚀的液位传感器有哪些

液位传感器在不同的应用环境中有着不同的要求&#xff0c;特别是在需要耐腐蚀性液体的环境中&#xff0c;选择合适的传感器至关重要。对于这种情况&#xff0c;一种常见且有效的选择是不锈钢液位传感器。 不锈钢液位传感器具有耐腐蚀性好、安装简便、功耗低、耐压性强等优点。…

企业计算机服务器中了crypt勒索病毒怎么办,crypt勒索病毒解密数据恢复

计算机服务器设备为企业的生产运营提供了极大便利&#xff0c;企业的重要核心数据大多都存储在计算机服务器中&#xff0c;保护企业计算机服务器免遭勒索病毒攻击&#xff0c;是一项艰巨的工作任务。但即便很多企业都做好的了安全运维工作&#xff0c;依旧免不了被勒索病毒攻击…

shiro 整合 springboot 实战

序言 前面我们学习了如下内容&#xff1a; 5 分钟入门 shiro 安全框架实战笔记 shiro 整合 spring 实战及源码详解 这一节我们来看下如何将 shiro 与 springboot 进行整合。 spring 整合 maven 依赖 <?xml version"1.0" encoding"UTF-8"?> …

Spring Boot应用集成Actuator端点自定义Filter解决未授权访问的漏洞

一、前言 我们知道想要实时监控我们的应用程序的运行状态&#xff0c;比如实时显示一些指标数据&#xff0c;观察每时每刻访问的流量&#xff0c;或者是我们数据库的访问状态等等&#xff0c;需要使用到Actuator组件&#xff0c;但是Actuator有一个访问未授权问题&#xff0c;…

2.21日学习打卡----初学Nginx(一)

2.21日学习打卡 目录: 2.21日学习打卡一. Nginx是什么&#xff1f;概述Nginx 五大应用场景HTTP服务器正向代理反向代理正向代理与反向代理的区别&#xff1a;负载均衡动静分离 为啥使用Nginx? 二.下载Nginx&#xff08;linux&#xff09;环境准备下载Nginx和安装NginxNginx源码…

自定义Chrome的浏览器开发者工具DevTools界面的字体和样式

Chrome浏览器开发者工具默认的字体太小&#xff0c;想要修改但没有相关设置。 外观——字体可以自定义字体&#xff0c;但大小不可以调整。 github上有人给出了方法 整理为中文教程&#xff1a; 1.打开浏览器开发者工具&#xff0c;点开设置——实验&#xff0c;勾上红框设…