尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

零成本AI助手实战:基于OpenClaw框架与GLM-4.7-Flash模型开发指南

零成本AI助手实战:基于OpenClaw框架与GLM-4.7-Flash模型开发指南 1. 项目概述零成本AI助手的吸引力与实现路径最近在折腾AI应用开发的朋友估计都绕不开一个核心痛点模型API调用成本。无论是OpenAI的GPT系列还是国内各大厂的闭源模型一旦调用量上来账单看着就让人肉疼。对于个人开发者、学生党或者只是想做个demo验证想法的小团队来说这笔开销常常成为项目推进的拦路虎。正是在这种背景下“零成本”和“免费模型”成了极具吸引力的关键词。我最近成功把智谱AI最新推出的GLM-4.7-Flash模型接入了自己一直在用的开源AI应用框架OpenClaw整个过程跑下来效果出乎意料地好。GLM-4.7-Flash作为智谱GLM-4系列中的“轻量版”在保持相当不错的多轮对话、代码生成和逻辑推理能力的同时最关键的是它目前提供了非常慷慨的免费额度这对于我们这种“成本敏感型”开发者来说简直是及时雨。OpenClaw本身是一个设计优雅、模块化程度很高的AI应用开发框架它抽象了模型调用、工具调用、记忆管理、流式输出等核心环节让你能更专注于业务逻辑和交互设计而不是反复造轮子。把免费的GLM-4.7-Flash接入进去就相当于获得了一个功能强大、可定制性极高且几乎不花钱的AI助手底座。你可以基于它快速搭建一个智能客服原型、一个个人知识库问答机器人或者一个帮你处理日常任务的自动化脚本。接下来我就把从环境准备、API配置、代码接入到调试优化的完整过程以及我踩过的几个坑毫无保留地分享出来。2. 核心组件解析为什么是OpenClaw与GLM-4.7-Flash在动手之前我们得先搞清楚手里的“牌”到底怎么样。选择OpenClaw和GLM-4.7-Flash这个组合不是随便选的背后有非常实际的考量。2.1 OpenClaw框架的优势与定位OpenClaw并不是一个面向纯小白的“开箱即用”的聊天界面它是一个面向开发者的框架。这意味着它提供了构建复杂AI应用所需的基础设施比如统一的模型抽象层你不用为每个模型写一套不同的HTTP调用、错误处理和解析逻辑。OpenClaw定义了标准的LLM接口你只需要为新的模型如GLM-4.7-Flash实现一个适配器Adapter。强大的工具调用Function Calling支持这是构建“智能体”Agent的核心。OpenClaw内置了对工具的定义、描述、调用和结果处理的完整流程GLM-4.7-Flash也具备优秀的函数调用能力两者结合可以让你轻松打造能操作数据库、调用天气API、控制智能家居的AI助手。对话历史与记忆管理自动维护上下文对话支持多种记忆后端内存、数据库这对于实现连贯的多轮对话至关重要。流式输出Streaming对于生成较长内容时流式输出能极大提升用户体验OpenClaw对此有良好支持。简单说如果你满足于一个简单的问答对话框可能有更轻量的选择。但如果你想构建一个具备复杂逻辑、能使用工具、有记忆、可扩展的AI应用OpenClaw提供了一个非常扎实的起点避免了从零开始的繁琐。2.2 智谱GLM-4.7-Flash模型特点与免费策略解读GLM-4.7-Flash是智谱AI在2024年推出的轻量化模型。它的“Flash”后缀通常意味着在模型体积和推理速度上做了优化以适应更高并发和更低延迟的场景同时在核心能力上做了保留。能力范围根据官方文档和我的实测它在通用对话、文本理解、代码生成、逻辑推理和中文处理上表现均衡。虽然极复杂的逻辑推理可能不如更大的GLM-4-Plus但对于绝大多数应用场景客服、内容生成、简单代码辅助、数据分析建议已经完全够用甚至超出预期。上下文长度通常支持128K tokens这足以处理很长的文档进行摘要或问答。最关键的成本智谱AI为GLM-4.7-Flash提供了免费的API调用额度。你需要注册智谱AI开放平台账号完成实名认证后通常可以获得一定量的免费token例如每月100万tokens。这个额度对于个人开发、测试和小规模原型来说基本等于零成本。务必去官网查看最新的免费政策这是项目可行的基石。API兼容性智谱的API设计遵循了类似OpenAI的格式这大大降低了接入成本。请求的messages格式、响应结构都很相似使得为OpenClaw编写适配器的工作量减少了很多。这个组合的核心价值在于用开源框架的灵活性结合顶级厂商的免费优质模型快速搭建高可用、低成本、可深度定制的AI应用原型。下面我们就进入实战环节。3. 环境准备与前期配置任何项目的第一步都是把环境搭好。这里我会列出清晰的步骤并说明每个步骤的必要性。3.1 开发环境与依赖安装首先确保你有一个Python开发环境建议Python 3.8。然后为项目创建一个独立的虚拟环境这是避免依赖冲突的好习惯。# 创建并激活虚拟环境以venv为例 python -m venv openclaw-glm-env source openclaw-glm-env/bin/activate # Linux/macOS # 或 openclaw-glm-env\Scripts\activate # Windows接下来安装核心依赖。OpenClaw是核心框架zhipuai是智谱AI的官方Python SDKpython-dotenv用于管理敏感的环境变量如API密钥。pip install openclaw-core zhipuai python-dotenv注意openclaw-core是框架的核心包。根据你想使用的额外功能如Web界面、特定数据库记忆存储可能还需要安装其他扩展包如openclaw-web。这里我们先从核心开始。3.2 智谱AI平台账号与API Key获取这是接入模型的“钥匙”必须妥善保管。注册与登录访问智谱AI开放平台官网用手机号或邮箱注册一个账号。实名认证在平台控制台找到“账户中心”或“安全管理”完成个人或企业实名认证。这是获取免费API调用额度的必要条件。创建API Key认证通过后在控制台找到“API Keys”或“应用管理”页面创建一个新的API Key。创建时可能会让你填写应用名称按提示操作即可。查看免费额度在控制台的相关页面确认GLM-4.7-Flash模型的免费额度详情包括总配额、已使用量和重置周期。3.3 项目结构与安全配置在项目根目录下我们建立以下结构your_project/ ├── .env # 存储环境变量切勿提交到Git ├── .gitignore # Git忽略文件确保.env被忽略 ├── main.py # 主程序入口 ├── glm_adapter.py # 自定义的GLM模型适配器 └── requirements.txt # 项目依赖列表可由pip freeze生成安全是重中之重。绝对不要将API Key硬编码在代码中更不要上传到公开的代码仓库如GitHub。我们使用.env文件来管理。 创建.env文件内容如下ZHIPUAI_API_KEYyour_actual_api_key_here将your_actual_api_key_here替换为你从智谱平台获取的真实API Key。然后在.gitignore文件中确保包含这一行.env在代码中我们通过python-dotenv来加载这个密钥from dotenv import load_dotenv import os load_dotenv() # 加载 .env 文件中的环境变量 api_key os.getenv(ZHIPUAI_API_KEY) if not api_key: raise ValueError(请在 .env 文件中设置 ZHIPUAI_API_KEY 环境变量)这种方式既安全又方便在不同环境开发、测试、生产中可以轻松切换不同的配置。4. 核心实现为OpenClaw编写GLM-4.7-Flash适配器这是整个教程的技术核心。OpenClaw通过适配器模式来支持不同的模型我们需要实现一个符合其LLM接口的类。4.1 理解OpenClaw的LLM接口OpenClaw期望一个LLM类至少实现一个核心方法generate或async_generate用于异步调用。这个方法接收一个消息列表messages格式与OpenAI API兼容和一些生成参数如temperature,max_tokens并返回一个结构化的响应。我们需要新建一个文件比如glm_adapter.py开始编写适配器。4.2 适配器类完整实现与逐行解析下面是我经过调试和优化的适配器代码包含了错误处理、流式输出支持等关键细节。# glm_adapter.py import json from typing import Any, Dict, Iterator, List, Optional, AsyncIterator import logging from openclaw.core.llm.base import LLM, LLMResult, LLMStreamChunk from openclaw.core.schema import Message from zhipuai import ZhipuAI from zhipuai.core._errors import APIError # 设置日志方便调试 logger logging.getLogger(__name__) class GLM47FlashLLM(LLM): OpenClaw适配器 for 智谱GLM-4.7-Flash模型 def __init__( self, api_key: Optional[str] None, model: str glm-4-flash, # 智谱平台上的模型名称 base_url: Optional[str] None, timeout: int 60, **kwargs, ): 初始化GLM客户端。 Args: api_key: 智谱API Key优先从参数获取其次从环境变量ZHIPUAI_API_KEY读取。 model: 模型名称默认为glm-4-flash。 base_url: API基础URL一般无需修改。 timeout: 请求超时时间秒。 **kwargs: 其他传递给ZhipuAI客户端的参数。 self.api_key api_key or self._get_api_key_from_env() self.model model self.base_url base_url self.timeout timeout # 初始化智谱官方客户端 client_kwargs {api_key: self.api_key} if self.base_url: client_kwargs[base_url] self.base_url self.client ZhipuAI(**client_kwargs) # 初始化父类并设置一些默认参数 super().__init__(**kwargs) def _get_api_key_from_env(self) - str: 从环境变量获取API Key。 import os key os.getenv(ZHIPUAI_API_KEY) if not key: raise ValueError( 未提供api_key参数且环境变量ZHIPUAI_API_KEY未设置。 请通过参数传入或在.env文件中设置。 ) return key def _convert_messages(self, messages: List[Message]) - List[Dict[str, Any]]: 将OpenClaw的Message对象转换为智谱API所需的格式。 glm_messages [] for msg in messages: # OpenClaw的Message角色可能是system, user, assistant, tool等。 # 智谱API通常支持 system, user, assistant。 role msg.role # 如果角色是tool在智谱API中可能需要特殊处理这里简单转为assistant并附加内容说明。 # 更复杂的工具调用处理需要结合OpenClaw的Agent流程。 if role tool: # 注意这是一个简化处理。实际生产环境中工具调用结果应被格式化为模型可理解的内容。 # 例如可以拼接成f“工具{msg.name}返回的结果是{msg.content}” role assistant content f[工具调用结果] {msg.content} else: content msg.content glm_messages.append({role: role, content: content}) return glm_messages def generate( self, messages: List[Message], stream: bool False, **kwargs, ) - LLMResult: 同步生成调用。 Args: messages: 消息历史列表。 stream: 是否使用流式输出。本适配器同步方法暂不支持流式请使用异步方法。 **kwargs: 其他生成参数如temperature, max_tokens等。 Returns: LLMResult: OpenClaw标准结果对象。 if stream: raise NotImplementedError(同步generate方法不支持streamTrue请使用异步agenerate方法。) return self._sync_generate(messages, **kwargs) async def agenerate( self, messages: List[Message], stream: bool False, **kwargs, ) - LLMResult: 异步生成调用支持流式和非流式。 Args: messages: 消息历史列表。 stream: 是否使用流式输出。 **kwargs: 其他生成参数。 Returns: 如果streamFalse返回LLMResult如果streamTrue返回一个异步迭代器。 if stream: # 返回一个异步生成器用于流式处理 return self._async_stream_generate(messages, **kwargs) else: # 非流式异步调用 return await self._async_generate(messages, **kwargs) def _sync_generate(self, messages: List[Message], **kwargs) - LLMResult: 同步非流式生成的内部实现。 glm_messages self._convert_messages(messages) params self._build_completion_params(glm_messages, **kwargs) try: logger.debug(f调用GLM API参数: {json.dumps(params, ensure_asciiFalse)}) response self.client.chat.completions.create(**params) choice response.choices[0] message choice.message # 构建OpenClaw标准的LLMResult对象 result LLMResult( contentmessage.content, modelself.model, usage{ prompt_tokens: response.usage.prompt_tokens, completion_tokens: response.usage.completion_tokens, total_tokens: response.usage.total_tokens, }, # 如果模型返回了停止原因可以放在这里 finish_reasonchoice.finish_reason, # 原始响应便于调试 raw_responseresponse, ) return result except APIError as e: logger.error(f智谱API调用失败: {e}) # 这里可以更精细地处理不同的错误码 raise except Exception as e: logger.error(fGLM适配器未知错误: {e}) raise async def _async_generate(self, messages: List[Message], **kwargs) - LLMResult: 异步非流式生成的内部实现。 # 智谱官方SDK的异步支持可能有限这里我们在线程池中运行同步调用以避免阻塞事件循环。 # 对于生产环境如果智谱提供原生异步SDK应优先使用。 import asyncio loop asyncio.get_event_loop() return await loop.run_in_executor(None, self._sync_generate, messages, **kwargs) async def _async_stream_generate( self, messages: List[Message], **kwargs ) - AsyncIterator[LLMStreamChunk]: 异步流式生成的内部实现。 glm_messages self._convert_messages(messages) params self._build_completion_params(glm_messages, streamTrue, **kwargs) try: response self.client.chat.completions.create(**params) # 智谱的流式响应是一个迭代器 for chunk in response: if not chunk.choices: continue delta chunk.choices[0].delta if delta.content is not None: # 构建OpenClaw标准的流式块 yield LLMStreamChunk( contentdelta.content, modelself.model, # 流式响应中可能没有usage信息直到最后 usageNone, finish_reasonchunk.choices[0].finish_reason, raw_responsechunk, ) except Exception as e: logger.error(fGLM流式请求失败: {e}) raise def _build_completion_params( self, messages: List[Dict], stream: bool False, **kwargs ) - Dict[str, Any]: 构建调用智谱API所需的参数字典。 # 基础参数 params { model: self.model, messages: messages, stream: stream, } # 映射OpenClaw常用参数到智谱API参数 # temperature: 温度控制随机性 (0~1) if temperature in kwargs: params[temperature] max(0.01, min(kwargs[temperature], 1.0)) # 智谱要求范围可能不同需确认 # max_tokens: 最大生成token数 if max_tokens in kwargs: params[max_tokens] kwargs[max_tokens] # top_p: 核采样概率 if top_p in kwargs: params[top_p] kwargs[top_p] # 智谱API可能还有其他特有参数如“request_id”等可以通过kwargs传递 # 过滤掉已处理的参数将其他参数直接传递需确保智谱API支持 known_params {temperature, max_tokens, top_p, stream} for key, value in kwargs.items(): if key not in known_params: params[key] value return params关键点解析与注意事项角色转换_convert_messages方法至关重要。OpenClaw内部的Message对象可能包含tool角色表示工具调用的返回结果。智谱API的标准消息角色通常只有system、user、assistant。这里我采用了一个简化策略将tool消息转换为assistant角色并在内容前加上标记。这是一种妥协对于简单的工具调用结果传递是有效的。但对于复杂的、需要模型精确理解工具调用和返回的Agent场景可能需要更精细的提示词工程或者等待智谱API对工具调用角色的原生支持。流式输出我实现了_async_stream_generate方法它返回一个异步生成器。这对于构建实时响应的聊天应用体验提升巨大。注意智谱流式响应的chunk结构可能与OpenAI略有不同需要根据其官方SDK的响应对象属性如chunk.choices[0].delta.content来调整。错误处理使用try-except块捕获智谱SDK抛出的APIError和其他异常并记录日志。在生产环境中你可能需要根据不同的错误码如额度不足、模型过载实现重试或降级策略。参数映射_build_completion_params方法负责将OpenClaw通用的生成参数temperature,max_tokens等映射到智谱API特定的参数名。务必查阅智谱API最新文档确认参数名称和有效值范围。异步支持OpenClaw的agenerate是异步方法。由于智谱官方Python SDK可能主要提供同步客户端我在_async_generate中使用了run_in_executor将同步调用放到线程池中执行以防止阻塞异步事件循环。这是一种通用模式。如果未来智谱提供原生异步客户端直接替换即可。5. 集成测试与基础功能验证适配器写好了接下来就要看看它能不能在OpenClaw的体系里跑起来。我们写一个简单的主程序来测试核心功能。5.1 创建主程序并初始化LLM创建一个main.py文件# main.py import asyncio import sys from dotenv import load_dotenv # 加载环境变量 load_dotenv() # 将当前目录添加到Python路径以便导入自定义适配器 sys.path.insert(0, .) from openclaw.core.schema import Message from glm_adapter import GLM47FlashLLM async def test_basic_chat(): 测试基础对话功能 print( 测试基础对话 ) # 1. 初始化我们的GLM适配器 # API Key会自动从环境变量 .env 文件中读取 llm GLM47FlashLLM() # 2. 构建对话消息 messages [ Message(rolesystem, content你是一个乐于助人的AI助手回答要简洁明了。), Message(roleuser, content请用Python写一个函数计算斐波那契数列的第n项。) ] # 3. 调用模型非流式 print(用户, messages[-1].content) print(AI, end, flushTrue) try: result await llm.agenerate(messages, temperature0.7, max_tokens500) print(result.content) print(f\n使用情况{result.usage}) except Exception as e: print(f\n调用失败{e}) async def test_stream_chat(): 测试流式对话功能 print(\n 测试流式对话 ) llm GLM47FlashLLM() messages [ Message(roleuser, content用一段话介绍秋天的景色。) ] print(用户, messages[-1].content) print(AI, end, flushTrue) try: # 注意agenerate 当 streamTrue 时返回的是异步生成器 stream_result await llm.agenerate(messages, streamTrue, temperature0.9) full_response async for chunk in stream_result: content chunk.content if content: print(content, end, flushTrue) full_response content print() # 换行 # 流式结束时最后一个chunk可能包含finish_reason等信息 except Exception as e: print(f\n流式调用失败{e}) async def test_multi_turn(): 测试多轮对话上下文保持 print(\n 测试多轮对话 ) llm GLM47FlashLLM() conversation_history [ Message(rolesystem, content你是一个知识渊博的历史学家。), Message(roleuser, content唐朝是什么时候建立的), Message(roleassistant, content唐朝于公元618年建立开国皇帝是李渊唐高祖。), ] # 模拟用户追问 new_user_message Message(roleuser, content它的鼎盛时期被称为) conversation_history.append(new_user_message) print(f历史上下文长度{len(conversation_history)} 条消息) print(最新问题, new_user_message.content) result await llm.agenerate(conversation_history) print(AI, result.content) # 验证AI是否记得之前的对话应该提到“贞观之治”或“开元盛世” async def main(): 运行所有测试 await test_basic_chat() await test_stream_chat() await test_multi_turn() print(\n所有测试完成) if __name__ __main__: asyncio.run(main())运行这个脚本python main.py你应该能看到AI生成一个Python斐波那契函数。流式地、逐字输出一段关于秋天景色的文字。在第三轮对话中AI能基于之前“唐朝建立”的上下文正确回答出“贞观之治”或“开元盛世”。如果这一切都正常工作恭喜你核心接入已经成功5.2 验证工具调用Function Calling能力GLM-4.7-Flash支持函数调用这是构建智能体的关键。OpenClaw对此有内置支持。测试工具调用稍微复杂一点需要定义工具并让模型学会调用。这里给出一个概念性验证首先定义一个简单的工具比如查询天气这里模拟# 在main.py中追加或新建测试函数 from openclaw.core.tools import Tool, ToolCall def get_weather(city: str) - str: 获取指定城市的天气信息。 # 这里模拟返回 weather_data { 北京: 晴15~25°C微风, 上海: 多云18~28°C东南风3级, 深圳: 阵雨22~30°C南风2级, } return weather_data.get(city, f未找到{city}的天气信息) async def test_tool_calling(): 测试模型调用工具的能力 print(\n 测试工具调用 ) from openclaw.core.agent import Agent from openclaw.core.tools import ToolSet # 1. 创建工具集并注册工具 toolset ToolSet() # 将我们的函数包装成OpenClaw的Tool对象 weather_tool Tool.from_function( funcget_weather, nameget_weather, description根据城市名称查询实时天气情况, ) toolset.add_tool(weather_tool) # 2. 创建Agent并传入我们的GLM LLM和工具集 llm GLM47FlashLLM() agent Agent(llmllm, toolstoolset) # 3. 运行Agent处理一个需要工具调用的请求 messages [Message(roleuser, content今天北京天气怎么样)] print(用户, messages[0].content) print(AI思考中...) # Agent会自动处理工具调用循环模型决定调用工具 - 执行工具 - 将结果返回给模型 - 模型生成最终回答 result await agent.arun(messagesmessages) print(AI最终回答, result.content)重要提示要使工具调用稳定工作你需要确保在初始化GLM47FlashLLM时可能需要在_build_completion_params中传入tools参数格式需符合智谱API要求。这需要你查阅智谱最新的工具调用API文档并可能修改适配器。OpenClaw的Agent类内部会处理工具调用的循环逻辑但需要底层LLM适配器正确返回工具调用请求。上述示例是一个高级抽象实际实现时可能需要根据OpenClaw的具体版本和智谱API的对接方式进行调整。核心是理解“模型返回工具调用请求 - 框架执行工具 - 框架将结果送回模型”这个流程。6. 性能调优、成本监控与常见问题排查接入成功只是第一步要让这个零成本助手稳定、高效地运行还需要一些“运维”技巧。6.1 关键参数调优指南模型的表现很大程度上受生成参数影响。以下是一些经验值你可以根据场景调整参数含义与影响推荐范围GLM-4.7-Flash适用场景temperature温度控制随机性。值越低输出越确定、保守值越高越有创造性、随机。0.7~0.9(创意写作)0.3~0.7(平衡对话)0.1~0.3(代码生成/事实问答)写故事、诗歌时调高生成代码、提供准确答案时调低。top_p核采样概率。与temperature类似但采样范围是概率质量最高的部分。通常与temperature二选一。0.8~1.0希望输出多样性但避免无关内容时使用。我个人更习惯用temperature。max_tokens生成内容的最大token数。务必设置上限根据需求设定如512, 1024, 2048。对话可设512长文生成可设2048。防止模型“跑飞”生成过长内容浪费token。stream是否流式输出。True(交互式场景)False(后端批量处理)前端聊天界面务必开启提升体验。实操心得对于大多数任务我通常先设temperature0.7,max_tokens1024作为起点。如果发现回答太啰嗦或跑题就把temperature降到0.4如果需要更多创意就升到0.9。max_tokens是控制成本的“安全阀”一定要根据上下文长度合理设置。6.2 免费额度监控与成本控制策略“零成本”建立在免费额度内。必须做好监控避免意外超限。查看用量定期登录智谱AI开放平台控制台在“用量统计”或“账单中心”查看GLM-4.7-Flash的调用次数和token消耗。代码级监控在适配器的_sync_generate方法中每次API调用返回的response.usage里都包含了本次消耗的token数。你可以将这些数据收集起来写入日志或发送到监控系统。# 在_sync_generate方法中获取到result后可以记录 tokens_used result.usage.get(total_tokens, 0) logger.info(f本次调用消耗tokens: {tokens_used})设置预算告警如果平台支持设置用量达到额度80%、90%时的邮件或短信告警。降级方案对于非关键任务或大批量处理可以考虑在代码中实现一个简单的“熔断器”当本月用量接近上限时自动切换到另一个免费的备用模型如果有的话或者暂停服务。6.3 常见错误与解决方案速查表在实际使用中你可能会遇到以下问题问题现象可能原因排查步骤与解决方案APIError: Invalid API Key1. API Key未设置或错误。2. API Key所属环境测试/生产与调用地址不匹配。1. 检查.env文件中的ZHIPUAI_API_KEY是否正确前后有无空格。2. 在智谱平台确认该Key是否启用、是否过期。APIError: Insufficient balance免费额度已用完。1. 登录控制台确认额度。2. 等待下个计费周期重置或考虑购买套餐。APIError: Model overloaded模型服务暂时过载。1. 实现指数退避重试机制如等待2秒、4秒、8秒后重试。2. 稍后再试。响应速度慢1. 网络问题。2. 请求的max_tokens设置过大。3. 模型服务负载高。1. 检查网络连接。2. 适当减小max_tokens。3. 考虑在非高峰时段调用。模型回答不符合预期1.system提示词没生效。2.temperature参数过高或过低。3. 上下文被截断。1. 确认system消息在messages列表最前面。2. 调整temperature。3. 检查总token数是否超过模型上下文窗口128K如果超过需要实现历史消息摘要或滑动窗口。工具调用不生效1. 适配器未正确传递tools参数。2. 工具描述不够清晰。3. 模型本身对工具调用的支持不稳定。1. 调试适配器确保传给智谱API的请求体包含正确的tools字段。2. 优化工具的名称和描述使其更精确。3. 在提示词中明确要求模型使用工具或尝试少量示例few-shot。一个关键的避坑技巧在开发初期务必在代码中添加详细的日志记录每次API调用的请求和响应注意脱敏API Key。这能帮你快速定位是参数问题、网络问题还是模型本身的问题。可以使用Python的logging模块将级别设为DEBUG并在适配器的关键方法中加入logger.debug语句。7. 进阶应用构建你的第一个AI助手实例现在我们已经有了一个可以调用的强大模型。让我们把它用起来构建一个简单的命令行AI助手展示OpenClaw的更多能力。7.1 实现一个简单的交互式命令行助手我们将创建一个持续对话的CLI工具支持历史记忆和清空上下文。# assistant_cli.py import asyncio import sys from typing import List from dotenv import load_dotenv load_dotenv() sys.path.insert(0, .) from openclaw.core.schema import Message from openclaw.core.memory import SimpleMemory # 使用简单的内存记忆 from glm_adapter import GLM47FlashLLM class SimpleAIAssistant: def __init__(self): self.llm GLM47FlashLLM(temperature0.8, max_tokens1024) self.memory SimpleMemory() # 用于存储对话历史 self.system_prompt 你是一个友好的AI助手名字叫‘小智’。回答要清晰、有用如果不知道就诚实地说不知道。 async def chat_loop(self): 主聊天循环 print(f欢迎使用AI助手基于GLM-4.7-Flash输入 /quit 退出 /clear 清空历史。) print(f系统提示: {self.system_prompt}\n) # 将系统提示加入记忆 await self.memory.add_message(Message(rolesystem, contentself.system_prompt)) while True: try: user_input input(\n你: ).strip() except (EOFError, KeyboardInterrupt): print(\n再见) break if not user_input: continue if user_input.lower() /quit: print(再见) break if user_input.lower() /clear: self.memory.clear() # 重新添加系统提示 await self.memory.add_message(Message(rolesystem, contentself.system_prompt)) print(对话历史已清空。) continue # 将用户输入加入记忆 await self.memory.add_message(Message(roleuser, contentuser_input)) # 从记忆获取完整上下文 messages await self.memory.get_messages() print(小智: , end, flushTrue) full_reply try: # 使用流式输出提升体验 stream_result await self.llm.agenerate(messages, streamTrue) async for chunk in stream_result: content chunk.content if content: print(content, end, flushTrue) full_reply content print() # 换行 # 将AI回复加入记忆 if full_reply: await self.memory.add_message(Message(roleassistant, contentfull_reply)) except Exception as e: print(f\n抱歉出错了: {e}) async def main(): assistant SimpleAIAssistant() await assistant.chat_loop() if __name__ __main__: asyncio.run(main())运行这个脚本你就拥有了一个具备上下文记忆、可以连续对话的本地AI助手。它完全运行在免费的GLM-4.7-Flash模型上。7.2 扩展思路从Demo到实用工具这个命令行助手只是一个起点。基于OpenClaw GLM-4.7-Flash这个组合你可以轻松扩展出更多实用场景个人知识库问答利用OpenClaw的RAG检索增强生成模块将你的个人文档PDF、Word、笔记向量化存储。当用户提问时先检索相关文档片段再连同片段一起送给GLM模型生成答案实现精准的私有知识问答。自动化工作流结合OpenClaw的Tool能力和Agent的规划能力让AI助手帮你完成重复性工作。例如定义一个“发送邮件”的工具你就可以用自然语言说“把今天项目会议纪要发给张三和李四”助手会自动总结纪要并调用邮件工具发送。集成到现有应用将我们编写的GLM47FlashLLM适配器实例作为LLM服务提供给你的Web应用如用FastAPI包装、机器人如钉钉/飞书机器人、或者桌面应用。OpenClaw的清晰接口让集成变得非常简单。我个人在实际操作中的体会是免费模型最大的价值在于降低了创新和试错的门槛。你可以用极低的成本几乎是零去验证一个AI想法是否可行去探索各种Prompt技巧和Agent工作流而不必担心账单爆炸。GLM-4.7-Flash在中文场景下的表现相当可靠足以支撑起大多数原型和中等复杂度的应用。当你的应用真的跑起来并获得用户反馈后如果确实需要更强的能力如更复杂的推理、更长的上下文再考虑升级到付费的GLM-4-Plus或其他大模型这样的技术路径是非常稳健和经济的。最后再分享一个小技巧记得定期关注智谱AI开放平台的公告和文档更新。模型的免费政策、API接口、SDK都可能发生变化。将API Key、Base URL等配置项放在环境变量或配置文件中而不是硬编码这样当需要切换模型或更新端点时你会感谢自己当初的这个决定。
返回列表