尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ChatGLM3 三合一 Web Demo 实战指南:对话、工具调用与代码解释器模式详解
大模型人工智能微调本地部署AI AgentRAG【免费下载链接】ChatGLM3ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型项目地址https://gitcode.com/gh_mirrors/ch/ChatGLM3点击查看免费下载本文以开源仓库composite_demo目录下的 README.md 为主体结合 main.py、demo_chat.py、demo_tool.py、demo_ci.py、tool_registry.py 与 client.py 等源码完整讲解基于 Streamlit 的 ChatGLM3 Web Demo 的安装、运行、三种交互模式Chat / Tool / Code Interpreter的使用方法、参数配置与底层实现原理。读完本文你将能够独立部署这套 Demo注册自定义工具并通过 Jupyter 代码内核让模型边思考边执行完成复杂任务。一、Demo 概览一个界面三种能力composite_demo是 ChatGLM3 仓库中提供的 Web 交互式演示项目采用 Streamlit 构建。与命令行 demo 不同它把 ChatGLM3 最受关注的三大能力集成在同一个页面中通过顶部单选按钮即可无缝切换Chat对话模式与模型进行自由多轮对话并可实时调节采样参数与 System PromptTool工具模式模型在对话的同时可以按需调用注册好的外部工具如查询天气、执行 Shell 命令并观察工具返回结果后继续作答Code Interpreter代码解释器模式模型在独立的 Jupyter 内核中执行生成的 Python 代码并获取运行结果文本或图片从而完成绘图、符号运算等复杂任务。从 main.py 中可以看到三种模式的定义class Mode(str, Enum): CHAT, TOOL, CI Chat, ️ Tool, ‍ Code Interpreter页面通过st.radio横向排布这三个选项并由match tab:分发到demo_chat.main()、demo_tool.main()、demo_ci.main()三个入口函数见 main.py。二、环境准备与安装Demo 建议使用 Conda 管理 Python 环境要求Python 3.10 或更高版本。按以下三步即可完成安装conda create -n chatglm3-demo python3.10 conda activate chatglm3-demo pip install -r requirements.txt其中requirements.txt见 requirements.txt声明了运行所需的依赖依赖最低版本用途huggingface_hub0.19.4流式推理响应类型TextGenerationStreamResponse的来源pillow10.1.0处理代码解释器输出的图片PIL.Imagepyyaml6.0.1工具模式下解析用户手写的 YAML 工具定义requests2.31.0内置天气工具get_weather调用wttr.inAPIipykernel/ipython6.26.0 / 8.18.1为 Code Interpreter 模式提供可注册的 Python 内核jupyter_client8.6.0与 Jupyter 内核通信执行代码2.1 安装 Jupyter 内核Code Interpreter 模式必需由于 Code Interpreter 模式需要在 Jupyter 环境中执行代码安装依赖后还必须把当前环境注册为一个 IPython 内核ipython kernel install --name chatglm3-demo --user--name后面的名称默认被 demo_ci.py 中的IPYKERNEL os.environ.get(IPYKERNEL, chatglm3-demo)引用若你使用其他内核名需在运行时通过环境变量IPYKERNEL覆盖见下文运行一节。三、启动 Demo环境就绪后在composite_demo目录下执行streamlit run main.py启动成功后终端会输出 Demo 的访问地址默认 http://localhost:8501点击即可在浏览器中打开页面。首次访问时Demo 会自动从 Hugging Face 下载并加载模型耗时取决于网络状况。3.1 关键环境变量如果模型已下载到本地可通过环境变量指定路径Demo 支持四个可调环境变量见 client.pyexport MODEL_PATH/path/to/model # 模型路径默认 THUDM/chatglm3-6b export TOKENIZER_PATH/path/to/tokenizer # tokenizer 路径默认与 MODEL_PATH 相同 export IPYKERNELkernel_name # 自定义 Jupyter 内核名默认 chatglm3-demo export PT_PATH/path/to/pt_checkpoint # P-Tuning v2 微调 checkpoint 路径默认关闭其中MODEL_PATH支持本地目录路径也可以直接写 Hugging Face 上的模型 ID如THUDM/chatglm3-6b。PT_PATH用于加载 P-Tuning v2 微调后的前缀编码器权重当它存在时client.py 会以PRE_SEQ_LEN默认 128可通过同名环境变量修改构造配置并加载pytorch_model.bin中的transformer.prefix_encoder.*权重。3.2 模型加载与量化提示模型在 client.py 的HFClient中通过AutoModel.from_pretrained(..., trust_remote_codeTrue, device_mapauto).eval()加载并配合AutoTokenizer.from_pretrained(..., trust_remote_codeTrue)使用 ChatGLM3 的自定义 tokenizer。源码注释中还给出了使用 int4 量化模型的提示将加载语句改为.quantize(bits4, devicecuda).cuda().eval()并去掉device_mapauto注意 int4 模型必须用 CUDA 加载。另外 client.py 内置了一个InvalidScoreLogitsProcessor当生成过程中出现 NaN/Inf 分数时将其清零并把第 5 号 tokenEOS的分数置为 5e4避免生成崩溃——这也是在显存不足或长上下文场景下保障稳定输出的兜底手段。四、对话模式Chat参数即调优在对话模式下用户可以直接在左侧边栏调节四个采样参数来改变模型的生成行为见 main.py参数取值范围默认值说明top_p0.0 ~ 1.0步长 0.010.8核采样阈值只从累计概率达到 top_p 的 token 中采样temperature0.0 ~ 1.5步长 0.010.95采样温度越大输出越发散越小越确定repetition_penalty0.0 ~ 2.0步长 0.011.1重复惩罚系数抑制句子中重复用词Output lengthmax_new_tokens5 ~ 32000步长 1256单次生成的最大新 token 数边栏还提供 System Prompt 编辑框默认值来自 main.pyYou are ChatGLM3, a large language model trained by Zhipu.AI. Follow the users instructions carefully. Respond using markdown.调整 System Prompt 可以显著改变模型风格例如 README 中展示的示例将 System Prompt 设为只用 emoji 回答模型便全程以表情符号回复见 README.md 与 assets/emojis.png。4.1 底层调用链对话模式的生成逻辑位于 demo_chat.py用户输入经过append_conversation写入st.session_state.chat_history随后调用client.generate_stream()进行流式生成关键参数包括systemsystem_prompt传入用户编辑的 System Promptstop_sequences[str(Role.USER)]遇到|user|特殊 token 即停止do_sampleTrue开启随机采样。生成过程中每当遇到特殊 token 就立即中断并输出已累积的文本普通 token 则实时以postprocess_text(output_text ▌)渲染到占位符实现打字机式流式效果。postprocess_text见 conversation.py负责把 LaTeX 风格的\(、\)、\[、\]转换为 Markdown 公式定界符并剥离|system|、|user|等对话标记。五、工具模式Tool一行装饰器扩展模型能力工具模式是 ChatGLM3 的核心特性之一模型不仅能说话还能在需要时调用外部工具并观察结果后继续回答。模型会依据工具声明自主决定是否发起调用无需用户手动干预。5.1 注册新工具register_tool在 tool_registry.py 中提供了register_tool装饰器注册规则如下函数名即工具名函数 docstring即工具说明会被模型用来理解工具用途参数使用Annotated[typ: type, description: str, required: bool]标注类型、描述与是否必填。README 中给出的天气工具注册示例register_tool def get_weather( city_name: Annotated[str, The name of the city to be queried, True], ) - str: Get the weather for city_name in the following week ...register_tool在注册时通过inspect.signature()反射参数注解并做严格校验参数缺少类型注解、注解类型不是typing.Annotated、描述不是字符串、required不是布尔值都会抛出TypeError见 tool_registry.py。校验通过后工具会以{name, description, params}结构存入_TOOL_HOOKS与_TOOL_DESCRIPTIONS两个全局字典分别用于分发调用与生成模型可见的工具声明。仓库自带的三个示例工具见 tool_registry.py工具参数功能random_number_generatorseed、range: tuple[int, int]生成指定范围内的随机数get_weathercity_name通过wttr.in查询城市天气get_shellquery在 Linux Shell 中执行命令并返回输出调用方通过dispatch_tool(tool_name, tool_params)执行工具见 tool_registry.py工具不存在时返回提示执行抛异常时返回 traceback 文本get_tools()则返回一份深拷贝的工具描述供注入到提示词中。5.2 工具调用的完整闭环工具模式的编排逻辑在 demo_tool.py。一次典型调用流程是用户提问后generate_stream以toolstools自动注入工具声明、stop_sequences[|user|, |observation|]启动流式生成模型输出|assistant|特殊 token表示进入工具调用阶段页面切换到tool角色气泡模型生成形如工具名\npython\n{参数: ...}\n的调用内容遇到|observation|token 后前端用extract_code()提取出 JSON 参数块再以eval(code, {tool_call: tool_call}, {})解析出实际参数见 demo_tool.py通过dispatch_tool(tool, args)执行真实工具返回的观测结果以Observation:形式追加到历史随后模型基于观测继续生成最终回复。其中extract_code使用正则r([^\n]*)\n(.*?)提取最后一个代码块见 demo_tool.py。整个思考 → 调用 → 观察 → 再回答的多轮循环被for _ in range(5)限制最多 5 次避免模型陷入无限工具调用。5.3 Manual mode用 YAML 手工指定工具除自动注册外页面还提供Manual mode开关见 demo_tool.py。开启后你可以直接在文本框中用 YAML 定义工具列表默认填入一个get_current_weather示例见 demo_tool.py通过yaml.safe_load解析YAML 格式错误时页面会提示YAML format error in tools definition。需要注意的是手动模式下工具调用结果需要你自行填写——当模型发起调用时页面会提示Please provide tool call results below:并暂停由你把观测结果输入后继续。六、代码解释器模式Code Interpreter模型 Jupyter 的复杂任务执行由于拥有真实代码执行环境此模式下的模型能够胜任绘制图表、符号运算等复杂任务。模型的推理逻辑与工具模式类似但执行的工具是 Python 代码块运行在一个由jupyter_client管理的 Jupyter 内核中。6.1 Jupyter 内核封装demo_ci.py 中的CodeKernel类封装了与 Jupyter 内核的完整交互启动通过jupyter_client.KernelManager(kernel_nameIPYKERNEL, ...)以阻塞客户端启动内核start_kernel(stdoutPIPE, stderrPIPE)捕获输出执行execute(code)调用kernel.execute后用get_shell_msg/get_iopub_msg轮询执行状态直到收到execution_state idle管理提供shutdown()、restart()、interrupt()、is_alive()等方法支持内核生命周期管理。内核实例通过st.cache_resource缓存见 demo_ci.py避免每次交互重复启动。此模式下系统会注入一份专用于代码解释器的 SYSTEM_PROMPT见 demo_ci.py明确告知模型可以运行代码并得到结果出错时尽量改进代码不能联网用户上传文件默认存放于 /mnt/data/。6.2 执行结果文本与图片双通道execute(code, kernel)见 demo_ci.py解析内核返回结果输出text/plain时按文本处理超出truncate_length默认 1024截断并追加[TRUNCATED]输出image/png时通过b64_2_img()解码为 PIL Image并以Conversation(roleRole.OBSERVATION, content[Image], imageres)直接渲染到聊天流中见 demo_ci.py。正因为支持图片回传你可以直接对模型说用 Python 画一个爱心模型就会自动生成绘图代码、执行并把图片展示在页面上且会自动连续执行多个代码块直到它认为任务已完成——你只需描述任务不需要手写代码。6.3 特殊标记与多轮衔接与工具模式类似代码解释器也依赖特殊 token 驱动流程见 demo_ci.py|assistant|进入代码生成阶段页面切换到interpreter角色气泡|observation|提取最后一段代码块执行观测结果以Observation:形式回灌给模型执行在for _ in range(5)循环内进行最多可连续执行 5 轮代码。七、对话状态的底层机制Role 与特殊 token三种模式之所以能无缝切换并保持多轮上下文依赖 conversation.py 中定义的Role枚举。每个角色都映射到 ChatGLM3 的对话模板特殊 token角色对话模板表示界面气泡SYSTEM|system|无仅注入提示词USER|user|用户头像ASSISTANT/TOOL/INTERPRETER|assistant|助手 / 工具 / 解释器头像OBSERVATION|observation|用户头像观测结果preprocess_text()见 conversation.py负责把系统提示、工具列表与历史会话拼装成带这些特殊 token 的完整提示词工具模式下系统提示被替换为TOOL_PROMPTAnswer the following questions as best as you can. You have access to the following tools:并把工具声明以 JSON 形式附加其后。模型正是依据|assistant|、|observation|这些标记来声明工具调用与观测的边界前端再据此切换界面状态。八、交互技巧与注意事项README 末尾还总结了两个实用技巧见 README.md结合 main.py 可以补充几点中断生成模型生成过程中点击页面右上角的Stop按钮即可打断输出清空历史刷新页面即可清空当前对话记录边栏的Clear History按钮也可一键清空Retry按钮则会删除最后一条用户消息之后的所有内容、让模型基于原问题重新生成逻辑见 demo_chat.py长输出Output length滑块最高可拉到 32000 token但需注意模型上下文窗口限制——当输入序列长度 max_new_tokens超过模型config.seq_length时client.py 会返回提示并终止生成请根据实际模型配置合理设置内核名称一致性如果通过ipython kernel install --name xxx注册了其他名称的内核必须用export IPYKERNELxxx同步设置否则 Code Interpreter 模式无法找到内核。九、总结composite_demo是体验 ChatGLM3 综合能力的最直观入口对话模式让采样参数与提示词调优变得可视化工具模式以register_tool装饰器提供了近乎零成本的工具扩展机制代码解释器模式则借助 Jupyter 内核把生成代码 → 执行 → 观察结果串成闭环支撑绘图、运算等复杂任务。配合 tool_registry.py、demo_ci.py 与 client.py 的源码你可以进一步把这套架构迁移到自己的应用自定义工具、替换模型加载方式如 int4 量化、P-Tuning 微调权重甚至复刻流式生成与特殊 token 驱动的前后端协议。Enjoy!赞分享大模型人工智能微调本地部署AI AgentRAG【免费下载链接】ChatGLM3ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型项目地址https://gitcode.com/gh_mirrors/ch/ChatGLM3点击查看免费下载相关推荐ChatGLM3-6B Code Interpreter 本地部署实战基于 AutoDL 构建代码解释器 DemoChatGLM3 6B Code Interpreter 本地部署实战基于 AutoDL 构建代码解释器 Demo 本篇指南基于开源仓库 Datawhale大模型人工智能教程本地部署微调Llama 3.2 文本模型 Prompt 格式全解析多轮对话、零样本函数调用与代码解释器实战指南Llama 3.2 文本模型 Prompt 格式全解析多轮对话、零样本函数调用与代码解释器实战指南 导读 本文以 llama models 仓库中 text_人工智能AI 应用AI Agent多智能体RAG教育后端前端OpenDeRisk社区贡献指南如何参与开源项目并扩展功能OpenDeRisk社区贡献指南如何参与开源项目并扩展功能 OpenDeRisk作为一款AI原生风险智能系统为应用系统提供7 24小时的全面深度保护。本指南人工智能AI 应用AI Agent多智能体根因分析运维RAG后端前端告警日志分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Tecplot云图绘制核心原理:坐标点与数据点的空间映射

Tecplot云图绘制核心原理:坐标点与数据点的空间映射

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/4 8:17:53
C语言开发国际象棋项目:从规则解析到EasyX图形界面实战

C语言开发国际象棋项目:从规则解析到EasyX图形界面实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/4 8:17:53
MTPLX 故障排查清单:doctor 诊断命令与 10 类常见问题速修手册

MTPLX 故障排查清单:doctor 诊断命令与 10 类常见问题速修手册

MTPLX 故障排查清单:doctor 诊断命令与 10 类常见问题速修手册 【免费下载链接】MTPLX The fastest way to run Qwen 3.8 Flash Next, Qwen 3.8 27B and Ternary Bonsai 2 27B on a Mac: 125 tok/s in OpenCode on an M5 Max, and a 27B model on 16 GB Macs. Native MTP specu…

📅 2026/10/4 8:17:53
MORE NEWS

更多资讯

📰

用Python Tkinter开发反应力测试小游戏:GUI编程与事件驱动实战

前阵子整理电脑里的 Python 练习项目,翻到一个很早写的“测反应力”小游戏。东西不复杂,核心就一个按钮、一个计时器、几个状态切换,但确实是练Python GUI编程特别合适的入门项目。很多人一提到图形化小游戏,总觉得得用 pygame 这…

📰

Claude Code Skills 简介:用 SKILL.md 与 Progressive Disclosure 构建 Agent Skills

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

MRAM与TM4C1299在工业嵌入式存储中的应用实践

做工业嵌入式这行,和数据打交道是躲不掉的。最近一个项目中,我用了 Everspin 的 MR25H40CDF(4Mbit SPI MRAM),搭配 TI 的 TM4C1299KCZAD(Cortex-M4F 主控,120MHz 主频),专…

📰

SPI MRAM与TM4C1299的工业存储实践:掉电不丢数据

做工业设备的这几年,我越来越觉得“存数据”比“算数据”更考验人。工控现场要记报警、存参数、保存掉电瞬间的状态,传统方案要么用EEPROM慢慢磨,要么用Flash先擦后写,动不动还得加个电池。直到接触了 Everspin 的 MR25H40CDF 这颗…

📰

基于价值认同与ADMM的需求侧电能共享分布式交易策略及Matlab实现

最近总有人拿着类似的题目来找我讨论:需求侧的电能共享交易,为什么一定要"分布式"?"价值认同"这种词,听着就像从社会学论文里搬过来的,怎么翻译成能写进Matlab的矩阵?其实这两个问题本…

📰

AI硬件设计辅助:构建视觉感知层让AI看懂电路图纸

把 AI 请进硬件设计流程,最难的不是让 AI 学会“理解”原理图,而是先让它“看得见”。这个系列前一篇把整体问题定义清楚了,这篇专门拆解视觉感知层:怎么让 AI 像工程师一样,对着原理图、PCB 截图、规格书扫描件&#…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬