尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ChatGLM3 Composite Demo 实战指南:基于 Streamlit 的对话、工具与代码解释器一体化演示
大模型AI Agent模型推理服务微调对话系统【免费下载链接】ChatGLM3ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型项目地址https://gitcode.com/zai-org/ChatGLM3点击查看免费下载ChatGLM3 Composite Demo 是 ChatGLM3 系列项目提供的综合 Web 演示模块位于仓库composite_demo目录它以 Streamlit 为载体将对话、工具调用与代码解释器三种能力整合在同一页面中。本文将围绕该模块的安装、启动与三种模式展开完整讲解并结合仓库源码main.py、demo_chat.py、demo_tool.py、demo_ci.py、client.py、tool_registry.py等剖析参数含义与底层调用机制读完后你可以独立部署该演示、自定义注册工具并理解 ChatGLM3 工具调用与代码执行的完整链路。一、模块概览三种模式一个入口Composite Demo 的核心入口是 main.py通过streamlit run main.py启动后页面顶部以单选按钮radio形式提供三种模式切换对应源码中的Mode枚举 Chat对话模式与模型进行纯文本对话可调整采样参数与系统提示词️ Tool工具模式模型在对话之外可通过已注册工具执行操作查天气、生成随机数、执行 Shell 命令等 Code Interpreter代码解释器模式模型在一个 Jupyter 内核环境中执行代码并获取结果可完成绘图、符号运算等复杂任务。页面左侧边栏统一提供top_p、temperature、repetition_penalty、Output length四个滑块参数以及Clear History清空历史与Retry重试两个操作按钮。模式选择后main.py通过match tab语法将对应参数分发给 demo_chat.py、demo_tool.py 或 demo_ci.py 的main()函数执行。从目录结构看本模块各文件职责清晰client.py负责模型加载与流式生成客户端conversation.py定义角色枚举与对话格式化/后处理逻辑tool_registry.py提供工具注册与分发机制三个demo_*.py分别实现三种模式的页面逻辑。二、环境准备与安装官方建议使用 Conda 管理环境。按照 README 的安装流程依次执行conda create -n chatglm3-demo python3.10 conda activate chatglm3-demo pip install -r requirements.txt注意本项目要求 Python 3.10 或更高版本这主要因为源码中大量使用了 Python 3.10 引入的语法特性例如main.py中的match语句、client.py中的str.removeprefix()/removesuffix()方法以及X | None类型联合写法。依赖清单见 requirements.txt各依赖对应功能如下依赖版本要求用途huggingface_hub0.19.4提供TextGenerationStreamResponse、Token等流式生成数据结构pillow10.1.0处理代码解释器输出的image/png结果并转成可展示的 PIL Imagepyyaml6.0.1工具模式手动模式下解析 YAML 格式的工具定义requests2.31.0内置get_weather工具调用天气 APIipykernel/ipython6.26.0 / 8.18.1搭建 Jupyter 内核供代码解释器模式执行代码jupyter_client8.6.0通过jupyter_client.KernelManager管理与内核的通信如果希望使用代码解释器模式还需额外将当前环境注册为 Jupyter 内核默认内核名为chatglm3-demoipython kernel install --name chatglm3-demo --user这一步对应 demo_ci.py 中IPYKERNEL os.environ.get(IPYKERNEL, chatglm3-demo)的默认值CodeKernel类通过jupyter_client.KernelManager(kernel_nameIPYKERNEL, ...)按该名称启动后端内核。若你注册时使用了其他内核名可通过环境变量IPYKERNEL指定。三、启动运行与环境变量安装完成后在composite_demo目录下执行streamlit run main.py命令执行后命令行会打印出 demo 的访问地址点击即可在浏览器打开。首次访问时系统需要下载并加载模型可能耗时较长默认从 Hugging Face 拉取THUDM/chatglm3-6b。如果模型已下载到本地可通过以下环境变量控制加载行为定义于 client.pyexport MODEL_PATH/path/to/model # 指定本地模型路径默认 THUDM/chatglm3-6b export TOKENIZER_PATH/path/to/tokenizer # 指定分词器路径默认与 MODEL_PATH 相同 export IPYKERNELkernel_name # 自定义代码解释器使用的 Jupyter 内核名client.py中get_client()被st.cache_resource装饰模型只会加载一次并在页面重运行时复用。模型加载细节可关注两点默认通过AutoModel.from_pretrained(MODEL_PATH, trust_remote_codeTrue, device_mapauto).eval()以自动设备映射方式加载源码注释提示如需 int4 量化可在.eval()前追加.quantize(bits4, devicecuda).cuda()且 int4 模型必须用 CUDA 加载支持加载 P-Tuning v2 微调 checkpoint当PT_PATH环境变量指向有效的pytorch_model.bin时会以pre_seq_len128PRE_SEQ_LEN环境变量可调构建配置并仅将 checkpoint 中transformer.prefix_encoder.前缀的权重载入 prefix encoder。四、对话模式参数调参与流式输出在对话模式下用户可直接在侧边栏修改top_p、temperature、repetition_penalty、Output length以及System Prompt来调整模型行为。这些滑块的取值范围与默认值由 main.py 定义参数范围默认值说明top_p0.0 ~ 1.00.8核采样概率阈值temperature0.0 ~ 1.50.95采样温度越高越随机repetition_penalty0.0 ~ 2.01.1重复惩罚系数Output length5 ~ 32000256最大新生成 token 数其中System Prompt文本框默认填充DEFAULT_SYSTEM_PROMPT提示模型遵循用户指令并以 Markdown 回复仅对 Chat 模式生效侧边栏标注为 Only for chat mode。一个直观的例子是在系统提示词中要求模型仅用 emoji 回复、不使用普通文字模型会严格遵守该指令后续回复全部只输出对应 emoji见下图左侧还能看到top_p、temperature滑块与提示词输入框的联动效果。从源码看对话模式的生成链路位于 demo_chat.pymain()将历史对话存入st.session_state.chat_history随后调用client.generate_stream(...)流式生成关键参数包括toolsNone纯对话模式不启用工具do_sampleTrue开启采样stop_sequences[str(Role.USER)]以|user|作为停止序列防止模型生成越界内容repetition_penalty等采样参数透传给底层。生成过程中每个 token 会实时以postprocess_text(output_text ▌)渲染▌为光标占位符当遇到特殊 token|user|时结束本轮。postprocess_text见 conversation.py会清理 LaTeX 转义\(→$、\[→$$以及|assistant|、|observation|、|system|、|user|等特殊标记保证展示层干净。底层HFClient.generate_streamclient.py则基于transformers的stream_chat实现并挂载InvalidScoreLogitsProcessor——当采样分数出现 NaN/Inf 时将其清零并压制非法 token同时把|user|、|observation|一并加入eos_token_id。此外侧边栏的Retry按钮会定位历史中最后一条用户消息并删除其后续记录后重新生成Clear History则直接清空会话。五、工具模式注册、分发与手动模式5.1 用register_tool注册新工具工具模式的核心是 tool_registry.py。要增强模型能力只需在该文件中用register_tool装饰一个普通 Python 函数即可完成注册。注册规范如下工具名称 函数名工具描述 函数 docstring工具参数 使用Annotated[typ: type, description: str, required: bool]标注每个参数的类型、描述与是否必填。例如内置的get_weather工具register_tool def get_weather( city_name: Annotated[str, The name of the city to be queried, True], ) - str: Get the current weather for city_name ...从register_tool的底层实现看装饰器会做三件事inspect.getdoc(func)提取 docstring 作为工具描述遍历inspect.signature(func)的每个参数校验其注解必须为typing.Annotated否则抛TypeError并从中解析出类型名、描述字符串与 required 布尔值组装成{name, description, type, required}结构将工具存入全局_TOOL_HOOKS名称→可调用函数与_TOOL_DESCRIPTIONS名称→声明字典启动时打印[registered tool]日志。随后通过get_tools()导出全部工具声明返回深拷贝通过dispatch_tool(tool_name, tool_params)在生成流程中按名称调用具体函数若工具执行抛出异常dispatch_tool会返回格式化后的 traceback 文本而不是中断流程。仓库自带三个示例工具random_number_generator(seed, range)按种子在给定区间生成随机整数get_weather(city_name)调用天气 API 获取指定城市的当前天气温度、体感、湿度、天气描述、观测时间get_shell(query)在 Linux shell 中执行命令并返回 stdout/stderr。5.2 工具调用的完整链路工具模式页面逻辑位于 demo_tool.py其生成循环以特殊 token 作为协议分界遇到|assistant|表示模型要发起工具调用将当前文本作为工具声明追加进历史遇到|observation|表示工具调用参数输出完毕用正则extract_code从 代码块中取出参数文本通过eval(code, {tool_call: tool_call}, {})解析出参数字典随后调用dispatch_tool(tool, args)执行工具工具返回结果若超过truncate_length默认 1024会被截断并追加[TRUNCATED]标记观察结果以Role.OBSERVATION追加进历史模型根据观察结果继续生成直到遇到|user|结束本轮。循环最多迭代 5 轮for _ in range(5)避免工具调用死循环。整体上工具调用被建模为“模型生成工具声明 → 执行工具 → 观察结果 → 继续生成”的对话循环这一协议与 ChatGLM3 的|assistant|/|observation|特殊 token 设计一一对应。下图展示了模型在收到“查查巴黎的天气怎么样”后自动调用get_weather工具并返回查询结果的实际运行效果5.3 Manual modeYAML 手动指定工具页面上的Manual mode开关demo_tool.py 中的st.toggle允许绕过程序内注册表直接以 YAML 形式向模型声明工具列表。开启后页面展开一个文本框默认填入EXAMPLE_TOOL一个 OpenAI 风格的工具声明包含name、description、parameters.type、parameters.properties、parameters.required字段可通过yaml_to_dict()解析为字典列表。需要注意手动模式下工具不会自动执行模型生成工具调用后页面会提示 Please provide tool call results below你需要手动把工具的输出反馈给模型以观察结果形式继续对话。该模式适合调试工具声明格式或接入尚未注册的第三方工具协议。六、代码解释器模式Jupyter 内核中的自主执行代码解释器模式让模型获得真实的代码执行能力可完成绘制图表、符号运算等复杂任务。在此模式下你只需要描述希望模型完成的任务模型会根据对任务完成情况的理解自动连续执行多个代码块直至任务完成。实现层面demo_ci.py 定义CodeKernel类封装 Jupyter 内核生命周期构造时通过jupyter_client.KernelManager(kernel_nameIPYKERNEL)启动后端内核并初始化blocking_client()与消息通道execute(code)提交代码并轮询 iopub 消息直至execution_state idle返回 shell 消息与输出内容提供restart()、interrupt()、shutdown()等内核管理方法get_kernel()同样被st.cache_resource缓存。execute()函数负责解析执行结果文本输出以text/plain类型返回图像输出以image/pngbase64形式返回通过b64_2_img()转成 PIL Image 后直接渲染在页面中。该模式内置的系统提示词SYSTEM_PROMPT明确告知模型它是名为 ChatGLM 的智能助手、连接着一台不能联网的电脑可以通过运行 Python 代码并读取结果来解决问题且用户上传文件默认存放在/mnt/data/。例如让 ChatGLM3 用 Python 画一个爱心模型会自动编写绘图代码、在内核中执行并将生成的 Heart Shape 图形返回给用户全程无需人工干预与工具模式类似代码解释器也通过特殊 token 协议驱动|assistant|标记开始输出代码|observation|标记代码块结束随后extract_code抽取代码执行。文本型结果超过truncate_length时同样会被截断。此外demo_ci.py会对代码中的|observation|、|assistant|interpreter等标记做清洗后再提交内核避免协议标记混入代码。七、使用技巧与注意事项中断生成模型生成文本期间点击页面右上角的Stop按钮即可打断当前生成。清空历史刷新页面即可清空对话记录同时Clear History按钮也提供同样的能力。模式默认参数差异三种模式对采样参数的默认值不同——Chat 模式由侧边栏统一控制top_p0.8、temperature0.95、repetition_penalty1.1而 Tool 与 Code Interpreter 模式的函数默认值为top_p0.2、temperature0.1、repetition_penalty1.1见demo_tool.py/demo_ci.py的main()签名低温度设定更利于模型稳定输出工具声明与代码。工具观察结果截断工具输出与代码执行结果默认最多保留 1024 字符truncate_length超出部分以[TRUNCATED]结尾可自行调大以支持更长输出。模型序列长度限制底层stream_chat会校验input_sequence_length max_new_tokens是否超出模型seq_length超出时返回提示信息而非崩溃可通过调小Output length或缩短历史来规避。至此你已掌握 Composite Demo 从安装、启动到三种模式全流程的使用方法也理解了register_tool注册机制、特殊 token 调用协议、Jupyter 内核执行链路的底层原理。如需进一步扩展可参考仓库中 langchain_demo、tools_using_demo 等模块了解工具能力的其他接入形态。赞分享大模型AI Agent模型推理服务微调对话系统【免费下载链接】ChatGLM3ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型项目地址https://gitcode.com/zai-org/ChatGLM3点击查看免费下载相关推荐ChatGLM3 综合 Web Demo 实战指南对话、工具调用与代码解释器三合一composite_demoChatGLM3 综合 Web Demo 实战指南对话、工具调用与代码解释器三合一composite_demo ChatGLM3 的 composite_大模型AI Agent模型推理服务微调对话系统ChatGLM3 三合一 Web Demo 实战指南对话、工具调用与代码解释器模式详解ChatGLM3 三合一 Web Demo 实战指南对话、工具调用与代码解释器模式详解 本文以开源仓库 composite_demo 目录下的 README.大模型人工智能微调本地部署AI AgentRAGChatGLM3 Composite Web Demo 实战指南三种交互模式、工具注册与代码解释器的完整解析ChatGLM3 Composite Web Demo 实战指南三种交互模式、工具注册与代码解释器的完整解析 本文以仓库 composite_demo 目录下大模型人工智能微调本地部署AI AgentRAG创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

AnyPS5 跨平台图形兼容层:SPIR-V 与 SDL 实战解析

AnyPS5 跨平台图形兼容层:SPIR-V 与 SDL 实战解析

1. 从标题到落地:AnyPS5 到底想解决什么问题第一次看到 AnyPS5 这个名字,很多人会下意识以为它跟某款主机有关。其实从关键词组合(Linux、Windows、SPIR-V、SDL)来看,它更像是一个跨平台的图形/渲染兼容层项目&#xf…

📅 2026/10/9 6:17:27
Windows上用Docker部署OpenClaw并接入飞书机器人的完整指南

Windows上用Docker部署OpenClaw并接入飞书机器人的完整指南

在Windows上把OpenClaw用Docker跑起来,再连到飞书机器人,这套流程我前后折腾了整整一个周末。最初我天真地以为,装个Docker Desktop、拉个镜像、填几个token就完事了,结果卡在WSL2、卡在事件订阅、卡在容器日志里那串英文报错………

📅 2026/10/9 6:12:27
Linux忘记root密码怎么办?单用户模式、rd.break、chroot三种恢复方案详解

Linux忘记root密码怎么办?单用户模式、rd.break、chroot三种恢复方案详解

1. 忘记root密码别慌,这一篇把恢复方案讲透说实话,做Linux运维的人,谁没在机房或远程控制台前经历过这种时刻:要改个配置,sudo -i一敲,密码不对;试了五六个自己常用的组合,全都被拒&…

📅 2026/10/9 6:12:27
MORE NEWS

更多资讯

📰

Python入门高频问题全解析:环境配置、导包、语法与并发

刚装好 Python 的新手,大多数会在同一个地方翻车:软件装完了,双击 .py 文件要么闪一下就关掉,要么在终端里跑一行import numpy直接给你一个ModuleNotFoundError,然后就开始在搜索框里疯狂输入“python安装教程”“pyth…

📰

Ubuntu 20.04 WiFi 连接故障排查与 netplan/nmcli 实战配置

简介:本资源是一份面向Ubuntu 20.04初学者与系统运维人员的Wi-Fi连接故障排障指南,聚焦解决“无Wi-Fi图标”“无法识别无线网卡”等典型驱动缺失或配置错误问题。内容系统梳理两种主流解决方案:一是通过有线网络安装Broadcom芯片专用驱动&…

📰

PPT公式导入XHEDITOR图文混排的完整方案:从格式探测到LaTeX渲染全链路实战

1. 从PPT到XHEDITOR,先别急着动手搬做国产化OA系统集成的时候,经常遇到这种需求:业务部门手里有大量历史PPT,里面的内容不是简单的几行文字,而是图文混排的页面——图片、表格、公式、批注揉在一起。现在OA的公文编辑、…

📰

信息管理系统毕设全流程:从需求分析到Spring Boot+Vue项目落地

做计算机毕设这么多年,我见过太多人一上来就问“信息管理系统源码有没有现成的”,但真正把这套东西吃透的人反而很少。信息管理系统这个题目看着烂大街,实际上它是计算机专业本科毕设里性价比非常高的一类——技术栈覆盖全、需求容易理解、可…

📰

档案管理系统建设方案:用Word高效排版与自动化生成实战指南

1. 方案定位与建设背景1.1 这类方案文档是写给谁看的前几天帮客户把一份档案管理系统建设方案从零散的企业资料里整理成正式Word版本,过程中被各种公式、表格和引用折腾得够呛。档案管理系统建设方案这类文档,在很多企业里一直是“立项”和“招标”两个环…

📰

Agent-Reach 实战:用 CLI 和 Python 打通 AI Agent 的触达层

1. 从"Agent-Reach"这个名字说起:它到底想解决什么问题第一次看到 Agent-Reach 这个项目名,我的直觉是:这又是一个给 AI Agent 做"能力延伸"的工具。事实也确实如此,但它的切入点比大多数同类项目要克制得多—…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬