news 2026/8/24 7:50:35

基于OpenClaw与GLM 5.1构建免费AI Agent:本地部署与实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于OpenClaw与GLM 5.1构建免费AI Agent:本地部署与实战指南

1. 项目概述:当开源框架遇上免费大模型

最近在AI圈子里,一个组合开始被频繁提及:OpenClaw加上GLM 5.1。这个组合之所以吸引人,核心就两个字:免费。对于很多想入门AI Agent开发,或者想低成本验证想法的个人开发者和中小团队来说,动辄需要API调用费用的大模型服务,始终是横在面前的一道门槛。而这个组合,恰好提供了一条绕开这道门槛的路径。

简单来说,OpenClaw是一个开源的AI Agent框架,你可以把它理解为一个“智能体”的骨架和神经系统。它定义了Agent如何感知环境、如何思考决策、如何执行动作。而GLM 5.1,则是智谱AI开源的一个大型语言模型,它扮演着这个“智能体”的大脑角色,负责理解和生成语言,进行逻辑推理。将两者结合,你就能在本地或者自己的服务器上,搭建起一个功能完整的AI Agent,而无需为每一次的模型调用付费。

这不仅仅是省钱的问題。本地部署意味着数据不出域,对于处理敏感信息或需要高定制化的场景至关重要。同时,你获得了完全的掌控权,可以深度定制Agent的行为逻辑、工具调用链,甚至修改框架源码来适应特殊需求。无论是想做一个自动处理邮件的办公助手,一个能分析日志的运维机器人,还是一个陪你聊天的个性化伙伴,这个技术栈都为你提供了从零到一的可能性。接下来,我会结合自己实际的部署和调优经验,把这个看似简单的等式拆解开,让你看到每一步的细节、踩过的坑以及最终能实现的效果。

2. 核心组件深度解析:OpenClaw与GLM 5.1

在动手之前,我们必须先吃透手里的“原材料”。理解OpenClaw的设计哲学和GLM 5.1的能力边界,是后续一切顺利的基础。

2.1 OpenClaw:不只是另一个Agent框架

OpenClaw在众多开源Agent框架中,其设计理念更偏向于轻量、模块化和工程化。它没有追求大而全,而是提供了一个清晰的核心抽象和一套可插拔的组件机制。它的核心架构通常围绕几个关键概念展开:

  • Agent(智能体):这是最主要的对象,封装了从感知到决策再到执行的完整循环。一个Agent通常绑定一个LLM(大语言模型)作为其“大脑”。
  • Skill(技能):这是Agent能力的扩展。你可以把Skill理解为一个个工具函数,比如“搜索网页”、“读写数据库”、“调用某个API”。OpenClaw框架会负责将用户的请求、当前的对话历史和环境上下文组织成提示词(Prompt),交给LLM,LLM则决定调用哪个Skill以及传入什么参数。
  • Memory(记忆):负责存储和检索对话历史、执行结果等,使Agent具备上下文感知能力。简单的实现可以是列表,复杂的可以接入向量数据库进行语义检索。
  • Orchestrator(编排器):这是大脑中的“调度中心”。它管理多个Skill的注册、调用顺序,并处理LLM返回的包含工具调用指令的响应。一个设计良好的编排器能有效处理复杂的多步任务分解。

与一些研究性质的框架不同,OpenClaw的代码结构通常比较清晰,强调配置化。你通过一个配置文件(可能是YAML或JSON)来定义你的Agent:使用哪个模型、加载哪些Skill、记忆容量多大等等。这种设计使得它非常适合快速原型开发和部署。

注意:网络上有时会出现“openclaw llamap svr operator(): got exception”这类错误,这通常指向框架底层与某个特定后端服务(可能是模型服务或工具服务)的通信问题。在后续部署环节,我们会重点讲解如何避免和排查这类连接性错误。

2.2 GLM 5.1:免费且强大的“本地大脑”

GLM(General Language Model)是智谱AI推出的系列大模型。GLM 5.1是其一个重要的开源版本。选择它,核心优势就是完全免费商用,并且提供了足够强的基座能力。

  • 能力定位:GLM 5.1是一个百亿到千亿参数级别的模型,在常识推理、代码生成、中文理解、多轮对话等方面都有不错的表现。对于大多数Agent场景——理解用户指令、规划任务步骤、生成工具调用参数、总结结果——它的能力是足够的。
  • 部署形态:通常,我们需要将GLM 5.1模型部署为一个独立的推理服务。这可以通过官方提供的transformers库加载,并搭配像FastAPITriton Inference Server这样的服务化框架来实现,提供一个标准的HTTP API(通常是OpenAI API兼容格式)供OpenClaw调用。
  • 资源考量:这是本地部署的核心挑战。GLM 5.1的FP16精度模型可能需要20GB以上的GPU显存才能流畅运行。如果没有高端显卡,可以考虑使用量化版本(如INT4/INT8),这能大幅降低显存需求(可能降至10GB以下),虽然会轻微损失精度,但对于很多应用场景是可接受的。CPU推理也是选项,但速度会慢很多,更适合测试或对延迟不敏感的后台任务。

将这两者结合,技术栈就明确了:OpenClaw作为Agent的逻辑运行时,GLM 5.1作为提供智能的模型服务,两者通过HTTP API进行通信。这个架构解耦了框架和模型,非常灵活,未来你想换用DeepSeek、Qwen等其他开源模型,只需要更换模型服务的后端即可。

3. 环境准备与部署实战

理论清晰后,我们进入实战环节。我会以一台Ubuntu 22.04 LTS的服务器(配备NVIDIA GPU)为例,展示从零开始的部署流程。如果你使用Mac或Windows,部分步骤(尤其是Docker相关)可能需要调整。

3.1 基础环境搭建

首先,确保你的系统环境是干净的,并且拥有必要的工具。

  1. 系统更新与依赖安装

    sudo apt update && sudo apt upgrade -y sudo apt install -y python3-pip python3-venv git curl wget # 如果有NVIDIA GPU,安装驱动和CUDA(版本需与PyTorch匹配) # 此处以CUDA 12.1为例,请根据你的显卡和PyTorch版本要求调整 # sudo apt install -y nvidia-driver-535 cuda-toolkit-12-1
  2. 安装并配置Docker(可选但推荐):使用Docker部署GLM模型服务可以极大简化环境依赖问题。

    # 安装Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER # 将当前用户加入docker组,需重新登录生效 # 安装NVIDIA Container Toolkit(用于GPU Docker) distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt update && sudo apt install -y nvidia-container-toolkit sudo systemctl restart docker
  3. 创建项目目录

    mkdir -p ~/ai_agent_project/{openclaw, glm_service} cd ~/ai_agent_project

3.2 GLM 5.1模型服务部署

这是最消耗资源但也最关键的一步。我们采用Docker部署,这是目前最稳定、隔离性最好的方式。

  1. 获取模型:从Hugging Face或ModelScope下载GLM 5.1模型。假设我们使用THUDM/glm-5.1-1B(一个较小的版本用于演示,实际可按需选择更大版本)。

    cd glm_service # 使用git lfs下载(需先安装git-lfs) # sudo apt install git-lfs # git lfs install # git clone https://huggingface.co/THUDM/glm-5.1-1B # 如果网络问题,可以寻找国内镜像源,或者直接下载压缩包

    由于模型文件很大,下载可能需要很长时间。一个更实用的建议是,直接使用已经封装好模型的服务镜像。社区有一些项目提供了开箱即用的Docker镜像。例如,我们可以使用一个兼容OpenAI API的文本生成推理服务。

  2. 使用TGI部署(推荐):Hugging Face的Text Generation Inference(TGI)服务是部署开源LLM的工业级方案。

    # 拉取TGI镜像(支持CUDA) docker pull ghcr.io/huggingface/text-generation-inference:2.0 # 运行容器,加载GLM模型 # 注意:将 `/path/to/your/glm-5.1-1B` 替换为你的实际模型路径 docker run -d --gpus all --shm-size 1g -p 8080:80 \ -v /path/to/your/glm-5.1-1B:/data \ ghcr.io/huggingface/text-generation-inference:2.0 \ --model-id /data \ --max-input-length 4096 \ --max-total-tokens 8192 \ --quantize bitsandbytes-nf4 # 如果需要量化,加上此参数

    这个命令会启动一个服务,在本地8080端口提供兼容OpenAI API的接口(/v1/completions,/v1/chat/completions)。

    实操心得--shm-size 1g参数非常重要,TGI需要共享内存来加速加载。如果模型加载失败或报内存错误,可以尝试增大这个值。另外,首次启动会编译模型内核,可能需要几分钟,请耐心等待日志输出“Connected”字样。

  3. 验证模型服务

    curl -X POST http://localhost:8080/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "/data", "messages": [{"role": "user", "content": "你好,请介绍一下你自己。"}], "max_tokens": 100, "temperature": 0.7 }'

    如果返回一个包含生成文本的JSON响应,说明模型服务部署成功。

3.3 OpenClaw框架安装与配置

接下来,我们设置Agent的大脑——OpenClaw。

  1. 创建Python虚拟环境并安装OpenClaw

    cd ~/ai_agent_project/openclaw python3 -m venv venv source venv/bin/activate # 假设OpenClaw可以通过pip安装(具体包名请查阅其官方文档) # 例如:pip install openclaw-agent # 由于OpenClaw可能还在快速迭代,这里演示从源码安装 git clone https://github.com/opencLAW/OpenClaw.git # 假设的仓库地址,请替换为真实地址 cd OpenClaw pip install -e . # 可编辑模式安装,方便修改源码 pip install openai httpx # 安装必要的依赖,用于调用模型API
  2. 编写核心配置文件:OpenClaw的核心是一个配置文件,我们创建一个config.yaml

    # config.yaml agent: name: "MyGLMAgent" llm: provider: "openai" # 使用OpenAI兼容的API api_base: "http://localhost:8080/v1" # 指向我们刚部署的TGI服务 api_key: "no-key-required" # TGI服务通常不需要key,但有些框架要求非空,可随意填写 model: "/data" # 与TGI启动时的model-id对应 temperature: 0.1 # Agent任务需要稳定性,温度设低些 max_tokens: 1024 memory: type: "buffer" max_tokens: 2000 # 记忆上下文的最大长度 skills: - name: "get_weather" description: "获取指定城市的当前天气信息。" # 这里需要定义skill的具体实现,通常是一个Python函数或模块路径 # 例如:module: my_skills.weather # 为了演示,我们先留空,后续补充 - name: "search_web" description: "使用搜索引擎搜索网络信息。" # 可以继续添加更多技能...
  3. 实现一个简单的Skill:让Agent真正有用,必须为它装备技能。在项目目录下创建my_skills/weather.py

    # my_skills/weather.py import httpx from typing import Dict, Any async def get_weather(city: str) -> Dict[str, Any]: """ 一个模拟的获取天气技能。 在实际应用中,这里应该调用真实的天气API,如和风天气、OpenWeatherMap等。 """ # 这里仅作演示,返回模拟数据 # 真实调用示例(需要API Key): # async with httpx.AsyncClient() as client: # resp = await client.get(f"https://api.weatherapi.com/v1/current.json?key=YOUR_KEY&q={city}") # return resp.json() print(f"[Skill Executed] 查询{city}的天气") return { "city": city, "temperature": "22°C", "condition": "晴朗", "humidity": "65%", "is_success": True }

    然后,更新config.yaml中对应skill的配置:

    skills: - name: "get_weather" description: "获取指定城市的当前天气信息。输入应包含城市名。" module: "my_skills.weather" function: "get_weather" # 指定模块中的函数名
  4. 编写主程序:创建一个run_agent.py来启动我们的Agent。

    # run_agent.py import asyncio import yaml from openclaw.agent import Agent # 假设的导入路径,根据实际框架调整 from openclaw.skills.registry import SkillRegistry async def main(): # 1. 加载配置 with open('config.yaml', 'r', encoding='utf-8') as f: config = yaml.safe_load(f) # 2. 初始化技能注册表并加载自定义技能 registry = SkillRegistry() # 动态加载配置中定义的技能模块 for skill_config in config['agent']['skills']: if 'module' in skill_config: module_name = skill_config['module'] func_name = skill_config.get('function', skill_config['name']) # 这里需要实现动态导入和注册的逻辑 # 假设框架提供了相应方法,如 registry.register_from_module(module_name, func_name, skill_config) print(f"Loading skill: {skill_config['name']} from {module_name}.{func_name}") # 3. 创建Agent实例 # 假设Agent类接受配置和技能注册表 agent = Agent.from_config(config['agent'], skill_registry=registry) # 4. 运行一个简单的对话循环 print("Agent启动成功!输入 'quit' 退出。") while True: try: user_input = input("\nYou: ") if user_input.lower() == 'quit': break # 调用Agent处理输入 response = await agent.run(user_input) print(f"Agent: {response}") except KeyboardInterrupt: break except Exception as e: print(f"处理请求时出错: {e}") if __name__ == "__main__": asyncio.run(main())

    这个主程序勾勒出了OpenClaw Agent工作的基本流程:加载配置 -> 注册技能 -> 创建Agent -> 循环处理用户输入。

4. 运行、测试与核心问题排查

部署完成,让我们点燃引擎,看看这个免费的AI Agent能否跑起来。

4.1 启动与基础功能测试

  1. 启动顺序:务必先启动模型服务,再启动Agent。

    • 终端1(模型服务):确保TGI Docker容器正在运行(docker ps查看)。
    • 终端2(Agent):
      cd ~/ai_agent_project/openclaw source venv/bin/activate python run_agent.py

    如果一切正常,你会看到技能加载的日志,然后进入“You:”提示符。

  2. 基础对话测试

    You: 你好,你是谁? Agent: 我是MyGLMAgent,一个由OpenClaw框架驱动的AI助手。我可以使用各种技能来帮助你,例如查询天气。有什么我可以为你做的吗?

    这测试了Agent的基本对话和自我介绍能力,由GLM模型生成。

  3. 技能调用测试

    You: 今天北京的天气怎么样?

    理想情况下,控制台会先打印出[Skill Executed] 查询北京的天气(这是我们skill函数里的print),然后Agent会整合技能返回的结果,生成最终回复:

    [Skill Executed] 查询北京的天气 Agent: 根据查询,北京当前的天气情况是:气温22°C,天气晴朗,湿度65%。

    这证明了OpenClaw成功地将用户指令解析为对get_weather技能的调用,并传入了正确的参数“北京”,最后将技能返回的结构化数据组织成了自然语言回复。

4.2 常见问题与深度排查指南

在实际操作中,你几乎一定会遇到问题。下面是我踩过坑后总结的排查清单。

问题现象可能原因排查步骤与解决方案
启动Agent时连接模型服务失败1. 模型服务未启动或端口不对。
2. 网络策略(防火墙)阻止。
3.config.yamlapi_base配置错误。
1.docker ps检查容器状态,curl http://localhost:8080/health检查健康端点。
2. 在Agent主机上telnet localhost 8080测试端口连通性。
3. 仔细核对配置文件中的URL,确保是http://<host>:<port>/v1
出现openclaw llamap svr operator(): got exception类错误这是框架内部错误,通常源于与后端服务通信时的异常响应。1.查看完整错误日志:错误信息里通常有更详细的HTTP状态码和响应体。运行Agent时加上-v--verbose参数。
2.直接测试模型API:用curl命令(如3.2节所示)直接向模型服务发送请求,看是否返回正常JSON。如果不正常,问题在模型服务端。
3.检查请求格式:OpenClaw发给模型服务的请求体可能不符合TGI的预期。需要对比OpenClaw发出的请求和TGI文档要求的格式。可能需要修改OpenClaw中LLM客户端的适配代码。
Agent无法正确识别并调用Skill1. Skill描述不够清晰。
2. LLM(GLM)对工具调用的指令遵循能力不足。
3. Skill注册或配置有误。
1.优化Skill描述:在config.yaml中,确保description字段清晰、无歧义,说明输入输出。例如:“获取天气。输入必须是一个城市名称,如‘北京’或‘Shanghai’。
2.调整Prompt:OpenClaw内部会将技能列表和描述格式化成提示词给LLM。如果框架允许,可以微调这部分提示词模板,使其更符合GLM的理解习惯。
3.开启调试:查看OpenClaw与LLM交互的原始提示词和响应,确认LLM是否输出了正确的工具调用JSON。
GLM模型响应慢或显存溢出(OOM)1. 模型太大,显存不足。
2. 输入上下文过长。
3. 未使用量化。
1.使用量化模型:在启动TGI时使用--quantize bitsandbytes-nf4--quantize gptq参数。这是解决显存问题的首选方案。
2.调整参数:在config.yaml中减少max_tokens,在TGI启动命令中减少max-input-lengthmax-total-tokens
3.升级硬件或考虑使用更小的模型版本(如1B、3B参数版本)。
Skill执行成功,但Agent回复内容不佳LLM的后处理(整合技能结果生成回复)能力不足或提示词不佳。1.提供示例:在Skill的配置或系统的Prompt中,加入一个工具调用和回复的示例(Few-shot),引导GLM更好地组织语言。
2.微调模型:如果对领域回复要求极高,可以考虑用业务数据对GLM 5.1进行轻量微调(LoRA),但这需要额外的机器学习知识。

核心避坑技巧日志是你的第一道防线。确保OpenClaw框架和TGI模型服务的日志输出级别调到INFODEBUG。大部分诡异的问题,都能在日志中找到线索,比如看到发送的确切请求、接收的原始响应、技能调用的参数等。不要只看最后的报错信息,要追溯完整的执行链路。

5. 进阶优化与生态扩展

一个能跑起来的Agent只是起点。要让它在实际场景中真正有用,还需要进行一系列优化和扩展。

5.1 性能与稳定性优化

  • 模型服务优化
    • 批处理与流式响应:TGI支持批处理请求,如果Agent需要并发处理多个查询,这能提升吞吐量。流式响应(Server-Sent Events)则可以改善用户端对于长文本生成的等待体验。
    • GPU内存管理:使用docker run--gpus参数可以精确指定使用的GPU卡。对于多卡机器,可以研究模型并行,将超大模型拆分到多个GPU上。
  • Agent框架优化
    • 异步与非阻塞:确保你实现的Skill函数(如调用外部API)是异步的(使用async/await),避免阻塞整个Agent的事件循环。
    • 记忆优化:对于长对话,简单的缓冲记忆可能不够。可以集成向量数据库(如Chroma, Qdrant),将历史对话片段向量化存储,实现基于语义的相关记忆检索,让Agent拥有“长期记忆”。
    • 技能编排:复杂的任务需要多个技能协作。OpenClaw的Orchestrator可能需要支持更复杂的逻辑,比如根据上一步技能的结果动态决定下一步。这需要你深入理解框架的编排机制,甚至进行二次开发。

5.2 技能生态建设

Agent的能力完全取决于其技能。除了自己编写,还可以积极利用生态。

  • 集成现有工具库:社区有类似langchain-toolsllama-index的工具集,其中包含大量预定义的技能(如搜索引擎、计算器、文件读写等)。研究OpenClaw如何与这些工具库适配,可以快速扩充Agent能力。
  • 开发复杂技能:真正的生产力技能往往需要对接内部系统。例如:
    • 数据库技能:连接公司MySQL/PostgreSQL,根据自然语言查询生成SQL并返回结果。
    • API聚合技能:将内部多个RESTful API封装成一个技能,让Agent可以处理请假审批、数据报表生成等流程。
    • 代码解释/执行技能:在沙箱环境中安全地执行Python代码片段,用于数据计算或分析。
  • 技能的版本管理与热加载:当技能越来越多,需要考虑如何管理它们的版本、依赖和配置。理想情况下,能够在不重启Agent主进程的情况下,动态加载或更新某个技能。

5.3 部署与监控

  • 容器化部署:将整个OpenClaw Agent也Docker化,与GLM模型服务组成一个docker-compose栈。这简化了依赖管理和部署流程。
    # docker-compose.yml version: '3.8' services: glm-service: image: ghcr.io/huggingface/text-generation-inference:2.0 # ... 同上文TGI配置 networks: - agent-net openclaw-agent: build: ./openclaw # 构建你的OpenClaw应用镜像 depends_on: - glm-service environment: - LLM_API_BASE=http://glm-service:80/v1 networks: - agent-net ports: - "8000:8000" # 暴露Agent的HTTP接口
  • 添加API接口:将上面的run_agent.py改造成一个FastAPI应用,提供标准的HTTP API,方便与其他系统集成。
  • 监控与日志收集:使用Prometheus收集模型服务的推理延迟、显存使用率,以及Agent的请求量、技能调用成功率等指标。使用ELK或Loki收集和分析日志,便于问题追溯。

将OpenClaw与GLM 5.1结合,搭建免费的AI Agent,是一条充满实践乐趣的技术路径。它从零到一地展示了如何将开源模型与Agent框架组装成一个可工作的智能系统。虽然过程中会遇到模型部署、框架适配、提示工程等各种挑战,但每解决一个问题,你对AI Agent技术栈的理解就会加深一层。这个项目本身就是一个极佳的学习平台,你可以在此基础上,尝试接入更强大的模型(如GLM 5.2/5.5, DeepSeek-V4),开发更复杂的技能,最终打造出真正解决你实际问题的智能助手。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/24 7:49:41

多智能体协作重塑长视频:Soap2Soap架构与实现解析

1. 项目概述&#xff1a;当AI导演遇上“肥皂剧”重塑最近在AI视频生成领域&#xff0c;一个名为“Soap2Soap”的项目概念引起了我的注意。这个名字本身就充满了戏谑和想象力——它直指一个非常具体且有趣的场景&#xff1a;将现有的长篇影视内容&#xff08;比如一部肥皂剧&…

作者头像 李华
网站建设 2026/8/24 7:49:10

Java全栈工程师面试核心技术与实战指南

1. 面试前的技术栈梳理&#xff1a;Java全栈工程师的核心能力模型作为从业十年的Java全栈面试官&#xff0c;我见过太多候选人栽在技术栈认知不清的问题上。全栈工程师不是简单的"前端后端"拼凑&#xff0c;而是需要建立完整的系统思维链条。以电商系统为例&#xff…

作者头像 李华
网站建设 2026/8/24 7:48:33

ComfyUI-LTXVideo 完整上手教程:10 分钟跑出第一条 LTX-2 视频

ComfyUI-LTXVideo 完整上手教程&#xff1a;10 分钟跑出第一条 LTX-2 视频 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo ComfyUI-LTXVideo 是 ComfyUI 的 LTX-2 视频生成定制节…

作者头像 李华
网站建设 2026/8/24 7:47:03

AI时代求职必备:5款降AI率工具深度评测

1. 项目概述 2026届毕业生正面临一个前所未有的就业环境——AI技术正在重塑几乎所有行业的招聘标准和工作方式。作为在人力资源科技领域深耕多年的从业者&#xff0c;我观察到近两年企业招聘中AI筛选系统的覆盖率已从2021年的37%飙升至2024年的82%。这意味着&#xff0c;如果你…

作者头像 李华
网站建设 2026/8/24 7:46:50

大模型技术面试核心:强化学习与PPO/GRPO算法解析

1. 大模型技术面试的核心考察方向最近两年大模型技术岗位的面试难度直线上升&#xff0c;尤其是美团这类头部互联网公司的SSP级offer竞争异常激烈。根据我辅导过的30候选人反馈和自身面试官经验&#xff0c;当前大模型技术面试主要聚焦以下三个维度&#xff1a;第一是基础理论深…

作者头像 李华
网站建设 2026/8/24 7:46:25

系统架构设计师考后复盘:从真实考场到架构决策实战

1. 这不是一份“标准答案”&#xff0c;而是一份考后复盘手记2023年11月系统架构设计师考试结束那天&#xff0c;我在考场外的长椅上坐了二十分钟&#xff0c;没急着走。手机里存着刚默写的几道大题题干&#xff0c;耳机里循环播放着自己录下的选择题选项回忆片段——不是为了对…

作者头像 李华