GLM-4.7-Flash

对标题的评论会显示在这里

01-GLM-4.7-Flash vLLM 部署调用

对这一段的评论会显示在这里

vLLM 简介

对这一段的评论会显示在这里

vLLM 框架是一个高效的大语言模型推理和部署服务系统,具备以下特性:

对这一段的评论会显示在这里

高效的内存管理:通过 PagedAttention 算法,vLLM 实现了对 KV 缓存的高效管理,减少了内存浪费,优化了模型的运行效率。
高吞吐量vLLM 支持异步处理和连续批处理请求,显著提高了模型推理的吞吐量,加速了文本生成和处理速度。
易用性vLLMHuggingFace 模型无缝集成,支持多种流行的大型语言模型,简化了模型部署和推理的过程。兼容 OpenAIAPI 服务器。
分布式推理:框架支持在多 GPU 环境中进行分布式推理,通过模型并行策略和高效的数据通信,提升了处理大型模型的能力。
开源共享vLLM 由于其开源的属性,拥有活跃的社区支持,这也便于开发者贡献和改进,共同推动技术发展。

对这一段的评论会显示在这里

环境准备

对这一段的评论会显示在这里

本文基础环境如下:

对这一段的评论会显示在这里
----------------
ubuntu 22.04
python 3.12.3
cuda 12.8
pytorch 2.8.0
----------------
对这一段的评论会显示在这里

本文默认学习者已配置好以上 Pytorch (cuda) 环境,如未配置请先自行安装。

对这一段的评论会显示在这里

首先 pip 换源加速下载并安装依赖包

对这一段的评论会显示在这里
python -m pip install --upgrade pip
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip install modelscope
pip install vllm>=0.10.0
对这一段的评论会显示在这里

考虑到部分同学配置环境可能会遇到一些问题,我们在 ucloud 平台准备了 GLM-4.7-Flash 的环境镜像,点击下方链接并直接创建 ucloud 示例即可。 datawhalechina/self-llm/GLM-4.7-Flash-VLLM | AutoDL

对这一段的评论会显示在这里

模型下载

对这一段的评论会显示在这里

使用 modelscope 中的 snapshot_download 函数下载模型,第一个参数为模型名称,参数 cache_dir 为模型的下载路径。

对这一段的评论会显示在这里

新建 model_download.py 文件并在其中输入以下内容,粘贴代码后记得保存文件。

对这一段的评论会显示在这里
from modelscope import snapshot_download

model_dir = snapshot_download('ZhipuAI/GLM-4.7-Flash', cache_dir='your_model_dir', revision='master')
对这一段的评论会显示在这里

然后在终端中输入 python model_download.py 执行下载,这里需要耐心等待一段时间直到模型下载完成。

对这一段的评论会显示在这里

注意:记得修改 cache_dir 为你的模型下载路径哦~

对这一段的评论会显示在这里

代码准备

对这一段的评论会显示在这里

Python 脚本

对这一段的评论会显示在这里

新建 vllm_model.py 文件并在其中输入以下内容,粘贴代码后请及时保存文件。下面的代码有很详细的注释,如有不理解的地方,欢迎大家提 issue

对这一段的评论会显示在这里

首先从 vLLM 库中导入 LLMSamplingParams 类。LLM 类是使用 vLLM 引擎运行离线推理的主要类。SamplingParams 类指定采样过程的参数,用于控制和调整生成文本的随机性和多样性。

对这一段的评论会显示在这里

vLLM 提供了非常方便的封装,我们直接传入模型名称或模型路径即可,不必手动初始化模型和分词器。

对这一段的评论会显示在这里

然后,通过使用分词器的 apply_chat_template 函数,将我们的 prompt(提示词)格式化为模型所需的输入格式。

对这一段的评论会显示在这里

我们可以通过这个代码示例熟悉下 vLLM 引擎的使用方式。被注释的部分内容可以丰富模型的能力,但不是必要的,大家可以按需选择,自己多多动手尝试 ~

对这一段的评论会显示在这里
from vllm import LLM, SamplingParams
from transformers import AutoTokenizer
import os
import json

# 自动下载模型时,指定使用modelscope; 否则,会从HuggingFace下载
os.environ['VLLM_USE_MODELSCOPE']='True'

def get_completion(prompts, model, tokenizer=None, temperature=0.6, top_p=0.95, top_k=20, min_p=0, max_tokens=4096, max_model_len=8192):
    stop_token_ids = [151645, 151643]
    # 创建采样参数。temperature 控制生成文本的多样性,top_p 控制核心采样的概率,top_k 通过限制候选词的数量来控制生成文本的质量和多样性, min_p 通过设置概率阈值来筛选候选词,从而在保证文本质量的同时增加多样性
    sampling_params = SamplingParams(temperature=temperature, top_p=top_p, top_k=top_k, min_p=min_p, max_tokens=max_tokens, stop_token_ids=stop_token_ids)  # max_tokens 用于限制模型在推理过程中生成的最大输出长度
    # 初始化 vLLM 推理引擎
    llm = LLM(model=model, tokenizer=tokenizer, max_model_len=max_model_len,trust_remote_code=True, tensor_parallel_size=4)  # max_model_len 用于限制模型在推理过程中可以处理的最大输入和输出长度之和。
    outputs = llm.generate(prompts, sampling_params)
    return outputs


if __name__ == "__main__":
    # 初始化 vLLM 推理引擎
    model='/root/autodl-fs/ZhipuAI/GLM-4.7-Flash' # 指定模型路径
    tokenizer = AutoTokenizer.from_pretrained(model) # 加载分词器

    prompt = "给我一个关于大模型的简短介绍。"
    messages = [
        {"role": "user", "content": prompt}
    ]
    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True,
        enable_thinking=True  # 是否开启思考模式,默认为 True
    )

    outputs = get_completion(text, model, tokenizer=None, temperature=0.6, top_p = 0.95, top_k=20, min_p=0)  # 对于思考模式,官方建议使用以下参数:temperature = 0.6,TopP = 0.95,TopK = 20,MinP = 0。

    # 输出是一个包含 prompt、生成文本和其他信息的 RequestOutput 对象列表。
    # 打印输出。
    for output in outputs:
        prompt = output.prompt
        generated_text = output.outputs[0].text
        print(f"Prompt: {prompt!r}, \nResponse: {generated_text!r}")
对这一段的评论会显示在这里

运行代码

对这一段的评论会显示在这里
python vllm_model.py
对这一段的评论会显示在这里

结果如下:

对这一段的评论会显示在这里
Prompt: '[gMASK]<sop><|user|>给我一个关于大模型的简短介绍。<|assistant|><think>', 
Response: '1. **分析用户请求:**\n    *   **主题:** 大语言模型(LLM)。\n    *   **格式:** 简短介绍。\n    *   **语言:** 中文(简体)。\n\n2.  **确定大语言模型介绍的关键组成部分:**\n    *   **定义:** 它是什么?(基于深度学习的AI模型,使用海量文本数据进行训练)。\n    *   **机制:** 它是如何工作的?(预测下一个词,神经网络,Transformer架构)。\n    *   **能力:** 它能做什么?(文本生成、翻译、摘要、问答、代码编写)。\n    *   **意义:** 为什么它很重要?(通用人工智能的里程碑,赋能各种应用)。\n\n3.  **起草 - 迭代1(心理大纲):**\n    大语言模型是像GPT-4或LLaMA这样的AI。它们阅读了互联网上的大量文本。它们学习语言模式来预测下一个词。它们可以写文章、回答问题和翻译。它们是AI领域的一个大突破。\n\n4.  **润色 - 迭代2(增加专业语调并精简):**\n    大语言模型(LLM)是一种基于深度学习的AI模型。它们通过阅读海量文本数据来学习语言规律。核心机制是预测下一个词。它们能完成写作、翻译、编程等任务。它们代表了人工智能的重要进步。\n\n5.  **打磨 - 迭代3(构建影响力与清晰度):**\n    *   *标题:* 清晰的定义。\n    *   *核心:* 数据 + 架构(Transformer)。\n    *   *功能:* 生成与理解。\n    *   *影响:* 生产力。\n\n    *草稿:*\n    **大语言模型(LLM)** 是一种基于深度学习的人工智能技术,其核心是通过处理海量文本数据来学习人类语言的模式和逻辑。\n\n    **主要特点:**\n    1.  **海量训练:** 读取互联网上的书籍、文章、代码等数据。\n    2.  **预测机制:** 基于上下文,预测下一个最可能出现的字或词。\n    3.  **通用能力:** 具备理解、生成、翻译、总结和问答等多种能力。\n\n    **总结:** 它们是当前AI领域的核心突破,能够像人类一样进行流畅的文本交互,极大地提升了信息处理效率。\n\n6.  **最终审查:** 这是否满足“简短介绍”的要求?是的。它涵盖了定义、机制、功能,并以一个简洁的总结结尾。它易于阅读。\n\n7.  **最终输出生成**(与迭代3中的思维过程相匹配)。</think>**大语言模型** 是一种基于深度学习的人工智能技术,其核心是通过处理海量文本数据来学习人类语言的模式和逻辑。\n\n**简单来说,它有以下几个关键点:**\n\n1.  **海量训练:** 就像读完了互联网上几乎所有的书籍、文章和代码,从中提取语言规律。\n2.  **预测机制:** 它的核心工作原理是根据前面的内容,预测下一个最可能出现的字或词。\n3.  **通用能力:** 它不仅能写文章、写代码,还能进行翻译、总结、回答问题甚至进行创意写作。\n\n**总结:** 大模型是目前人工智能领域最先进的成果之一,它让机器具备了像人类一样流畅理解和使用语言的能力。'
对这一段的评论会显示在这里

模型的 response 由两部分组成,一部分是思考过程,用\和\包裹住,另一部分是最终答案,在\标识符之后。

对这一段的评论会显示在这里

创建兼容 OpenAI API 接口的服务器

对这一段的评论会显示在这里

GLM-4.7-Flash 兼容 OpenAI API 协议,所以我们可以直接使用 vLLM 创建 OpenAI API 服务器。vLLM 部署实现 OpenAI API 协议的服务器非常方便。默认会在 http://localhost:8000 启动服务器。服务器当前一次托管一个模型,并实现列表模型、completionschat completions 端口。

对这一段的评论会显示在这里

completions:是基本的文本生成任务,模型会在给定的提示后生成一段文本。这种类型的任务通常用于生成文章、故事、邮件等。
chat completions:是面向对话的任务,模型需要理解和生成对话。这种类型的任务通常用于构建聊天机器人或者对话系统。

对这一段的评论会显示在这里

在创建服务器时,我们可以指定模型名称、模型路径、聊天模板等参数。

对这一段的评论会显示在这里

--host--port 参数指定地址。
--model 参数指定模型名称。
--chat-template 参数指定聊天模板。
--served-model-name 指定服务模型的名称。
--max-model-len 指定模型的最大长度。
--reasoning-parser 指定如何解析模型生成的推理内容。设置 --enable-reasoning 参数时,--reasoning-parser 是必需的。推理模型会在输出中包含一个额外的 reasoning_content 字段,该字段包含导致最终结论的推理步骤。通过指定合适的解析器,可以正确提取和格式化这些推理内容。

对这一段的评论会显示在这里

我们复制以下命令到终端上,就可以成功启动 GLM-4.7-Flash 模型的 API 接口

对这一段的评论会显示在这里
vllm serve /root/autodl-fs/ZhipuAI/GLM-4.7-Flash \
     --tensor-parallel-size 4 \
     --speculative-config.method mtp \
     --speculative-config.num_speculative_tokens 1 \
     --tool-call-parser glm47 \
     --reasoning-parser glm45 \
     --enable-auto-tool-choice \
     --served-model-name glm-4.7-flash
对这一段的评论会显示在这里

加载完毕后出现如下信息说明服务成功启动

对这一段的评论会显示在这里
01-01
01-01
对这一段的评论会显示在这里

使用 curl 命令测试 OpenAI Completions API

对这一段的评论会显示在这里
curl http://localhost:8000/v1/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "glm-4.7-flash",
        "prompt": "我想问你,5的阶乘是多少?<think>\n",
        "max_tokens": 1024,
        "temperature": 0
    }'
对这一段的评论会显示在这里

得到的返回值如下所示

对这一段的评论会显示在这里
{
    "id": "cmpl-aad3ef9bd715b799",
    "object": "text_completion",
    "created": 1770185345,
    "model": "glm-4.7-flash",
    "choices": [
        {
            "index": 0,
            "text": "1.  **分析用户请求:** 用户正在用中文询问“5的阶乘是多少?”(5的阶乘是多少?)。\n\n2.  **识别核心概念:** “阶乘”指的是一个从1到给定正整数 $n$ 的所有整数的乘积。它通常表示为 $n!$。\n\n3.  **确定具体数值:** 用户询问的是 $5!$。\n\n4.  **执行计算:**\n    *   $5! = 5 \\times 4 \\times 3 \\times 2 \\times 1$\n    *   $5 \\times 4 = 20$\n    *   $20 \\times 3 = 60$\n    *   $60 \\times 2 = 120$\n    *   $120 \\times 1 = 120$\n\n5.  **构思回答:**\n    *   直接回答:120。\n    *   可选但有用的背景信息:解释阶乘是什么($1 \\times 2 \\times 3 \\times \\dots \\times n$)。\n    *   语言:中文,与提示相匹配。\n\n6.  **起草回复(内心独白/草稿):**\n    *   *草稿 1:* 5的阶乘是120。\n    *   *草稿 2(更详细):* 5的阶乘(5!)等于 5 × 4 × 3 × 2 × 1 = 120。\n\n7.  **最终润色:** 草稿 2 是最好的。它清晰、简洁,并提供了计算过程。\n\n8.  **最终输出生成:** (与草稿 2 匹配)。\n    5的阶乘(5!)等于 5 × 4 × 3 × 2 × 1,结果是 **120**。</think>5的阶乘(5!)等于 5 × 4 × 3 × 2 × 1,结果是 **120**。",
            "logprobs": null,
            "finish_reason": "stop",
            "stop_reason": 154827,
            "token_ids": null,
            "prompt_logprobs": null,
            "prompt_token_ids": null
        }
    ],
    "service_tier": null,
    "system_fingerprint": null,
    "usage": {
        "prompt_tokens": 11,
        "total_tokens": 432,
        "completion_tokens": 421,
        "prompt_tokens_details": null
    },
    "kv_transfer_params": null
}
对这一段的评论会显示在这里

Python 脚本请求 OpenAI Completions API

对这一段的评论会显示在这里
from openai import OpenAI
openai_api_key = "sk-xxx" # 随便填写,只是为了通过接口参数校验
openai_api_base = "http://localhost:8000/v1"

client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)

chat_outputs = client.chat.completions.create(
    model="glm-4.7-flash",
    messages=[
        {"role": "user", "content": "什么是算法?"},
    ]
)
print(chat_outputs)
对这一段的评论会显示在这里
python vllm_openai_completions.py
对这一段的评论会显示在这里

得到的返回值如下所示

对这一段的评论会显示在这里
ChatCompletion(id='chatcmpl-9c75c2da0a63ae6e', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='**算法(Algorithm)** 是解决特定问题的一系列清晰、明确的指令。\n\n你可以把它想象成一个**详细的菜谱**或**给朋友的指路说明**:\n\n1.  **输入**:你需要什么材料或数据?(例如:我要切哪些菜)\n2.  **处理步骤**:必须按顺序完成的动作?(例如:先切葱,再起锅烧油,然后下菜翻炒均匀。不能先炒菜再切葱。)\n3.  **输出**:这道菜或者路线最终的结果是什么?(例如:一盘炒好的葱爆羊肉,或者你到达目的地的地图。)\n\n### 算法的几个核心特征\n\n在计算机科学中,一个严谨的算法通常需要满足以下五个特点:\n\n1.  **确定性**:每一步指令都必须是毫无歧义的,不能模棱两可。\n2.  **有限性**:算法必须在执行有限步之后结束,不能无限循环下去。\n3.  **输入**:一个算法有零个或多个输入(不需要算也可以开始)。\n4.  **输出**:一个算法至少会产生一个或多个结果。\n5.  **可行性**:算法中的每一步操作都必须是能够通过执行有限次完成的(即现实可行的)。\n\n### 生活中的常见例子\n\n虽然听起来很高级,但其实算法无处不在:\n\n*   **数学计算**:计算三角形面积 ($S = \\frac{1}{2} \\times a \\times b \\times \\sin(C)$) 这本身就是一个简单的算法。\n*   **搜索引擎**:当你输入“今天天气”时,搜索引擎背后的算法会抓取数据、计算相关性、并进行排序,最后给出结果。\n*   **GPS 导航**:算法计算道路距离、拥堵情况,为你规划出一条最快的行驶路线。\n*   **推荐系统**:像抖音、淘宝或 Netflix 这样的平台,都在使用算法来分析你的浏览习惯,猜你喜欢看什么或买什么。\n*   **排序**:将一列数字从小到大排列,无论是手动还是电脑,都遵循着特定的排序算法逻辑。\n\n简单来说,**算法就是让计算机(或人)完成任务的具体操作规程。**', refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=[], reasoning='1. **分析用户请求:** 用户在问“什么是算法?”(中文)。\n\n2. **识别意图:** 核心目标是寻求对“算法”这一概念的定义和解释。这是一个标准的、教育性的查询。\n\n3. **检查安全性:** 该请求是良性的。它没有违反任何安全准则(没有仇恨言论、危险内容、色情内容、个人身份信息 PII 等)。没有尝试越狱或提取系统提示词。\n\n4. **确定解释的深度:**\n    *   *基础定义:* 算法是一系列清晰、可执行的指令。\n    *   *类比:* 使用一个平实的类比(如食谱、给朋友指路)让它变得易于理解。\n    *   *关键特性:* 提及电脑科学中通常要求什么(输入/输出、有限性、确定性、可行性)。\n    *   *例子:* 数学公式、搜索引擎排序、GPS 导航、推荐算法(例如 Netflix)。\n    *   *重要性:* 解释它们在技术和社会中的角色。\n\n5. **起草回复(内心独白/中文初稿):**\n    *   首先进行简单定义:算法是一组解决问题或执行特定任务的规则。\n    *   使用“菜谱”类比:就像做菜,有步骤(切菜、炒菜)。\n    *   电脑科学的语境:信息处理、数据解析、数学计算。\n    *   5 个关键特征:\n        1.  输入(输入)\n        2.  输出(输出)\n        3.  有限性(有限性)——不能永远循环。\n        4.  确定性(确定性)——每一步都定义明确。\n        5.  可行性(可行性)——每一步都可以执行。\n    *   现实世界的例子:\n        *   简单:排序数字。\n        *   复杂:Google 搜索、TikTok 推荐算法、物流(路线规划)。\n    *   结论:它们是现代科技的“大脑”或“引擎”。\n\n6. **完善和格式化:** 使用项目符号使其结构化,以提高可读性。确保语气乐于助人且信息量大。\n\n7. **最终润色(中文):**\n    *   **定义:** 算法是一套定义明确的指令序列。\n    *   **类比:** 比如“菜谱”或“步骤说明书”。\n    *   **核心特征:** 有输入、有输出、有限步、确定性、可行性。\n    *   **例子:** 排序、搜索、推荐。\n\n8. **构建最终输出:**(着手根据这些点生成中文回复。)', reasoning_content='1. **分析用户请求:** 用户在问“什么是算法?”(中文)。\n\n2. **识别意图:** 核心目标是寻求对“算法”这一概念的定义和解释。这是一个标准的、教育性的查询。\n\n3. **检查安全性:** 该请求是良性的。它没有违反任何安全准则(没有仇恨言论、危险内容、色情内容、个人身份信息 PII 等)。没有尝试越狱或提取系统提示词。\n\n4. **确定解释的深度:**\n    *   *基础定义:* 算法是一系列清晰、可执行的指令。\n    *   *类比:* 使用一个平实的类比(如食谱、给朋友指路)让它变得易于理解。\n    *   *关键特性:* 提及电脑科学中通常要求什么(输入/输出、有限性、确定性、可行性)。\n    *   *例子:* 数学公式、搜索引擎排序、GPS 导航、推荐算法(例如 Netflix)。\n    *   *重要性:* 解释它们在技术和社会中的角色。\n\n5. **起草回复(内心独白/中文初稿):**\n    *   首先进行简单定义:算法是一组解决问题或执行特定任务的规则。\n    *   使用“菜谱”类比:就像做菜,有步骤(切菜、炒菜)。\n    *   电脑科学的语境:信息处理、数据解析、数学计算。\n    *   5 个关键特征:\n        1.  输入(输入)\n        2.  输出(输出)\n        3.  有限性(有限性)——不能永远循环。\n        4.  确定性(确定性)——每一步都定义明确。\n        5.  可行性(可行性)——每一步都可以执行。\n    *   现实世界的例子:\n        *   简单:排序数字。\n        *   复杂:Google 搜索、TikTok 推荐算法、物流(路线规划)。\n    *   结论:它们是现代科技的“大脑”或“引擎”。\n\n6. **完善和格式化:** 使用项目符号使其结构化,以提高可读性。确保语气乐于助人且信息量大。\n\n7. **最终润色(中文):**\n    *   **定义:** 算法是一套定义明确的指令序列。\n    *   **类比:** 比如“菜谱”或“步骤说明书”。\n    *   **核心特征:** 有输入、有输出、有限步、确定性、可行性。\n    *   **例子:** 排序、搜索、推荐。\n\n8. **构建最终输出:**(着手根据这些点生成中文回复。)'), stop_reason=154827, token_ids=None)], created=1770185962, model='glm-4.7-flash', object='chat.completion', service_tier=None, system_fingerprint=None, usage=CompletionUsage(completion_tokens=1019, prompt_tokens=8, total_tokens=1027, completion_tokens_details=None, prompt_tokens_details=None), prompt_logprobs=None, prompt_token_ids=None, kv_transfer_params=None)
对这一段的评论会显示在这里

Python 脚本请求 OpenAI Completions API

对这一段的评论会显示在这里
from openai import OpenAI

client = OpenAI(
    api_key="a", # 随便填写,只是为了通过接口参数校验
    base_url="http://localhost:8000/v1"
)

def add(a: float, b: float):
    return a + b

def mul(a: float, b: float):
    return a * b

def compare(a: float, b: float):
    if a > b:
        return f'{a} is greater than {b}'
    elif a < b:
        return f'{b} is greater than {a}'
    else:
        return f'{a} is equal to {b}'

def count_letter_in_string(a: str, b: str):
    string = a.lower()
    letter = b.lower()
  
    count = string.count(letter)
    return(f"The letter '{letter}' appears {count} times in the string.")


tools = [
{
    'type': 'function',
    'function': {
        'name': 'add',
        'description': 'Compute the sum of two numbers',
        'parameters': {
            'type': 'object',
            'properties': {
                'a': {
                    'type': 'int',
                    'description': 'A number',
                },
                'b': {
                    'type': 'int',
                    'description': 'A number',
                },
            },
            'required': ['a', 'b'],
        },
    }
}, 
{
    'type': 'function',
    'function': {
        'name': 'mul',
        'description': 'Calculate the product of two numbers',
        'parameters': {
            'type': 'object',
            'properties': {
                'a': {
                    'type': 'int',
                    'description': 'A number',
                },
                'b': {
                    'type': 'int',
                    'description': 'A number',
                },
            },
            'required': ['a', 'b'],
        },
    }
},
{
    'type': 'function',
    'function': {
        'name': 'count_letter_in_string',
        'description': 'Count letter number in a string',
        'parameters': {
            'type': 'object',
            'properties': {
                'a': {
                    'type': 'str',
                    'description': 'source string',
                },
                'b': {
                    'type': 'str',
                    'description': 'letter',
                },
            },
            'required': ['a', 'b'],
        },
    }
},
{
    'type': 'function',
    'function': {
        'name': 'compare',
        'description': 'Compare two number, which one is bigger',
        'parameters': {
            'type': 'object',
            'properties': {
                'a': {
                    'type': 'float',
                    'description': 'A number',
                },
                'b': {
                    'type': 'float',
                    'description': 'A number',
                },
            },
            'required': ['a', 'b'],
        },
    }
}
]

def function_call_playground(prompt):
    messages = [{'role': 'user', 'content': prompt}]
    response = client.chat.completions.create(
        model="glm-4.7-flash",
        messages = messages,
        temperature=0.01,
        top_p=0.95,
        stream=False,
        tools=tools)

    # print(response)
    func1_name = response.choices[0].message.tool_calls[0].function.name
    func1_args = response.choices[0].message.tool_calls[0].function.arguments
    func1_out = eval(f'{func1_name}(**{func1_args})')
    # print(func1_out)

    messages.append(response.choices[0].message)
    messages.append({
        'role': 'tool',
        'content': f'{func1_out}',
        'tool_call_id': response.choices[0].message.tool_calls[0].id
    })
    # print(messages)
    response = client.chat.completions.create(
        model="glm-4.7-flash",
        messages=messages,
        temperature=0.01,
        top_p=0.95,
        stream=False,
        tools=tools)
    return response.choices[0].message.content
  
prompts = [
    "用中文回答:strawberry中有多少个r?", 
    "用中文回答:9.11和9.9,哪个小?"
]

for prompt in prompts:
    print(function_call_playground(prompt))
对这一段的评论会显示在这里
python vllm_openai_completions.py
对这一段的评论会显示在这里

得到的返回值如下所示

对这一段的评论会显示在这里
在字符串"strawberry"中,字母'r'出现了3次。
9.11比9.9小。

根据比较结果,9.9比9.11大,所以9.11更小。
对这一段的评论会显示在这里

另外,在以上所有的在请求处理过程中, API 后端都会打印相对应的日志和统计信息:

对这一段的评论会显示在这里
01-02
01-02
对这一段的评论会显示在这里

02-GLM-4.7-Flash SGLang 部署调用

对这一段的评论会显示在这里

SGLang 简介

对这一段的评论会显示在这里

SGLang 是一款专为大语言模型(LLM)设计的高性能、自动化编程与推理加速框架。它在提升大模型在复杂任务编排、长上下文处理及高并发请求下的执行效率,是连接底层硬件算力与上层 AI 应用的高效桥梁。 对于开发者而言,SGLang 极大地简化了部署流程,后端一键启动:无需复杂的配置文件,一条命令即可完成环境适配与服务发布。前端无缝对接:直接沿用现有的 OpenAI SDK 或标准 HTTP 调用,无需额外的学习与适配成本。

对这一段的评论会显示在这里

环境准备

对这一段的评论会显示在这里

本文基础环境如下:

对这一段的评论会显示在这里
----------------
ubuntu 22.04
python 3.12
cuda 12.8
pytorch 2.9.1
----------------
对这一段的评论会显示在这里

本文默认学习者已配置好以上 Pytorch (cuda) 环境,如未配置请先自行安装。

对这一段的评论会显示在这里

首先 pip 换源加速下载并安装依赖包

对这一段的评论会显示在这里
python -m pip install --upgrade pip
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip install --upgrade pip
pip install modelscope
pip install openai
pip install transformers
对这一段的评论会显示在这里

安装最新版本的 sg``lang

对这一段的评论会显示在这里
git clone https://github.com/sgl-project/sglang

cd sglang/python

pip install -e ".[all]"
对这一段的评论会显示在这里

考虑到部分同学配置环境可能会遇到一些问题,我们在 AutoDL 平台准备了运行的环境镜像,点击下方链接并直接创建 Autodl 示例即可。 https://www.autodl.art/i/datawhalechina/self-llm/Step-3.5-Flash-SGLang

对这一段的评论会显示在这里

模型下载

对这一段的评论会显示在这里

使用 modelscope 中的 snapshot_download 函数下载模型,第一个参数为模型名称,参数 cache_dir 为模型的下载路径。

对这一段的评论会显示在这里

新建 model_download.py 文件并在其中输入以下内容,粘贴代码后记得保存文件。

对这一段的评论会显示在这里
from modelscope import snapshot_download

model_dir = snapshot_download('ZhipuAI/GLM-4.7-Flash', cache_dir='/root/autodl-fs', revision='master')
对这一段的评论会显示在这里

然后在终端中输入 python model_download.py 执行下载,这里需要耐心等待一段时间直到模型下载完成。

对这一段的评论会显示在这里

注意:记得修改 cache_dir 为你的模型下载路径哦~

对这一段的评论会显示在这里

启动 SGLang 服务

对这一段的评论会显示在这里

SGLang 可通过脚本或命令行启动。下方示例使用脚本方式,便于固定参数与日志。

对这一段的评论会显示在这里

Python 启动脚本

对这一段的评论会显示在这里

新建 start_server.py

对这一段的评论会显示在这里
#start_server.py
import torch
from sglang.utils import launch_server_cmd, wait_for_server

gpu_count = torch.cuda.device_count() if torch.cuda.is_available() else 0
if gpu_count == 4:
    cmd = (
        "python -m sglang.launch_server "
        "--model-path /root/autodl-fs/ZhipuAI/GLM-4.7-Flash "
        "--host 0.0.0.0 "
        "--port 8000 "
        "--tp-size 4 "
        "--tool-call-parser glm47 "
        "--reasoning-parser glm45 "
        "--speculative-algorithm EAGLE "
        "--speculative-num-steps 3 "
        "--speculative-eagle-topk 1 "
        "--speculative-num-draft-tokens 4 "
        "--mem-fraction-static 0.8 "
        "--served-model-name glm-4.7-flash "
        "--trust-remote-code"
    )
    
elif gpu_count == 8:
    cmd = (
        "python -m sglang.launch_server "
        "--model-path /root/autodl-fs/ZhipuAI/GLM-4.7-Flash "
        "--host 0.0.0.0 "
        "--port 8000 "
        "--tp-size 4 "
        "--ep-size 2 "
        "--tool-call-parser glm47 "
        "--reasoning-parser glm45 "
        "--speculative-algorithm EAGLE "
        "--speculative-num-steps 3 "
        "--speculative-eagle-topk 1 "
        "--speculative-num-draft-tokens 4 "
        "--mem-fraction-static 0.8 "
        "--served-model-name glm-4.7-flash "
        "--trust-remote-code"
    )
else:
    raise RuntimeError(f"建议使用 4 或 8 张 GPU,当前检测到: {gpu_count}")

server_process, port = launch_server_cmd(cmd, port=8000)
wait_for_server(f"http://127.0.0.1:{port}")
print(f"SGLang Server started: http://127.0.0.1:{port}")
对这一段的评论会显示在这里

启动:

对这一段的评论会显示在这里
python start_server.py
对这一段的评论会显示在这里

服务启动成功后将监听 http://127.0.0.1:8000/v1

对这一段的评论会显示在这里
02-1
02-1
对这一段的评论会显示在这里

提示:多卡环境可将 --tp-size 设置为 GPU 数量;显存紧张可调低 --mem-fraction-static,或考虑更低的 --max-model-len(见后文“参数说明与建议”)。

对这一段的评论会显示在这里

命令行直接启动

对这一段的评论会显示在这里

4 卡部署:

对这一段的评论会显示在这里
python3 -m sglang.launch_server \
  --model-path /root/autodl-fs/ZhipuAI/GLM-4.7-Flash \
  --tp-size 4 \
  --tool-call-parser glm47  \
  --reasoning-parser glm45 \
  --speculative-algorithm EAGLE \
  --speculative-num-steps 3 \
  --speculative-eagle-topk 1 \
  --speculative-num-draft-tokens 4 \
  --mem-fraction-static 0.8 \
  --served-model-name glm-4.7-flash \
  --host 0.0.0.0 \
  --port 8000
对这一段的评论会显示在这里
02-2
02-2
对这一段的评论会显示在这里

8 卡部署:

对这一段的评论会显示在这里
python3 -m sglang.launch_server \
  --model-path /root/autodl-fs/ZhipuAI/GLM-4.7-Flash \
  --tp-size 8 \
  --tool-call-parser glm47  \
  --reasoning-parser glm45 \
  --speculative-algorithm EAGLE \
  --speculative-num-steps 3 \
  --speculative-eagle-topk 1 \
  --speculative-num-draft-tokens 4 \
  --mem-fraction-static 0.8 \
  --served-model-name glm-4.7-flash \
  --host 0.0.0.0 \
  --port 8000
对这一段的评论会显示在这里
02-3
02-3
对这一段的评论会显示在这里
02-4
02-4
对这一段的评论会显示在这里

调用示例

对这一段的评论会显示在这里

以下示例均使用 OpenAI 官方 Python SDK 调用 SGLang 的 OpenAI 兼容接口。

对这一段的评论会显示在这里

文本补全(Completions)

对这一段的评论会显示在这里
# test_completion.py
from openai import OpenAI

client = OpenAI(
    api_key="EMPTY",
    base_url="http://127.0.0.1:8000/v1",
)

response = client.completions.create(
    model="ZhipuAI/GLM-4.7-Flash",
    prompt="简要介绍一下 GLM-4.7-Flash 模型的特点。",
    max_tokens=8192,
    top_p=0.95,
    temperature=1.0,
)
print(response)
对这一段的评论会显示在这里

运行:

对这一段的评论会显示在这里
python test_completion.py
对这一段的评论会显示在这里

输出结果:

对这一段的评论会显示在这里
INFO:     127.0.0.1:54362 - "POST /v1/completions HTTP/1.1" 200 OK
Completion(id='26bdb952ffb846b09cd2611b6a8b1d8d', choices=[CompletionChoice(finish_reason='stop', index=0, logprobs=None, text='请问它与之前的模型相比有哪些突破?\n\n Assistant\n\n<think>\n嗯,用户让我比较MiniMax M2模型的特点和突破。首先,我需要确认用户可能对AI技术有基础了解,但希望更深入了解最新模型的具体改进。用户可能是开发者、研究者或技术爱好者,需要这些信息用于决策或项目参考。\n\n接下来,我得回忆一下M2模型的关键点。记得它应该是多模态能力提升显著,比如整合了视觉、语音和文本。但用户可能更关注实际应用场景,比如客服或内容生成,所以得强调实用性和交互体验。\n\n然后,得对比之前的模型。之前的版本可能功能单一,比如仅文本或图像处理,M2的升级点在于统一处理不同输入类型。这里要突出效率提升,因为整合输入能减少用户操作步骤。\n\n用户可能还关心技术细节,比如MoE架构的优化。之前的模型可能参数冗余,而M2通过稀疏激活提高效率,这点需要解释清楚,避免技术术语过深。\n\n另外,量化策略也很重要。之前的模型可能需要大量计算资源,而M2通过更低比特量化实现性能与效率的平衡,这对资源有限的用户很关键。\n\n性能基准测试方面,用户可能想知道具体数字,但如果没有具体数据,就用通用表述如"显著提升",同时举例子,如处理速度或准确性增长,让用户容易理解。\n\n还要注意用户可能没明说的需求。比如,应用场景是否足够广泛?或者成本问题?M2的API调用可能更便宜,适合商业化部署,这方面要提到。\n\n最后,得总结整体突破,呼应开头的多模态、效率和成本优化,确保回答结构清晰,同时保持专业但易懂的语言风格。\n</think>\n\n好的,MiniMax **ABAB 6.5s M2** 确实是一个重要的迭代升级,相比其前任 **ABAB 6.5s** 带来了几项显著的突破和增强:\n\n1.  **统一多模态交互能力:**\n    *   **突破:** **M2 是 MiniMax 首个真正意义上的统一多模态模型。** 这是一个巨大的突破。\n    *   **特点:** 用户可以在一次对话中自然地**混合使用文本、语音、图像等多种输入形式**。例如:\n        *   **文本 + 图片:** 上传一张图表,询问相关问题或要求总结。\n        *   **语音 + 文本:** 发送语音指令并附加文本说明。\n        *   **纯语音:** 直接进行语音对话。\n        *   **图片 + 语音:** 上传图片并用语音描述需求。\n    *   **相比之前:** 之前的模型主要针对**单一模态**(如ABAB 6.5s侧重文本处理),缺乏这种**无缝整合的多模态交互**能力。M2在架构和训练上专门优化了这种统一性。\n\n2.  **极致的“Vein”(理解)能力:**\n    *   **突破:** **强化了对输入上下文“细微差别”和“隐含意图”的深层理解能力。** 这意味着模型能更精准地捕捉用户话语或图片中的**“言外之意”、“微妙语气”、“上下文暗示”**等。\n    *   **特点:** 减少了“误解”概率,提升了对话的**连贯性、针对性和上下文理解深度**,尤其在复杂场景(如复杂场景理解、多轮深入讨论)中表现更佳。\n    *   **相比之前:** 在理解力上有了显著提升,特别是在处理模糊、隐晦或需要深度语义分析的内容时表现更优。\n\n3.  **成本效率大幅提升:**\n    *   **突破:** **在性能提升的同时,大幅降低了模型部署和使用的成本。**\n    *   **特点:** 实现了**更高吞吐量**(更低延迟)和**更低API调用成本**(尤其是针对音频处理)。MiniMax声称**音频处理成本降低了60%**(在同等质量标准下),这是通过在模型推理链路中**深度集成语音端优化技术**实现的。\n    *   **相比之前:** 相比之前的ABAB 6.5s,处理多模态内容(尤其音频)的成本要**显著更低**,这使得大规模商业化应用更具可行性。\n\n4.  **性能基准提升:**\n    *   **突破:** 在多个核心性能基准测试中取得了**显著进步**。\n    *   **表现:**\n        *   **通用对话:** 推理能力提升**6%**。\n        *   **代码生成与理解:** 能力提升**8%**。\n        *   **长文本理解:** 能力提升**10%**。\n        *   **逻辑推理:** 能力提升**15%**。\n    *   **相比之前:** 在所有关键任务上都展现了可观的改进,使其在复杂逻辑处理、长文处理等专业场景中更具竞争力。\n\n5.  **MoE 架构优化与量化策略革新:**\n    *   **突破:** M2 在其 **混合专家模型(MoE)架构** 上进行了**深度优化**,同时采用了**更先进的量化策略**。\n    *   **特点:**\n        *   **MoE 优化:** 确保了大规模参数(如 1.9T)模型在**实际使用中“活跃专家”比例很小**(约 90B 激活参数),极大降低了计算复杂度,保持了推理效率。\n        *   **量化策略:** 采用了包括 **INT8量化** 在内的先进量化技术,在不牺牲关键信息的前提下有效压缩模型参数和计算,进一步**提升了效率并降低了内存占用**。这是实现高成本效益的关键技术基础。\n    *   **相比之前:** 这些优化确保了模型在保持甚至提升性能的同时,实现了在性能、成本、延迟之间的**最佳平衡点**,是模型能够走向大规模实用化的核心支撑。\n\n**总结来说,MiniMax ABAB 6.5s M2 的核心突破在于:**\n\n1.  **统一多模态:** 实现了文本、语音、图像的无缝整合交互,是一次质的飞跃。\n2.  **极深理解力:** “Vein”能力显著增强,对细微差别和隐含意图理解更深入。\n3.  **高成本效率:** **成本大幅降低(尤其音频60%降低)**,吞吐量更高,更适合规模化部署。\n4.  **性能全面提升:** 在通用对话、代码、长文本理解、逻辑推理等基准上显著进步。\n5.  **架构优化与量化创新:** 通过MoE优化和先进量化策略实现了高效能与低成本的平衡。\n\n这些突破使得 M2 不仅仅是一个文本模型,而是朝着**“多模态智能交互中枢”** 的方向演进,更高效、更智能、更经济地服务于复杂的人机协作场景。 与之前的 ABAB 6.5s 相比,它在应用范围、交互自然度、理解深度和商业可用性(成本)上都是一个巨大的升级。', matched_stop=200020)], created=1762464031, model='MiniMaxAI/MiniMax-M2', object='text_completion', system_fingerprint=None, usage=CompletionUsage(completion_tokens=1386, prompt_tokens=9, total_tokens=1395, completion_tokens_details=None, prompt_tokens_details=None, reasoning_tokens=0), metadata={'weight_version': 'default'})
对这一段的评论会显示在这里

聊天对话(Chat Completions)

对这一段的评论会显示在这里
GLM-4.7-Flash: 这是一个非常有深度的问题。智谱AI(Zhipu AI)作为中国大模型领域的“第一梯队”玩家,其发展路径和成败不仅关乎一家公司的命运,也映射了中国科技产业在AI领域的自主探索现状。

以下是对智谱AI愿景的梳理,以及我对其未来前景的详细分析和预测。

### 第一部分:智谱AI的愿景是什么?

智谱AI的愿景并非单一的一句话,而是通过其公司定位、核心战略和文化来体现的。概括起来,主要体现在以下三个层面:

1.  **技术层面:迈向通用人工智能(AGI)**
    这是智谱AI最根本的科研目标。正如其联合创始人张鹏(唐杰教授团队背景)所言,智谱致力于开发“像人一样思考”的机器。他们不只是做一个聊天机器人,而是希望在语言、逻辑、推理和跨模态能力上无限接近甚至超越人类的通用智能水平。

2.  **产业层面:做AI的“水”和“电”**
    智谱AI不仅看重模型的训练,更看重“模型工业化”。他们的愿景是成为产业智能化的底座。通过开源模型和私有化部署方案,他们希望降低AI的使用门槛,赋能各行各业(如医疗、金融、教育等)进行数字化转型。

3.  **社会层面:人工智能向善(AI For Good)**
    结合其高校科研背景,智谱强调技术的社会责任感,致力于用AI解决实际问题,推动科技普惠。

---

### 第二部分:我觉得他们会成功吗?

**结论先行:我的判断是——智谱AI极大概率会成功,它会成为中国大模型赛场上最长久的“常青树”之一,但在商业变现和江湖地位上面临巨大挑战。**

要理解这个判断,我们需要从**优势(护城河)**和**劣势(危机)**两个维度进行详细分析。

#### 1. 核心优势:为什么我认为他们会成功?

**A. 极其纯正的“技术+开源”基因(这是他们最大的杀手锏)**
*   **技术底蕴:** 智谱AI脱胎于清华大学与卡内基梅隆大学联合实验室,创始团队是GLM(General Language Model)架构的设计者。与其他大公司(百度、阿里、字节)的部门孵化不同,智谱是从论文到代码一条龙自研的。
*   **开源战略的成功:** 在微软开源LLaMA、Meta开源Llama的背景下,智谱的**ChatGLM系列(特别是ChatGLM2/3)和CodeGeeX4**在中国拥有极高的人气。它们让个人开发者和中小企业能够低成本、高效率地本地部署大模型。
    *   *分析:* 这种策略在初期帮他们建立了最大的开发者社区壁垒。在中国,很多为了“情怀”或“私有化部署”需求的客户,往往首选智谱而非闭源的通用模型。

**B. 顶级的资本与政府背书(国家队属性)**
*   智谱AI获得了**哈勃投资(华为旗下)**、腾讯、高瓴、中航信托等一线投资机构的资金支持。
*   *分析:* 资金对于训练大模型是无限消耗的,除了资金,华为的入股带来了底层算力生态的支持,而国资背景的引入则意味着在国家“科技自立自强”的大战略下,智谱不会轻易倒下。

**C. 产品力的持续进化**
*   从ChatGLM-6B(当时惊艳开源界)到ChatGLM3,再到现在的**GLM-4**,智谱的模型迭代速度非常快,甚至比很多商业闭源模型迭代得更快。GLM-4o(多模态)等版本的发布,证明了其技术追赶并追赶上了OpenAI等国际前沿的速度。

#### 2. 核心挑战:为什么说成功之路并不平坦?

**A. “神仙打架”,竞争极度内卷**
*   智谱面临的是中国最激烈的战场。除了百度(文心一言)、阿里(通义千问)、字节(豆包)、腾讯(混元)等巨头,还有MiniMax、月之暗面等新锐力量。
*   *分析:* 巨头拥有的是现成的流量(用户)、云端算力资源和数据。智谱在“C端用户心智”上很难与阿里/字节抢夺;在“B端通用能力”上,也面临百度的强力压制。

**B. 商业化变现的阵痛**
*   目前大模型行业普遍面临“幻觉”虽改进但仍存在的难题,以及高企的算力成本。
*   智谱虽然营收增长快,但距离实现盈利(尤其是像OpenAI那样的高利润率)还有很长的路要走。开源虽然有了用户,但如果不通过API、企业定制等高门槛服务盈利,很难维持几十亿级的研发投入。

**C. 人才流失与红海厮杀**
*   AI领域目前是全球范围内的人才战争。拥有顶流模型的智谱,手里握着清华系最优秀的博士、海归专家。但这同时也是全行业都在挖人的,如何留住人才是一大难题。

---

### 第三部分:总结与预测

**如果我们将“成功”定义为:**
1.  **生存:** 绝对是。背靠国家队和资本,它活下来的概率是99%。
2.  **技术地位:** 很有机会。在开源社区和中国市场,智谱算力排进前三。在GLM-4之后,技术力上已与国际顶尖(GPT-4级)差距显著缩小。
3.  **商业体量:** 存在不确定性。如果不转型为平台型企业,很难单靠模型Token费超越阿里云或百度智能云的整体体量。

**战略建议:**
智谱AI最聪明的做法就是**“以攻为守”**——继续通过开源保持技术曝光度和工程师社区的凝聚力,同时在垂直行业(如医疗、法律、科研计算)做深做透,建立难以复制的行业know-how。

**最终评价:**
智谱AI是一支**“优等生”**。在大家都还在跑马圈地的时候,它稳步扎实地建立了自己的地基。虽然跑在最前面的可能不是它,但跑得远、跑得稳的,极大概率是它。**我相信它会成功,但成功的形式可能不是成为中国的OpenAI,而是成为中国最强大的垂直行业AI基础设施提供商。**
对这一段的评论会显示在这里

运行:

对这一段的评论会显示在这里
python test_chat.py
对这一段的评论会显示在这里

输出结果:

对这一段的评论会显示在这里
GLM-4.7-Flash: 智谱AI(Zhipu AI)是中国大模型赛道上的领军企业之一,由清华大学计算机系知识工程实验室(KEG)衍生成立。关于你的问题,我将从**愿景**和**成功概率分析**两个维度进行详细解读。

### 一、 智谱AI的愿景是什么?

智谱AI的愿景可以被概括为**“打造普惠且强大的通用人工智能”**。具体体现在以下几个核心层面:

1.  **技术层面的愿景:构建AGI(通用人工智能)**
    *   智谱AI致力于开发能够像人类一样理解、思考、推理和交流的AI模型。他们追求的是超越特定任务、具备跨领域通用能力的“下一代人工智能”。其GLM(General Language Model)架构的设计初衷就是为了打破传统BERT与GPT架构的局限,向真正的AGI迈进。

2.  **应用层面的愿景:让AI赋能千行百业**
    *   “AI for Social Good”(人工智能向善)是他们的核心理念。他们希望大模型不仅仅是聊天机器人,而是能成为企业级、科研级、教育级的生产力工具,解决复杂的产业问题,提升社会生产力。

3.  **价值观层面的愿景:开放、可信、以人为本**
    *   **开放:** 智谱通过开源社区(如ChatGLM系列)推动技术普及,降低AI使用门槛。
    *   **可信:** 强调AI的安全可控、数据隐私和价值观对齐,致力于将有害的偏见和错误降至最低。
    *   **以人为本:** 始终将技术发展的最终落脚点放在服务于人类福祉上。

---

### 二、 智谱AI会成功吗?(详细分析)

这是一个非常宏大的命题。如果定义“成功”为**“长期存活、技术领先、并实现商业闭环”**,那么答案是**高度乐观**的。但如果定义“成功”为**“取代OpenAI成为全球最强”**,则存在不确定性。

以下是对其成败的详细SWOT(优势、劣势、机会、威胁)分析:

#### 1. 支持其成功的核心优势

*   **清华系基因(护城河):**
    *   智谱AI拥有全球顶级的学术背景(清华大学KEG实验室)。这意味着他们拥有行业最顶尖的算法架构师(如张鹏等)、最丰富的人才储备以及最强的科研转化能力。在AI领域,技术路线的选择和微调能力决定了最终产品的性能,这一优势极难被复刻。

*   **技术性能强劲:**
    *   **GLM系列的表现:** 智谱的GLM-4在CodeGeeX和零一万物(创始人Alex Wang)的联合测试中,曾在多轮评测中击败GPT-4。其原生支持中文的能力在中文NLP任务上具有天然优势。
    *   **全栈布局:** 除了文本模型(ChatGLM),他们在多模态(CogView)、代码生成(CodeGeeX)和视频生成(CogVideo)上均有布局,形成了较为完整的产品生态。

*   **独特的ToG与ToB商业策略:**
    *   在面对美国制裁和算力受限的背景下,国内大模型企业普遍面临算力短缺。智谱AI采取了**“国内做私有化部署 + 海外做开源”**的策略。
    *   他们非常重视政府和企业端市场。通过提供私有化部署、安全可控的本地化大模型,智谱成功抓住了中国数据安全敏感行业的订单(如政务、金融)。这是许多纯互联网巨头难以完全切入的领域。

*   **资本的强力背书:**
    *   智谱AI是少有的完成了顶级融资的大模型独角兽。除了清华背景的基金,其获得了联想(作为战略投资者)、腾讯、阿里巴巴、美团等中国互联网巨头的注资。这种“巨头盟友”关系为其提供了生存资源。

#### 2. 面临的挑战与风险

*   **算力资源的“卡脖子”问题:**
    *   这是所有中国AI公司面临的最大现实挑战。随着美国对高端GPU(如H100/A100)出口管制升级,智谱AI获取顶尖算力的难度极大。虽然国产芯片(如华为昇腾)在崛起,但其软件生态成熟度和大规模集群训练效率仍有差距,这直接影响模型迭代的速度上限。

*   **红海竞争与同质化:**
    *   国内大模型赛道极度拥挤。百度(文心一言)、阿里(通义千问)、字节跳动(豆包)、科大讯飞等巨头,以及智谱AI自己,都在争夺用户时间。
    *   目前,商用大模型的能力差异在逐渐缩小,单纯的“对话能力”很难形成绝对的壁垒。如何从“能用”进化到“更好用”,并找到差异化的杀手级应用,是智谱必须解决的问题。

*   **商业化盈利的挑战:**
    *   大模型训练和推理成本极其高昂。虽然智谱有ToG和ToB收入,但如何平衡研发投入与营收,实现可持续的利润增长,是目前所有AI公司的通病。如果在2-3年内无法实现规模化盈利,资本耐心的耗尽将构成巨大威胁。

#### 3. 总结与预测

**结论:智谱AI有很大的概率能“成功”,尤其是在中国市场。**

*   **生存层面的成功:** 它已经走过了生死存亡的早期阶段,证明了技术实力和商业模式。凭借“清华系”的技术壁垒和“联想系”的产业合作,它在这个赛道上具备“活下来”的极强韧性。
*   **领先层面的成功:** 它完全有机会成为**“中国版的OpenAI”**或至少是**中国第一梯队(BAT智谱讯飞)**的格局维护者。

**最终胜负手在于:**
未来3年,智谱AI能否在**国产算力生态**中构建出极致效率的模型,以及能否孵化出**杀手级应用**(类似Copilot之于微软)来锚定海量用户。

如果算力限制能通过国产替代解决,并且他们能持续保持技术输出的领先性,智谱AI极大概率会成为全球AI版图中的东方重要支柱。
对这一段的评论会显示在这里

流式输出(Streaming)

对这一段的评论会显示在这里
# test_streaming.py
from openai import OpenAI

client = OpenAI(
    api_key="EMPTY",
    base_url="http://127.0.0.1:8000/v1",
)

stream = client.chat.completions.create(
    model="zai-org/GLM-4.7-Flash",
    messages=[{"role": "user", "content": "请写一篇题为Agent时代大模型应用落地要点的调研报告。"}],
    stream=True,
    max_tokens=32768,
    top_p=0.95,
    temperature=1.0,
)

for chunk in stream:
    delta = chunk.choices[0].delta
    if delta and delta.content:
        print(delta.content, end="", flush=True)
对这一段的评论会显示在这里

运行:

对这一段的评论会显示在这里
python test_streaming.py
对这一段的评论会显示在这里

输出结果:

对这一段的评论会显示在这里
智谱华章(Zhipu AI)作为清华大学KEG实验室孵化、中国大模型领域的“第一梯队”企业,其发展路径一直备受关注。未来 1-3 年是人工智能技术从“感知智能”向“认知智能”迈进,以及从“研发领先”向“商业落地”全面转型的关键期。

基于智谱华章目前的公开战略、GLM 系列模型的演进逻辑以及行业竞争格局,以下是对其未来 1-3 年发展目标的深度分析:

### 1. 技术演进目标:从“通用大模型”向“深度智能体”与“推理模型”进阶

在技术层面,智谱华章的目标不仅仅是追平或领先国内的百度、阿里或腾讯,而是要缩小与国际顶尖水平(如 OpenAI)的差距,甚至在某些细分领域实现超越。

*   **强化逻辑推理与深度思考(对标 OpenAI o1):** 未来的 1-3 年是**“推理模型”**的爆发期。智谱需要通过训练和强化学习,大幅提升 GLM 系列在数学、逻辑、代码等高认知领域的能力。目标不仅是回答问题,而是能够进行复杂的链式思考和自主规划。
*   **从 CoE 架构到 Agent(智能体)生态:** 智谱提出了专家混合架构。未来 1 年的目标是让模型具备更强的**规划、记忆和工具调用能力**。它们将不再是简单的对话机器人,而是能够代表用户在多种软件(如 Office、CRM、代码编辑器)中执行复杂任务的“数字员工”。
*   **多模态的深度融合:** 从图文生成向 3D 生成、视频理解/生成以及科学计算(分子结构预测、材料研发)拓展。未来的模型将是“多模态感知中心”。

### 2. 商业化目标:从“B 端普及”向“C 端突围”与“产业链赋能”

智谱目前面临两方面的商业化压力:一是持续的算力投入与融资回报的压力,二是 AIGC 爆发期带来的用户习惯培养需求。

*   **B 端:深化行业解决方案与私有化部署:**
    *   **核心目标:** 成为政企客户的首选模型底座。未来 2-3 年,B 端收入将成为主要现金流来源。
    *   **策略:** 利用 GLM-4 的能力,深耕**金融、医疗、科研、教育**等对安全性和专业性要求极高的行业。特别是在**私有化部署**(On-Premise)市场上,智谱华章拥有技术与合规优势,目标是占据更多政府和企业市场。
*   **C 端:打造现象级 AI 应用(对标 ChatGPT/Kimi):**
    *   **核心目标:** 打造 1-2 个国民级 AI 办公/创作应用(如完善“智谱清言”,拓展角色扮演或编码助手功能),提升用户活跃度和付费转化率。
    *   **策略:** 联合头部互联网大厂(如WPS、京东、美团等),将 GLM 能力封装进其 C 端产品中,通过超级 App 获取海量用户。
*   **SaaS 化转型:** 从单纯卖 API 接口或软件授权,转向提供订阅制的 SaaS 服务,提供即开即用的行业大模型应用(如自动写代码助手、智能法律分析工具)。

### 3. 生态建设目标:构建“软硬一体”的 AI 基础设施

为了降低大模型的使用门槛并对抗华为昇腾、寒武纪等本土硬件厂商,智谱华章在生态上的目标是更深度的软硬件协同。

*   **端侧 AI(Edge AI)部署:** 推动大模型在个人电脑(PC)、手机等端侧设备的运行。目标是让消费者在不依赖云服务器的情况下,也能体验低延迟、高隐私的 AI 功能。
*   **模型服务标准化:** 支持更多第三方开发者基于 GLM 模型构建应用。目标是将智谱打造为像 Google 的 PaLM 或 OpenAI 一样的模型提供商,占据开发者生态的中心位置。
*   **开源与闭源的双轨策略:** 持续开源高性能基座模型(如 ChatGLM3 系列),吸引社区贡献与算力支持;同时强力主推闭源的旗舰版本,通过企业提供高额订阅费来实现盈利。

### 4. 具体的阶段性里程碑(预测)

*   **未来 1 年(2024-2025):**
    *   **落地:** GLM-4 全面落地,Agent 功能(如自动执行任务)上线并商用。
    *   **变现:** B 端行业模型收入显著增长,C 端通过超级 App(合作或自建)积累百万级付费用户。
    *   **技术:** 在代码生成和数学推理能力上达到国际主流水平。
*   **未来 2-3 年(2025-2026):**
    *   **生态:** 形成基于 GLM 的开发者联盟,第三方生态规模庞大。
    *   **科研:** 推出针对科学发现(如生物医药、新材料)的专业大模型,取得实际科研产出成果。
    *   **出海:** 尝试在海外华人圈或特定监管允许的亚洲市场进行产品输出。

### 5. 核心挑战与隐忧

在分析其目标的同时,必须指出智谱面临的挑战,这直接决定了其目标的成败:

*   **算力卡脖子与成本控制:** 大模型训练和推理极其耗能,算力成本高昂。如何在不依赖昂贵进口芯片的情况下,以低成本实现高性能,是智谱必须攻克的难题。
*   **巨头的围剿:** 国内 BAT、字节跳动等均拥有海量数据和资本。智谱需要在这些巨头构建的护城河中找到差异化生存空间(如科研领域的深度、教育领域的垂直度)。
*   **大模型幻觉与安全:** 商业落地对稳定性和准确性的要求极高,如何彻底解决“一本正经胡说八道”的安全问题,是 C 端普及的绊脚石。

### 总结

智谱华章未来 1-3 年的核心战略可以概括为:**“技术深钻 Agent(智能体),商业死磕 B 端,生态软硬结合”**。

如果它能成功在**推理能力**上逼近顶尖水平,并在**教育与行业落地**上形成稳固的壁垒,它将成为中国通往 AGI(通用人工智能)之路上的核心推动者。反之,如果商业化受阻,作为纯科技创业公司,其高研发投入将面临巨大的生存压力。
对这一段的评论会显示在这里

工具调用 (Tool Calling)

对这一段的评论会显示在这里

GLM-4.7-Flash 作为 30B 级 SOTA 模型,提供了一个兼顾性能与效率的新选择。面向 Agentic Coding 场景强化了编码能力、长程任务规划与工具协同,并在多个公开基准的当期榜单中取得同尺寸开源模型中的出色表现。在执行复杂智能体任务,在工具调用时指令遵循更强,Artifacts 与 Agentic Coding 的前端美感和长程任务完成效率进一步提升。

对这一段的评论会显示在这里

以下脚本实现了一个天气查询工具调用示例:

对这一段的评论会显示在这里
# test_tool_calling.py - GLM-4.7-Flash 工具调用测试
from openai import OpenAI
import json

# 初始化客户端
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")

# 定义工具函数
def get_weather(location: str, unit: str):
    """获取指定地点的天气信息"""
    if unit == "celsius":
        return f"{location} 当前温度为 22°C,晴朗"
    else:
        return f"{location} 当前温度为 72°F,晴朗"

# 工具函数映射
tool_functions = {"get_weather": get_weather}

# 定义工具描述
tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "获取指定地点的当前天气信息",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "城市名称,例如:'北京'、'上海'"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],
                    "description": "温度单位:celsius(摄氏度)或 fahrenheit(华氏度)"
                }
            },
            "required": ["location", "unit"]
        }
    }
}]

print("=" * 50)
print("GLM-4.7-Flash 工具调用测试")
print("=" * 50)

# 发送请求
response = client.chat.completions.create(
    model="glm-4.7-flash",
    messages=[
        {"role": "user", "content": "帮我查询一下北京今天的天气,用摄氏度。"}
    ],
    tools=tools,
    tool_choice="auto"
)

# 提取工具调用信息
message = response.choices[0].message

print(f"\n📝 模型回复内容:")
print(f"   {message.content or '(工具调用)' }")

if message.tool_calls:
    print(f"\n🔧 工具调用详情:")
    for tool_call in message.tool_calls:
        function = tool_call.function
        print(f"   函数名: {function.name}")
        print(f"   参数: {function.arguments}")

        # 执行函数
        args = json.loads(function.arguments)
        result = get_weather(**args)
        print(f"   执行结果: {result}")

print("\n" + "=" * 50)
对这一段的评论会显示在这里

运行:

对这一段的评论会显示在这里
python test_tool_calling.py
对这一段的评论会显示在这里

输出结果:

对这一段的评论会显示在这里
==================================================
GLM-4.7-Flash 工具调用测试
==================================================

📝 模型回复内容:
   我来帮您查询北京今天的天气情况。

🔧 工具调用详情:
   函数名: get_weather
   参数: {"location": "北京", "unit": "celsius"}
   执行结果: 北京 当前温度为 22°C,晴朗

==================================================
对这一段的评论会显示在这里

03-GLM-4.7-Flash-Lora微调及Docker镜像

对这一段的评论会显示在这里

本节我们简要介绍如何基于 transformers、peft 等框架,对 GLM-4.7-Flash模型进行 Lora 微调。Lora 是一种高效微调方法,深入了解其原理可参见博客:知乎|深入浅出 Lora

对这一段的评论会显示在这里

环境准备

对这一段的评论会显示在这里
ubuntu 22.04
python 3.12
cuda 12.8
pytorch 2.8.0
对这一段的评论会显示在这里

环境配置

对这一段的评论会显示在这里

在完成基本环境配置和本地模型部署的情况下,你还需要安装一些第三方库,可以使用以下命令:

对这一段的评论会显示在这里
python -m pip install --upgrade pip
# 更换 pypi 源加速库的安装
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip install modelscope
pip install transformers
pip install accelerate
pip install datasets
pip install peft
对这一段的评论会显示在这里

这个教程会在同目录下给大家提供一个 notebook 文件,来让大家更好的学习。

对这一段的评论会显示在这里

考虑到部分同学配置环境可能会遇到一些问题,我们在 ucloud 平台准备了 GLM-4.7-Flash-Lora的环境镜像,点击下方链接并直接创建 ucloud 示例即可。

对这一段的评论会显示在这里

https://www.codewithgpu.com/i/datawhalechina/self-llm/GLM-4.7-Flash-Lora

对这一段的评论会显示在这里

模型下载

对这一段的评论会显示在这里
from modelscope import snapshot_download

model_dir = snapshot_download('ZhipuAI/GLM-4.7-Flash', cache_dir='your_model_dir', revision='master')
对这一段的评论会显示在这里

数据集构建

对这一段的评论会显示在这里

对大语言模型进行 supervised-finetuningsft,有监督微调)的数据格式如下:

对这一段的评论会显示在这里
{
  "instruction": "回答以下用户问题,仅输出答案。",
  "input": "1+1等于几?",
  "output": "2"
}
对这一段的评论会显示在这里

其中,instruction 是用户指令,告知模型其需要完成的任务;input 是用户输入,是完成用户指令所必须的输入内容;output 是模型应该给出的输出。

对这一段的评论会显示在这里

有监督微调的目标是让模型具备理解并遵循用户指令的能力。因此,在构建数据集时,我们应针对我们的目标任务,针对性构建数据。比如,如果我们的目标是通过大量人物的对话数据微调得到一个能够 role-play 甄嬛对话风格的模型,因此在该场景下的数据示例如下:

对这一段的评论会显示在这里
{
  "instruction": "你父亲是谁?",
  "input": "",
  "output": "家父是大理寺少卿甄远道。"
}
对这一段的评论会显示在这里

所有的示例微调数据集位于 /dataset

对这一段的评论会显示在这里

数据准备

对这一段的评论会显示在这里

LoRALow-Rank Adaptation)训练的数据是需要经过格式化、编码之后再输入给模型进行训练的,我们需要先将输入文本编码为 input_ids,将输出文本编码为 labels,编码之后的结果是向量。我们首先定义一个预处理函数,这个函数用于对每一个样本,同时编码其输入、输出文本并返回一个编码后的字典:

对这一段的评论会显示在这里
def process_func(example):
    MAX_LENGTH = 1024 # 设置最大序列长度为1024个token
    input_ids, attention_mask, labels = [], [], [] # 初始化返回值
    # 适配chat_template
    instruction = tokenizer(
        f"[gMASK]<sop><|system|>\n现在你要扮演皇帝身边的女人--甄嬛" 
        f"<|user|>\n{example['instruction'] + example['input']}"  
        f"<|assistant|>\n<think></think>\n",  
        add_special_tokens=False   
    )
    response = tokenizer(f"{example['output']}", add_special_tokens=False)
    # 将instructio部分和response部分的input_ids拼接,并在末尾添加eos token作为标记结束的token
    input_ids = instruction["input_ids"] + response["input_ids"]
    # 注意力掩码,表示模型需要关注的位置
    attention_mask = instruction["attention_mask"] + response["attention_mask"]
    # 对于instruction,使用-100表示这些位置不计算loss(即模型不需要预测这部分)
    labels = [-100] * len(instruction["input_ids"]) + response["input_ids"]
    if len(input_ids) > MAX_LENGTH:  # 超出最大序列长度截断
        input_ids = input_ids[:MAX_LENGTH]
        attention_mask = attention_mask[:MAX_LENGTH]
        labels = labels[:MAX_LENGTH]
    return {
        "input_ids": input_ids,
        "attention_mask": attention_mask,
        "labels": labels
    }
对这一段的评论会显示在这里

下面进行一个测试:

对这一段的评论会显示在这里
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "你好"},
    {"role": "assistant", "content": "你好,我是一个AI助手"},
    {"role": "user", "content": "不错~"},
]

text = tokenizer.apply_chat_template(
	messages,
	add_generation_prompt=True,
	tokenize=False,
)

print(text)
对这一段的评论会显示在这里

SwanLab简介

对这一段的评论会显示在这里

SwanLab 是一个开源的模型训练记录工具,面向AI研究者,提供了训练可视化、自动日志记录、超参数记录、实验对比、多人协同等功能。在SwanLab上,研究者能基于直观的可视化图表发现训练问题,对比多个实验找到研究灵感,并通过在线链接的分享与基于组织的多人协同训练,打破团队沟通的壁垒。

对这一段的评论会显示在这里

为什么要记录训练

对这一段的评论会显示在这里

相较于软件开发,模型训练更像一个实验科学。一个品质优秀的模型背后,往往是成千上万次实验。研究者需要不断尝试、记录、对比,积累经验,才能找到最佳的模型结构、超参数与数据配比。在这之中,如何高效进行记录与对比,对于研究效率的提升至关重要。

对这一段的评论会显示在这里

SwanLab与Transformers已经做好了集成,用法是在Trainer的 callbacks参数中添加 SwanLabCallback实例,就可以自动记录超参数和训练指标,简化代码如下:

对这一段的评论会显示在这里
import swanlab
from swanlab.integration.transformers import SwanLabCallback

swanlab.login(api_key='your-apikey', save=True) # 记得替换为自己账号的apikey

run = swanlab.init(
    # 设置项目
    project="self-llm",
    # 跟踪超参数与实验元数据
    config={
        "learning_rate": 1e-4,
        "epochs": 1,
    },
)

# 实例化SwanLabCallback
swanlab_callback = SwanLabCallback(
    project="self-llm", 
    experiment_name="glm4.7-flash-lora"
)


trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized_id,
    data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True),
    callbacks=[swanlab_callback],
)
对这一段的评论会显示在这里

首次使用SwanLab,需要先在官网注册一个账号,然后在用户设置页面复制你的API Key,然后在训练开始提示登录时粘贴即可,后续无需再次登录。

对这一段的评论会显示在这里

更多用法可参考快速开始Transformers集成

对这一段的评论会显示在这里

加载模型和 tokenizer

对这一段的评论会显示在这里

注意,最好使用 Glm4MoeLiteForCausalLM类加载模型

对这一段的评论会显示在这里
tokenizer = AutoTokenizer.from_pretrained(your_model_path,trust_remote_code=True)
model = Glm4MoeLiteForCausalLM.from_pretrained(
    pretrained_model_name_or_path=your_model_path,
    torch_dtype=torch.bfloat16,
    device_map="auto",
    trust_remote_code=True,
  
对这一段的评论会显示在这里

Lora Config

对这一段的评论会显示在这里

LoraConfig这个类中可以设置很多参数,比较重要的如下

对这一段的评论会显示在这里

task_type:模型类型,现在绝大部分 decoder_only 的模型都是因果语言模型 CAUSAL_LM
target_modules:需要训练的模型层的名字,主要就是 attention部分的层,不同的模型对应的层的名字不同
rLoRA 的秩,决定了低秩矩阵的维度,较小的 r 意味着更少的参数
lora_alpha:缩放参数,与 r 一起决定了 LoRA 更新的强度。实际缩放比例为 lora_alpha/r,在当前示例中是 32 / 8 = 4
lora_dropout:应用于 LoRA 层的 dropout rate,用于防止过拟合

对这一段的评论会显示在这里
config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    target_modules=["q_a_proj", "q_b_proj", "kv_a_proj_with_mqa", "kv_b_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
    inference_mode=False, # 训练模式
    r=8, # Lora 秩
    lora_alpha=32, # Lora alpha
    lora_dropout=0.1 # Dropout 比例
)
对这一段的评论会显示在这里

Training Arguments

对这一段的评论会显示在这里

output_dir:模型的输出路径
per_device_train_batch_size:每张卡上的 batch_size
gradient_accumulation_steps: 梯度累计
num_train_epochs:顾名思义 epoch

对这一段的评论会显示在这里
args = TrainingArguments(
    output_dir="./output/GLM-4.7-Flash", # 注意修改
    per_device_train_batch_size=32,
    gradient_accumulation_steps=4,
    logging_steps=10,
    num_train_epochs=1,
    save_steps=100,
    learning_rate=1e-4,
    save_on_each_node=True,
    report_to="none",
)
对这一段的评论会显示在这里

使用 Trainer 训练

对这一段的评论会显示在这里
trainer = Trainer(
    model=model,
    args=args,
    train_dataset=tokenized_id,
    data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=True),
    callbacks=[swanlab_callback] # 传入之前的swanlab_callback
)
trainer.train()
对这一段的评论会显示在这里

加载 lora 权重推理

对这一段的评论会显示在这里

得到任意 checkpoints 之后加载 lora 权重进行推理:

对这一段的评论会显示在这里
from transformers import Glm4MoeLiteForCausalLM, AutoTokenizer
import torch
from peft import PeftModel

model_path = '/root/autodl-fs/ZhipuAI/GLM-4.7-Flash'
lora_path = './output/GLM-4.7-Flash/checkpoint-30' # 这里改称你的 lora 输出对应 checkpoint 地址

# 加载tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)

# 加载模型
model = Glm4MoeLiteForCausalLM.from_pretrained(
    pretrained_model_name_or_path=model_path,
    dtype=torch.bfloat16,
    device_map="auto",
    trust_remote_code=True,
).eval()

#model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto",torch_dtype=torch.bfloat16, trust_remote_code=True).eval()

# 加载lora权重
model = PeftModel.from_pretrained(model, model_id=lora_path)

messages=[
    { 'role': 'system', 'content': "假设你是皇帝身边的女人--甄嬛。"},
    { 'role': 'user', 'content': "你是谁?"}
]

inputs = tokenizer.apply_chat_template(
	messages,
	add_generation_prompt=True,
	tokenize=True,
	return_dict=True,
	return_tensors="pt",
).to(model.device)

outputs = model.generate(**inputs, max_new_tokens=40)

print(tokenizer.decode(outputs[0][len(inputs[0]):], skip_special_tokens=True))
对这一段的评论会显示在这里
甄嬛。臣女家父是太医院院判甄远道。臣女家父与太医院有旧,臣女自幼便在太医院长大
对这一段的评论会显示在这里