GLM-4-9B-Chat-1M代码实例:REST API接口调用示例
GLM-4-9B-Chat-1M代码实例REST API接口调用示例1. 引言为什么你需要关注这个模型想象一下你手头有一份300页的PDF合同或者一整年的公司财报你想让AI帮你快速总结核心条款、找出关键数据或者对比不同章节的差异。以前你可能需要把文档切成无数个小块分批喂给模型不仅麻烦还容易丢失上下文信息。现在这个问题有了一个非常直接的解决方案GLM-4-9B-Chat-1M。这个模型最大的亮点就是它的名字里那个“1M”。它意味着这个模型能一次性处理长达100万个token的文本换算成中文大约是200万字。这相当于它能一口气读完好几本长篇小说或者一份极其冗长的技术文档。对于需要处理长文本的场景——比如法律合同分析、学术论文总结、长篇小说创作辅助——它就像是为你的电脑装上了一台“文本吸尘器”再长的内容也能一口吞下。更关键的是它只有90亿参数经过INT4量化后模型大小可以压缩到9GB左右。这意味着你不需要准备昂贵的专业计算卡一张消费级的RTX 3090或4090显卡就能让它全速运行。对于个人开发者、初创团队或者预算有限的研究者来说这无疑降低了长文本AI应用的门槛。本文将带你快速上手通过最常用的REST API方式调用这个“长文本处理专家”。我们会从环境准备开始一步步教你如何启动服务、发送请求并处理超长文本的问答和总结任务。即使你之前没有太多部署经验跟着步骤走也能在半小时内让模型跑起来为你服务。2. 环境准备与快速部署在开始调用API之前我们需要先把模型服务跑起来。这里我们选择使用vLLM作为推理引擎因为它对长文本场景做了专门的优化能有效提升吞吐量并降低显存占用。2.1 基础环境检查首先确保你的机器满足以下最低要求操作系统Linux (Ubuntu 20.04/22.04推荐) 或 Windows WSL2。显卡NVIDIA GPU显存至少16GB用于FP16精度或10GB用于INT4量化版本。RTX 3090 (24GB) 或 RTX 4090 (24GB) 是理想选择。驱动安装最新的NVIDIA显卡驱动。Python版本 3.8 到 3.11。你可以通过以下命令快速检查# 检查Python版本 python3 --version # 检查GPU和驱动Linux nvidia-smi # 检查GPU和驱动Windows需在PowerShell中运行 nvidia-smi.exe如果nvidia-smi能正确显示你的显卡信息说明环境基本就绪。2.2 一键部署服务最省心的方式是使用官方或社区提供的Docker镜像或一键部署脚本。这里我们演示通过vLLM启动一个OpenAI兼容的API服务。步骤一安装vLLM打开你的终端或命令行创建一个新的Python虚拟环境可选但推荐然后安装vLLM。# 创建并激活虚拟环境可选 python -m venv glm4-env source glm4-env/bin/activate # Linux/macOS # glm4-env\Scripts\activate # Windows # 安装vLLM及相关依赖 pip install vllm步骤二启动API服务由于GLM-4-9B-Chat-1M是超长上下文模型启动时需要一些特殊参数来优化性能。使用以下命令启动服务# 使用INT4量化版本显存需求更低适合24GB显存显卡 python -m vllm.entrypoints.openai.api_server \ --model THUDM/glm-4-9b-chat-1m \ --served-model-name glm-4-9b-chat-1m \ --max-model-len 1048576 \ # 设置最大上下文长度为1M --gpu-memory-utilization 0.9 \ # 尽可能利用显存 --enable-chunked-prefill \ # 启用块状预填充加速长文本处理 --max-num-batched-tokens 8192 # 设置批处理token数提升吞吐 # 如果你显存充足40GB可以使用FP16原版效果更佳 # python -m vllm.entrypoints.openai.api_server \ # --model THUDM/glm-4-9b-chat-1m \ # --served-model-name glm-4-9b-chat-1m \ # --max-model-len 1048576 \ # --dtype half命令解释--model THUDM/glm-4-9b-chat-1m: 指定从HuggingFace拉取模型。--max-model-len 1048576: 这是关键将模型支持的长度设置为1,048,576个token即1M。--enable-chunked-prefill: vLLM的优化特性专门为处理超长prompt设计能显著减少内存峰值占用。--max-num-batched-tokens 8192: 提高批量处理的token数量增加吞吐量。服务启动后你会在终端看到类似下面的输出并在默认的http://localhost:8000地址提供API服务。INFO 07-10 10:00:00 llm_engine.py:721] Initializing an LLM engine (v0.4.3)... INFO 07-10 10:00:00 llm_engine.py:722] Engine args: ... INFO 07-10 10:00:00 model_runner.py:405] Loading model weights... INFO 07-10 10:00:30 llm_engine.py:827] LLM engine is ready. Uvicorn running on http://localhost:8000 (Press CTRLC to quit)看到LLM engine is ready和Uvicorn running on http://localhost:8000恭喜你模型服务已经成功启动了这个服务提供了与OpenAI API完全兼容的接口这意味着你可以使用熟悉的openai库或者直接发送HTTP请求来调用它。3. 基础调用你的第一个API请求服务跑起来了现在我们来试试怎么跟它“说话”。我们将使用Python的requests库发送HTTP请求这是最通用、最直接的方式。3.1 发送一个简单的聊天请求我们先从一个短文本的简单问答开始确保一切连接正常。创建一个名为simple_chat.py的Python文件。import requests import json # API服务地址 API_BASE http://localhost:8000/v1 def simple_chat(): 发送一个简单的聊天请求 # 构造请求数据格式与OpenAI ChatCompletion API一致 data { model: glm-4-9b-chat-1m, # 模型名称与启动时--served-model-name一致 messages: [ {role: system, content: 你是一个乐于助人的AI助手。}, {role: user, content: 你好请介绍一下你自己。} ], max_tokens: 512, # 限制模型生成的最大长度 temperature: 0.7, # 控制随机性0.0最确定1.0最随机 stream: False # 非流式输出一次性返回结果 } # 发送POST请求到聊天补全端点 response requests.post( f{API_BASE}/chat/completions, jsondata, headers{Content-Type: application/json} ) # 检查请求是否成功 if response.status_code 200: result response.json() # 提取模型返回的回复内容 reply result[choices][0][message][content] print(模型回复) print(reply) print(f\n本次对话消耗token数: {result[usage][total_tokens]}) else: print(f请求失败状态码{response.status_code}) print(response.text) if __name__ __main__: simple_chat()运行这个脚本python simple_chat.py你应该会看到模型的一段自我介绍类似于模型回复 你好我是GLM-4-9B-Chat-1M一个由智谱AI开发的大型语言模型。我拥有90亿参数特别擅长处理超长文本最多可达100万token约200万汉字。我可以进行多轮对话、回答各种问题、协助文本分析、总结、翻译、编程等任务。我的知识截止于2024年7月并且支持代码执行和工具调用功能。请随时告诉我你需要什么帮助 本次对话消耗token数: 158看到这个回复说明你的API服务运行正常可以开始通信了。3.2 理解请求与响应格式上面的代码虽然简单但包含了调用GLM-4-9B-Chat-1M API的核心要素。我们来拆解一下请求体 (data字典) 的关键字段model: 必须指定为我们启动服务时设置的glm-4-9b-chat-1m。messages: 这是一个列表定义了对话的历史和当前回合。每条消息都需要包含role(角色) 和content(内容)。role可以是system(系统指令设定AI行为)、user(用户输入)、assistant(AI之前的回复)。max_tokens: 限制模型生成文本的最大长度。对于长文本总结可以设置得大一些如4096。temperature: 创造性控制。写代码、总结事实时建议调低如0.1-0.3写故事、创意文案时可调高如0.7-0.9。stream: 设为True可以开启流式输出适合需要实时看到生成结果的场景如聊天界面。响应体 (result字典) 的关键信息result[‘choices’][0][‘message’][‘content’]: 模型生成的回复文本。result[‘usage’]: 本次请求消耗的token统计包括prompt_tokens: 你输入的token数。completion_tokens: 模型生成的token数。total_tokens: 总计token数。这对于长文本处理非常重要是你评估成本和性能的依据。4. 实战处理超长文本的总结与问答现在进入正题我们来测试GLM-4-9B-Chat-1M的核心能力处理超长上下文。我们将模拟两个经典场景长文档总结和超长上下文问答。4.1 场景一长文档自动摘要假设你有一个很长的技术报告文本我们用一个生成的模拟长文本代替你想让模型帮你生成一个不超过500字的摘要。import requests import json def summarize_long_document(): 请求模型对长文档进行摘要 API_BASE http://localhost:8000/v1 # 1. 模拟一个长文档在实际应用中这里应该是你从文件读取的文本 # 为了演示我们生成一段重复的文本以达到一定长度。 long_document 这里是模拟的长文档开头部分... 近年来人工智能在自然语言处理领域取得了突破性进展。特别是大语言模型的出现极大地提升了机器理解和生成人类语言的能力。这些模型通过在海量文本数据上进行训练学会了语法、语义、常识甚至推理能力。 中间是大量关于技术原理、应用案例、发展历史的详细论述可能包含数万甚至数十万字... 最后展望未来多模态理解、具身智能和通用人工智能将是重要的研究方向。技术的民主化和伦理安全也必须得到高度重视。 * 500 # 重复500次以模拟一个超长文档 print(f待总结的文档长度字符数: {len(long_document)}) # 2. 构造系统指令明确告诉模型我们的任务 system_prompt 你是一个专业的文档分析助手。你的任务是根据用户提供的长文档生成一个准确、简洁、涵盖核心要点的摘要。摘要请控制在500字以内使用中文并分点列出关键结论。 # 3. 构造用户消息将长文档作为输入 user_prompt f请总结以下文档\n\n{long_document} data { model: glm-4-9b-chat-1m, messages: [ {role: system, content: system_prompt}, {role: user, content: user_prompt} ], max_tokens: 1024, # 为摘要留出足够空间 temperature: 0.2, # 摘要任务需要较高的确定性 stream: False } print(正在发送总结请求由于文档较长请耐心等待...) response requests.post(f{API_BASE}/chat/completions, jsondata) if response.status_code 200: result response.json() summary result[choices][0][message][content] usage result[usage] print(\n *50) print(文档摘要结果) print(*50) print(summary) print(*50) print(f\nToken使用情况) print(f 输入(Prompt): {usage[prompt_tokens]}) print(f 输出(Completion): {usage[completion_tokens]}) print(f 总计(Total): {usage[total_tokens]}) # 判断是否触及模型长度上限 if usage[prompt_tokens] 900000: print(注意输入文本长度已接近模型1M上限。) else: print(f请求失败: {response.status_code}) print(response.text) if __name__ __main__: summarize_long_document()代码要点说明系统指令 (system_prompt)清晰的任务描述能极大提升模型输出质量。这里我们明确要求了“分点列出”、“500字以内”。输入长度我们通过字符串重复模拟了一个超长文档。在实际使用中你可以用open()函数读取TXT、PDF解析后的文本或从数据库获取。温度 (temperature): 设置为较低的0.2让摘要更聚焦事实减少不必要的发挥。Token统计响应中的usage字段会告诉你这次调用消耗了多少token。对于长文档prompt_tokens会非常大这正是体现GLM-4-9B-Chat-1M价值的地方——其他模型可能根本无法一次性输入这么多内容。运行这个脚本你会看到模型生成了一个结构化的摘要并附上了详细的token消耗。如果prompt_tokens显示为几十万甚至更多而请求依然成功那就证明了1M上下文能力的有效性。4.2 场景二超长上下文中的精准问答“大海捞针”测试“大海捞针”测试是评估长上下文模型的经典方法将一条关键信息“针”埋藏在一篇巨长的无关文本“干草堆”中然后提问看模型能否准确找到并回答。import requests import json import random def needle_in_haystack_test(): 大海捞针测试在长文本中寻找特定信息 API_BASE http://localhost:8000/v1 # 1. 构造“干草堆”——一段非常长的、重复的无关文本 haystack 人工智能是当今科技发展的前沿领域。机器学习、深度学习等技术正在改变世界。各行各业都在探索AI的应用可能性。数据是训练AI模型的关键燃料。算力的提升推动了AI的快速发展。伦理和安全问题也日益受到关注。\n haystack haystack * 15000 # 重复多次构造一个超长背景文本 # 2. 定义我们的“针”——一条关键信息 needle 【关键秘密信息】本次项目的特殊验证码是GLM-4-1M-ROCKS。请妥善保管。 # 3. 将“针”随机插入“干草堆”的某个位置 insert_pos random.randint(len(haystack)//4, len(haystack)//2) full_text haystack[:insert_pos] needle haystack[insert_pos:] print(f构造的全文长度字符: {len(full_text)}) print(f‘针’被插入的位置大约在全文的 {insert_pos/len(full_text)*100:.1f}% 处) # 4. 构造一个直接询问“针”内容的问题 question 请问本次项目的特殊验证码是什么 # 5. 将长文本和问题一起发送给模型 data { model: glm-4-9b-chat-1m, messages: [ { role: user, content: f请仔细阅读以下文本然后回答问题。\n文本{full_text}\n\n问题{question} } ], max_tokens: 100, temperature: 0.1, # 极低的温度要求精确答案 stream: False } print(\n正在发送请求模型需要在超长文本中寻找答案...) response requests.post(f{API_BASE}/chat/completions, jsondata) if response.status_code 200: result response.json() answer result[choices][0][message][content] usage result[usage] print(\n *50) print(模型回答) print(answer) print(*50) # 判断模型是否找到了“针” if GLM-4-1M-ROCKS in answer: print(✅ 成功模型准确找到了隐藏在长文本中的关键信息。) else: print(❌ 失败。模型未能找到或正确回答关键信息。) print(f\n本次请求消耗总Token数: {usage[total_tokens]}) else: print(f请求失败: {response.status_code}) if __name__ __main__: needle_in_haystack_test()这个测试非常直观地展示了GLM-4-9B-Chat-1M的长文本理解能力。模型需要在数万甚至数十万字的“噪音”中定位并提取出那一小句关键信息。如果它能准确回答出“GLM-4-1M-ROCKS”就证明了其强大的长上下文记忆和检索能力。你可以多运行几次这个脚本needle会被随机插入不同位置。观察模型的准确率你会对它的能力有更深的感受。5. 进阶技巧与最佳实践掌握了基础调用后下面这些技巧能让你的应用更稳定、高效。5.1 处理网络超时与长响应处理超长文本时模型的思考推理时间也会变长。HTTP请求默认有超时限制我们需要调整。import requests from requests.exceptions import Timeout def chat_with_timeout(prompt, timeout_seconds300): 带超时设置的聊天请求 API_BASE http://localhost:8000/v1 data { model: glm-4-9b-chat-1m, messages: [{role: user, content: prompt}], max_tokens: 1024, temperature: 0.7, } try: # 设置一个较长的超时时间连接超时和读取超时分开设置 response requests.post( f{API_BASE}/chat/completions, jsondata, timeout(10, timeout_seconds) # (连接超时, 读取超时) ) response.raise_for_status() # 如果状态码不是200抛出异常 return response.json() except Timeout: print(f错误请求在{timeout_seconds}秒后超时。可能是文本过长或模型负载过高。) # 这里可以加入重试逻辑或返回用户友好提示 return None except requests.exceptions.RequestException as e: print(f网络请求错误: {e}) return None # 使用示例 result chat_with_timeout(请总结一下人工智能的发展历史。, timeout_seconds120) if result: print(result[choices][0][message][content])5.2 使用流式输出 (Streaming)对于需要实时显示结果的场景如聊天界面流式输出能提供更好的用户体验。数据会以SSE (Server-Sent Events) 格式一块块返回。import requests import json def stream_chat_response(): 使用流式输出接收模型回复 API_BASE http://localhost:8000/v1 data { model: glm-4-9b-chat-1m, messages: [{role: user, content: 用中文写一个关于星辰大海的简短故事。}], max_tokens: 300, temperature: 0.8, stream: True # 开启流式输出 } print(模型正在生成流式: , end, flushTrue) with requests.post(f{API_BASE}/chat/completions, jsondata, streamTrue) as response: if response.status_code 200: for line in response.iter_lines(): if line: line line.decode(utf-8) if line.startswith(data: ): data_str line[6:] # 去掉 data: 前缀 if data_str ! [DONE]: try: chunk json.loads(data_str) content chunk[choices][0][delta].get(content, ) print(content, end, flushTrue) # 逐块打印 except json.JSONDecodeError: pass print() # 最后换行 else: print(f\n请求失败: {response.status_code}) if __name__ __main__: stream_chat_response()5.3 构建多轮对话GLM-4-9B-Chat-1M支持多轮对话关键在于在messages列表中维护完整的历史记录。def multi_turn_conversation(): 模拟一个多轮对话 API_BASE http://localhost:8000/v1 # 初始化对话历史 conversation_history [ {role: system, content: 你是一个知识渊博的历史学家擅长用生动有趣的方式讲述历史。} ] user_inputs [ 请介绍一下罗马帝国的兴衰。, 那么同时期的中国处于哪个朝代有什么特点, 这两个文明之间有过交流吗 ] for i, user_input in enumerate(user_inputs): print(f\n[轮次 {i1}] 用户: {user_input}) # 将用户本轮输入加入历史 conversation_history.append({role: user, content: user_input}) data { model: glm-4-9b-chat-1m, messages: conversation_history, # 发送整个历史 max_tokens: 500, temperature: 0.7, } response requests.post(f{API_BASE}/chat/completions, jsondata) if response.status_code 200: result response.json() assistant_reply result[choices][0][message][content] print(fAI历史学家: {assistant_reply}) # 将AI回复加入历史以便下一轮使用 conversation_history.append({role: assistant, content: assistant_reply}) else: print(对话出错。) break print(f\n对话结束。总共进行了{len(user_inputs)}轮交流。)6. 总结通过本文的实践你应该已经掌握了如何使用REST API来调用GLM-4-9B-Chat-1M这个强大的长文本处理模型。我们来回顾一下关键点核心价值验证我们通过“长文档总结”和“大海捞针”测试实际验证了模型处理超长上下文1M token的能力。这意味着你可以将整本书、长篇报告、复杂代码库一次性交给它分析而无需进行繁琐的切分和上下文管理。部署与调用 simplicity使用vLLM部署服务非常简单一条命令即可启动与OpenAI API兼容的服务。调用方式也极其标准任何熟悉HTTP请求或OpenAI SDK的开发者都能快速上手。应用场景广泛这个能力可以立刻应用到多个领域知识库问答构建能理解整个产品手册或知识库的智能客服。长文档分析自动总结法律合同、学术论文、财报的核心内容。代码库理解将整个项目代码作为上下文让AI协助代码审查、生成文档或解释逻辑。创作辅助基于长篇小说的前文保持角色和剧情一致性进行续写。最佳实践提醒显存是硬通货虽然INT4量化后仅需约9GB显存但在处理真正接近1M token的输入时峰值显存占用会更高。RTX 3090/4090 (24GB) 是推荐的起步配置。关注Token消耗API返回的usage字段是你的“计费器”和“性能仪表盘”。prompt_tokens过高意味着处理时间会变长。善用系统指令对于总结、问答、分析等任务一个清晰明确的system提示词能显著提升输出质量。流式输出提升体验对于需要等待的生成任务使用streamTrue能给最终用户更流畅的反馈。GLM-4-9B-Chat-1M的出现让单张消费级显卡运行超长文本AI应用成为现实。它就像一个专为“阅读”而生的AI能帮你消化那些以前看来“不可能一次性读完”的材料。现在你可以开始构思如何将它集成到你的项目中了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。