
大模型人工智能微调本地部署AI AgentRAG【免费下载链接】ChatGLM3ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型项目地址https://gitcode.com/gh_mirrors/ch/ChatGLM3点击查看免费下载本文以仓库composite_demo目录下的 README_en.md 为骨架系统讲解 ChatGLM3 官方复合 Web Demo 的安装、启动与三种核心交互模式对话 Chat、工具 Tool、代码解释器 Code Interpreter并结合该目录下的main.py、tool_registry.py、client.py、demo_ci.py等源码逐一验证实现细节。读完本文你将掌握如何一键在本地启动该 Demo、如何用register_tool扩展模型工具能力、如何在 Jupyter 内核中让模型自动编写并执行代码以及如何通过环境变量与侧边栏参数精确控制模型的推理行为。一、Demo 概览一个页面承载三种能力ChatGLM3 Composite Web Demo 是一个基于Streamlit构建的单页应用它把 ChatGLM3 最常用的三种交互形态整合到同一界面中通过顶部的单选按钮 Chat、️ Tool、 Code Interpreter随时切换Chat对话模式与模型进行纯文本多轮对话Tool工具模式模型在对话之外可以调用注册好的外部工具完成操作Code Interpreter代码解释器模式模型在一个 Jupyter 内核环境中执行代码、读取执行结果从而完成绘图、符号运算等复杂任务。Demo 的主页面外观如下整个 Demo 的代码组织非常清晰详见 composite_demo 目录文件职责main.pyStreamlit 入口负责侧边栏参数、模式切换与三个子模块的调度demo_chat.py对话模式的核心逻辑demo_tool.py工具模式的界面与工具调用循环demo_ci.py代码解释器模式封装 Jupyter 内核的启动与代码执行client.py模型加载与流式生成客户端HFClientconversation.py对话轮次Conversation数据结构与 ChatGLM3 特殊 token|system|、|user|、|assistant|、|observation|的封装tool_registry.py工具的注册、描述生成与分发执行main.py的核心调度逻辑如下对应 main.py根据当前选中的模式把侧边栏的生成参数分别传给demo_chat.main、demo_tool.main或demo_ci.main其中 Tool 与 Code Interpreter 模式额外传入truncate_length1024用于截断过长的工具返回结果。二、环境安装与依赖官方文档建议通过Conda管理环境。依次执行以下命令创建环境并安装依赖conda create -n chatglm3-demo python3.10 conda activate chatglm3-demo pip install -r requirements.txt请注意本项目要求 Python 3.10 或更高版本。requirements.txt见 composite_demo/requirements.txt声明的依赖包括huggingface_hub0.19.4提供流式生成响应类型TextGenerationStreamResponsepillow10.1.0用于在代码解释器模式中解码并展示模型生成的 PNG 图片pyyaml6.0.1用于工具模式手动模式下解析 YAML 格式的工具定义requests2.31.0内置天气工具访问外部天气服务ipykernel6.26.0、ipython8.18.1、jupyter_client8.6.0为 Code Interpreter 模式提供 Jupyter 内核运行环境。除了 Python 依赖之外使用 Code Interpreter 模式还必须将当前环境注册为 Jupyter 内核否则demo_ci.py无法启动代码执行后端ipython kernel install --name chatglm3-demo --user该命令会把名为chatglm3-demo的 IPython 内核安装到当前用户目录demo_ci.py中通过jupyter_client.KernelManager(kernel_nameIPYKERNEL, ...)按名字加载它见 demo_ci.py。三、启动 Demo 与环境变量安装完成后在composite_demo目录下执行streamlit run main.py命令执行后终端会打印 Demo 的访问地址点击即可打开页面。首次访问时程序会下载并加载模型可能需要花费较长时间——因为默认模型来源是 Hugging Face 上的THUDM/chatglm3-6b。如果模型已经下载到本地或者需要调整加载方式可以通过环境变量控制相关取值可直接在源码中找到依据环境变量默认值作用源码位置MODEL_PATHTHUDM/chatglm3-6b指定模型路径可指向本地目录client.pyTOKENIZER_PATH与MODEL_PATH相同指定分词器路径client.pyPT_PATH无指定 P-Tuning v2 微调 checkpoint 目录加载后会将prefix_encoder权重注入模型client.pyPRE_SEQ_LEN128P-Tuning v2 前缀序列长度client.pyIPYKERNELchatglm3-demo自定义 Code Interpreter 使用的 Jupyter 内核名称demo_ci.py典型用法如下export MODEL_PATH/path/to/model export IPYKERNELkernel_name streamlit run main.py从源码看模型加载统一走client.py中的HFClient见 client.py使用AutoTokenizer.from_pretrained(..., trust_remote_codeTrue)加载分词器模型则通过AutoModel.from_pretrained(..., trust_remote_codeTrue, device_mapauto).eval()自动分配设备若设置了PT_PATH且目录存在则会以pre_seq_lenPRE_SEQ_LEN加载配置并把 checkpoint 中transformer.prefix_encoder.前缀的状态字典装入模型。源码注释中还提示如需使用 int4 量化模型可在.eval()前追加.quantize(bits4, devicecuda).cuda()但int4 模型必须在 CUDA 上加载。get_client()被st.cache_resource装饰确保整个 Streamlit 会话期间模型只加载一次。四、对话模式Chat用侧边栏参数精确控制生成对话模式下用户可以直接在左侧边栏修改生成参数来调整模型行为参数默认值均取自 main.pytop_p取值0.0 ~ 1.0默认0.8步长0.01控制核采样概率temperature取值0.0 ~ 1.5默认0.95步长0.01控制随机性repetition_penalty取值0.0 ~ 2.0默认1.1步长0.01抑制重复Output lengthmax_new_tokens取值5 ~ 32000默认256控制最大新生成 token 数System Prompt仅对对话模式生效的文本域默认值为 “You are ChatGLM3, a large language model trained by Zhipu.AI. Follow the users instructions carefully. Respond using markdown.”可在界面中随时修改。侧边栏还提供Clear History清空历史与Retry重试两个按钮其中 Retry 会找到最近一条用户消息并删除其之后的历史后重新生成见 demo_chat.py。对话模式的流式生成在 demo_chat.py 中实现调用client.generate_stream(...)时传入do_sampleTrue及上述采样参数并设置stop_sequences[str(Role.USER)]即遇到|user|特殊 token 时停止生成生成过程中流式返回的每个 token 会实时通过postprocess_text清洗并渲染到页面带▌光标闪烁效果遇到特殊 token 则退出循环并把完整回复追加进历史。此外client.py中的stream_chat还内置了InvalidScoreLogitsProcessor见 client.py一旦检测到 logits 中出现 NaN 或 Inf就将分数清零并给索引 5 的位置赋一个大值防止数值异常导致生成崩溃。五、工具模式Tool一行装饰器扩展模型能力工具模式是 ChatGLM3 复合 Demo 最具扩展性的部分。通过注册新工具即可增强模型能力而注册方式极其简单使用register_tool装饰函数即可详见 tool_registry.py。注册规则文档 源码双重确认工具名称 函数名func.__name__工具描述 函数 docstringinspect.getdoc(func)工具参数 函数签名中的参数必须使用Annotated[typ, description, required]标注类型、描述与是否必填。register_tool会校验每个参数缺少类型标注、未使用typing.Annotated、描述不是字符串、required不是布尔值都会抛出TypeError见 tool_registry.py。官方文档给出的最小注册示例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 ...仓库自带的真实实现见 tool_registry.py在此基础上调用了公共天气服务wttr.in解析 JSON 后返回温度、体感温度、湿度、天气描述与观测时间等字段并对请求异常做了兜底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 ... resp requests.get(fhttps://wttr.in/{city_name}?formatj1) ...除get_weather外仓库还预置了两个演示工具random_number_generator(seed, range)按指定随机种子与整数区间生成随机数tool_registry.pyget_shell(query)在 Linux shell 中执行命令并返回标准输出tool_registry.py注意该工具会直接运行任意命令仅在本地可信环境使用。注册后的工具会同时写入两个字典_TOOL_HOOKS[tool_name] func用于实际调用_TOOL_DESCRIPTIONS[tool_name] tool_def用于生成给模型看的工具声明get_tools()返回其深拷贝tool_registry.pydispatch_tool(tool_name, tool_params)则负责按名分发调用并捕获异常tool_registry.py。工具模式的实际效果如下图所示——模型在对话中主动发起天气查询工具调用工具调用循环与特殊 token在 demo_tool.py 中可以看到完整的工具调用循环模型输出遇到|assistant|特殊 token 时切换到工具消息气泡遇到|observation|时则从输出文本中提取“工具名 调用参数代码块”用extract_code抓取最后的 代码块再通过eval(code, {tool_call: tool_call}, {})把tool_call(...)形式的调用解析为参数字典随后调用dispatch_tool(tool, args)并弹出 spinner“Calling tool ...”等待执行结果返回结果超过truncate_lengthDemo 中为 1024时会截断并追加[TRUNCATED]标记。整个循环最多迭代 5 轮防止模型陷入无限工具调用。手动模式Manual mode用 YAML 自定义工具列表在工具模式页面中还可以通过Manual mode开关进入手动模式见 demo_tool.py。在该模式下页面会展开一个 YAML 文本域你可以直接以 YAML 形式定义任意工具列表文本域预填充了 OpenAI 风格的get_current_weather示例包含parameters.properties与required字段见 demo_tool.py- 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手动模式下工具定义通过yaml.safe_load解析格式错误会提示 “YAML format error in tools definition”但工具的实际输出需要你手动填写并反馈给模型——页面会显示 “Please provide tool call results below:” 提示由人来扮演工具执行者。这适合快速验证自定义工具的声明格式或接入尚未写进tool_registry.py的临时工具。六、代码解释器模式Code Interpreter让模型写代码、跑代码、看结果由于拥有代码执行环境该模式下的模型能够完成更为复杂的任务例如绘制图表、执行符号运算等。模型会根据自身对任务完成情况的理解自动连续执行多个代码块直到认为任务完成因此在这一模式下你只需要指明希望模型执行的任务即可。代码执行后端由 demo_ci.py 中的CodeKernel类封装demo_ci.py构造时基于jupyter_client.KernelManager启动名为IPYKERNEL默认chatglm3-demo的后端内核并通过blocking_client()建立代码客户端execute(code)提交代码后等待最多 30 秒获取 shell 消息与 IOPub 输出轮询直到内核进入idle状态提供execute_interactive、inspect、get_error_msg、restart、interrupt、shutdown等管理方法get_kernel()被st.cache_resource装饰同一会话内复用内核实例避免反复重启。代码执行结果由execute(code, kernel)demo_ci.py处理支持text/plain文本输出与image/png图片输出两种形态——图片输出会通过b64_2_img解码为PIL.Image直接渲染在聊天界面中demo_ci.py文本输出超长时同样按truncate_length截断。此外该模式自带一段中文系统提示词demo_ci.py声明模型连接着一台不能联网的电脑、可运行 Python 代码、可处理用户上传到/mnt/data/的文件并在出错时改进代码。官方文档给出的经典示例是让 ChatGLM3 画一个爱心模型自动生成绘图代码、执行并在页面中展示结果从 demo_ci.py 的生成循环可以看到该模式同样以|assistant|、|observation|特殊 token 为节点驱动多轮“生成代码 → 执行 → 返回观察结果”的循环最多迭代 5 轮执行时页面显示 “Executing code...” 的 spinner观察结果会以Role.OBSERVATION追加进历史供模型在下一轮生成中参考。七、交互细节与提示停止生成模型生成文本时点击页面右上角的Stop按钮可以随时打断当前流式输出清空历史刷新页面即可清空对话记录侧边栏的Clear History按钮也能做到main.py 中点击后会把prompt_text置空各子模块检测到空输入即清空会话历史多轮上下文三种模式都会把对话历史以Conversation角色 内容的形式保存在st.session_state中并通过 conversation.py 中的Role枚举映射为 ChatGLM3 的特殊 token|system|、|user|、|assistant|、|observation|从而保证模型理解完整的对话与工具调用脉络。八、结语从整体实现看ChatGLM3 Composite Web Demo 是理解 ChatGLM3 三大多模态交互范式的绝佳入口main.py负责把界面参数与三种模式串起来tool_registry.py提供了极简的register_tool工具扩展机制demo_ci.py展示了如何把模型与 Jupyter 内核对接成可执行代码的智能体。如果你想快速体验 ChatGLM3 的对话、工具调用与代码执行能力或在此基础上开发自己的多工具智能体界面直接以本文为指引克隆并运行composite_demo即可——更详细的逐行实现还可以继续阅读 composite_demo 目录下的全部源码。Enjoy!赞分享大模型人工智能微调本地部署AI AgentRAG【免费下载链接】ChatGLM3ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型项目地址https://gitcode.com/gh_mirrors/ch/ChatGLM3点击查看免费下载相关推荐Beads Docker部署容器化你的AI任务跟踪系统Beads Docker部署容器化你的AI任务跟踪系统 Beads作为一款强大的AI任务跟踪系统能为你的开发流程提供智能记忆升级。通过Docker容器化部署前端UI组件Remotion 文档交互式 Demo 系统从组件到 Demo 注册的完整实践Remotion 文档交互式 Demo 系统从组件到 Demo 注册的完整实践 本文以 Remotion 仓库中的技能文档 .agents/skills/d音视频AI 应用前端Spring Boot Admin 客户端注册完全指南三种注册方式与源码级实现解析Spring Boot Admin 客户端注册完全指南三种注册方式与源码级实现解析 Spring Boot Admin 为 Spring Boot 应用提供管后端可观测性指标监控监控大盘MCP 服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考