从OpenClaw到NanoClaw:极简AI Agent框架源码解析与实践指南 1. 项目初探从“OpenClaw”到“NanoClaw”的进化之路最近在AI Agent的圈子里OpenClaw这个名字热度不低但随之而来的就是部署复杂、依赖繁多的抱怨。很多开发者包括我自己都曾被它那庞大的代码库和略显“臃肿”的架构劝退。就在大家琢磨着怎么给它“瘦身”的时候一个名为“NanoClaw”的项目悄然出现在GitHub上短短时间就收获了4.5K的Star。这个项目的口号非常吸引人超极简、轻量级、8分钟理解源码。这听起来像是一个营销话术但作为一个对Agent框架有实际部署和二次开发需求的老码农我决定亲自下场看看它到底是“真香”还是“噱头”。NanoClaw顾名思义可以看作是OpenClaw的“纳米级”实现。它的核心目标不是复刻OpenClaw的所有功能而是提炼其最核心的Agent思想与工作流用最少的代码、最清晰的架构呈现出来。这就像把一本厚重的教科书浓缩成几页核心的思维导图。对于想快速入门Agent原理、理解一个可运行的Agent系统内部如何流转的开发者来说这无疑是一条捷径。它剥离了生产环境中那些复杂的工程化封装、各种中间件适配和性能优化层直指Agent的“心脏”——任务规划、工具调用、记忆与反思循环。那么它到底适合谁呢首先绝对是AI应用和Agent领域的初学者。如果你被LangChain、AutoGen、OpenClaw这些大而全的框架搞得晕头转向不知道从哪里开始看源码NanoClaw就是为你准备的“解剖样本”。其次它也适合需要快速验证某个Agent想法或工作流的中高级开发者。在原型设计阶段你不需要一个重型框架你需要的是一个能快速跑起来、逻辑清晰、方便你随意“动手术”的实验平台。NanoClaw的极简特性正好满足了这一点。最后对于教育者和技术布道者来说这也是一个绝佳的教学案例可以清晰地展示Agent各个组件是如何协同工作的。在深入代码之前我们先明确一下NanoClaw解决的“元问题”它试图证明一个具备基本能力的AI Agent其核心逻辑可以非常简洁。这挑战了“功能强大必然伴随结构复杂”的固有印象。接下来我们就花上“8分钟”当然实际深入分析需要更久一层层剥开它的源码看看这个“纳米级”的Agent是如何被构建出来的。2. 极简架构解析核心模块与数据流转NanoClaw的整个项目结构干净得令人舒适没有深不见底的目录树。通常它的核心源码可能就集中在几个Python文件里比如core.py、agent.py、tools.py和workflow.py。这种设计意图非常明确每个文件职责单一共同勾勒出Agent的完整生命周期。我们先从宏观上把握它的架构。2.1 核心四件套Agent, Task, Tool, Memory一个能自主工作的Agent离不开这几样东西。NanoClaw用最直接的方式定义了它们Agent智能体这是大脑。在NanoClaw中Agent类可能非常精简它的核心属性就是一个LLM大语言模型的客户端比如调用OpenAI或Claude的API以及一个工具列表。它的核心方法可能就是think或act接收一个任务或观察然后决定下一步做什么——是调用工具还是直接给出答案。Task任务这是目标。它可能被定义为一个简单的字符串描述或者一个稍微结构化的对象包含任务ID、描述、状态待处理、执行中、完成、失败等。NanoClaw的任务系统可能不会像OpenClaw那样支持复杂的子任务分解树而是采用更线性的方式或者只实现一层简单的分解以保持简洁。Tool工具这是手脚。这是Agent与外部世界交互的接口。NanoClaw中的工具定义会遵循一个简单的标准比如每个工具都是一个Python函数并附带上一个给LLM看的描述名称、功能、参数schema。当Agent决定使用工具时就调用对应的函数。常见的工具可能包括搜索网页、查询数据库、执行系统命令、读写文件等。Memory记忆这是经验。为了让Agent有上下文感知能力它需要记住之前的对话和操作。NanoClaw可能实现了一种极简的记忆机制比如一个固定长度的对话历史列表或者一个基于向量数据库的简单检索。这部分通常是可选的在最小化版本中可能只是一个在会话中不断追加的列表。2.2 工作流引擎从输入到输出的心跳架构是静态的工作流是动态的。NanoClaw最精彩的部分在于它如何将这些模块串联起来形成一个可以自动运转的循环。这个工作流通常是这样一个循环[用户输入/任务] - [Agent思考] - [决定调用工具?] - [是] - [执行工具] - [观察结果] - [更新记忆] - [循环思考] - [否] - [生成最终回答] - [结束]这个循环在代码中可能体现为一个while循环或一个状态机。循环的退出条件是Agent认为任务已经完成生成了最终回答。在每次循环中Agent都会根据当前的任务描述、历史对话和工具列表决定下一步行动。这个决策过程就是LLM根据特定提示词Prompt进行推理的过程。NanoClaw的巧妙之处在于它把这个提示词模板设计得非常清晰且内聚直接写在代码里或一个单独的配置文件中让你一眼就能看懂Agent的“思考逻辑”。例如提示词会明确告诉LLM“你是一个AI助手你可以使用以下工具[工具列表]。当前任务是[任务]。历史对话是[记忆]。请分析是否需要使用工具如果需要请严格按照JSON格式输出工具调用请求如果不需要请直接输出最终答案。”这种“思考-行动”循环是ReActReasoning and Acting等经典Agent范式的极简实现。通过阅读这部分的代码你可以毫无障碍地理解Agent自主性的来源。2.3 与OpenClaw的对比减法做在哪里理解了NanoClaw有什么更要理解它没什么。相比OpenClaw它主要做了以下减法去除了复杂的技能Skill管理系统OpenClaw可能有复杂的技能注册、发现、组合机制。NanoClaw可能将“技能”简化为“工具”或者只保留少数几个核心、预定义的工具。简化了任务规划与调度OpenClaw可能具备强大的任务分解、依赖关系处理和并行调度能力。NanoClaw可能只做简单的顺序执行或极浅层的任务分解。裁剪了多种记忆类型OpenClaw可能有短期记忆、长期记忆、向量记忆等多种记忆体。NanoClaw很可能只保留最基本的对话历史作为短期记忆。省略了高级监控与评估OpenClaw可能集成了丰富的日志、指标收集和Agent表现评估模块。NanoClaw可能只有最基础的打印日志。简化了部署与集成OpenClaw可能支持Docker容器化、Kubernetes部署、与飞书/钉钉等平台深度集成。NanoClaw就是一个纯粹的Python库/脚本需要你自己写胶水代码去集成。这些减法带来的直接好处就是代码量骤降、逻辑路径单一、学习成本极低。你不再需要面对一个由微服务、消息队列、配置中心组成的分布式系统而是面对一个你可以从头到尾、单步调试的Python程序。这对于理解本质至关重要。3. 8分钟源码速览关键代码片段精读现在我们进入实战环节假设我们只有8分钟来浏览核心源码。我们应该关注哪些文件、哪些函数我会带你像读一篇精悍的短篇小说一样抓住它的主线剧情。3.1 入口与配置一切从哪里开始通常一个极简项目的入口非常明显。我们首先找到一个像main.py、cli.py或example.py的文件。这里展示了如何启动一个Agent并运行一个任务。# 假设的示例代码风格贴近NanoClaw的极简思想 from nanoclaw.agent import Agent from nanoclaw.tools import search_web, calculator def main(): # 1. 初始化Agent传入LLM配置这里是模拟实际是API Key agent Agent( modelgpt-4, tools[search_web, calculator], # 工具列表 memory_size10 # 记忆容量 ) # 2. 定义一个任务 task 请搜索一下今天北京的天气然后计算如果气温下降5度会是多少度。 # 3. 运行Agent final_answer agent.run(task) print(fAgent最终回答: {final_answer}) if __name__ __main__: main()这段代码清晰地展示了三部曲创建Agent、定义任务、执行运行。Agent类的初始化参数点明了它的核心依赖模型、工具和记忆。run方法就是那个核心的工作流循环入口。3.2 Agent核心类think与act的舞蹈接下来我们打开agent.py。核心一定是Agent类而类的核心方法可能就是run、think和_call_tool。class Agent: def __init__(self, model, tools, memory_size5): self.model model # LLM客户端 self.tools {tool.name: tool for tool in tools} # 工具字典方便按名调用 self.memory [] # 简易记忆存储交互历史 self.memory_size memory_size def run(self, task): 核心运行循环 self._add_to_memory(fHuman: {task}) max_steps 10 # 防止无限循环 for step in range(max_steps): # 让Agent思考下一步 thought self.think() # 解析思考结果判断是调用工具还是最终回答 if thought.get(action) tool_call: tool_name thought[tool_name] tool_args thought[args] # 执行工具 observation self._call_tool(tool_name, tool_args) self._add_to_memory(fTool {tool_name} returned: {observation}) elif thought.get(action) final_answer: answer thought[answer] self._add_to_memory(fAssistant: {answer}) return answer # 循环结束返回最终答案 else: # 处理意外情况比如让Agent重新思考 self._add_to_memory(System: Invalid thought format. Please reconsider.) return 任务执行超时或未能完成。 def think(self): 基于当前记忆和任务让LLM决定下一步行动 prompt self._build_think_prompt() # 构建提示词 response self.model.generate(prompt) # 调用LLM # 解析LLM的响应期望是一个结构化的JSON parsed_thought self._parse_response(response) return parsed_thought def _call_tool(self, name, args): 查找并执行工具 if name in self.tools: return self.tools[name].func(**args) # 执行工具函数 else: return fError: Tool {name} not found. def _add_to_memory(self, message): 管理记忆控制长度 self.memory.append(message) if len(self.memory) self.memory_size * 2: # 简单裁剪策略 self.memory self.memory[-self.memory_size:]run方法里的for循环就是Agent的心跳。think方法是决策中枢它构建提示词、调用LLM并解析响应。_call_tool是执行单元。整个流程线性且清晰没有复杂的异步或回调。3.3 提示词工程Agent的“思维框架”_build_think_prompt这个方法至关重要它定义了Agent的“性格”和“思考方式”。我们看看它可能的样子def _build_think_prompt(self): # 工具描述部分 tools_desc \n.join([f- {tool.name}: {tool.description} (参数: {tool.args_schema}) for tool in self.tools.values()]) # 记忆对话历史部分 memory_context \n.join(self.memory[-self.memory_size:]) # 取最近N条 prompt f 你是一个有帮助的AI助手。你可以使用以下工具 {tools_desc} 当前的对话历史 {memory_context} 请根据以上信息决定下一步行动。你必须二选一 A. 调用工具如果你需要更多信息或需要执行操作来完成人类的任务。 B. 直接回答如果你已经拥有足够的信息来给出最终、完整的答案。 如果你选择A调用工具请严格按以下JSON格式回复 {{ action: tool_call, tool_name: 工具名, args: {{参数名: 参数值}} }} 如果你选择B直接回答请严格按以下JSON格式回复 {{ action: final_answer, answer: 你的最终回答内容 }} 只输出JSON不要有任何其他解释。 return prompt这个提示词就是一个完整的“思维框架”。它明确了角色、可用资源工具、上下文记忆、行动选项以及输出的严格格式。通过阅读这个模板你就能完全理解这个Agent是如何被“编程”的。NanoClaw的价值之一就是把这块通常被隐藏或分散配置的核心逻辑赤裸裸地展示给你看。3.4 工具定义标准化接口最后看一眼tools.py了解工具是如何被定义的。通常采用装饰器或简单的类/字典来标准化。# 方式一使用字典定义 def search_web(query): # 模拟搜索 return f关于{query}的搜索结果... search_web_tool { name: search_web, description: 在互联网上搜索信息, args_schema: {query: {type: string, description: 搜索关键词}}, func: search_web } # 方式二使用类定义更清晰 class Tool: def __init__(self, name, description, args_schema, func): self.name name self.description description self.args_schema args_schema self.func func calculator Tool( namecalculator, description执行数学计算, args_schema{expression: {type: string, description: 数学表达式如 2 3 * 4}}, funclambda expression: str(eval(expression)) # 注意实际使用中eval有安全风险此处仅为示例 )工具定义的核心是提供一个给LLM看的描述名称、功能、参数和一个供程序调用的函数。NanoClaw这里的实现会非常直观让你立刻明白如何添加自己的自定义工具。通过以上四个关键代码片段的精读我们已经在8分钟内走马观花地看完了NanoClaw的核心骨架。它确实做到了极简每一个部分都直指Agent技术的核心概念没有多余的装饰。4. 从理解到实践部署、运行与自定义理解了源码下一步就是让它跑起来。NanoClaw的极简特性使得部署和运行异常简单但也意味着你需要自己处理一些OpenClaw已经帮你搞定的事情。4.1 环境准备与快速启动首先克隆项目并安装依赖。由于项目极简依赖项通常很少可能就是一个requirements.txt里面包含openai或anthropic、requests等基础库。git clone NanoClaw的仓库地址 cd nanoclaw pip install -r requirements.txt然后你需要设置LLM的API密钥。这通常通过环境变量来完成# 如果你使用OpenAI export OPENAI_API_KEYyour-api-key-here # 如果你使用Claude export ANTHROPIC_API_KEYyour-api-key-here最后运行项目提供的示例脚本# 假设项目根目录下有一个 run_example.py python run_example.py你应该能看到终端里打印出Agent的思考过程、工具调用和最终结果。整个过程如果顺利几分钟内就能完成。如果遇到类似{ error: { code: 400, ...的错误这通常是API密钥未设置、格式错误或者请求的模型参数不匹配导致的。检查你的环境变量和代码中模型名称是否正确。4.2 添加你的第一个自定义工具这是将NanoClaw用于实际场景的关键一步。假设我们想添加一个获取当前时间的工具。# my_tools.py import datetime def get_current_time(timezoneNone): 获取当前时间。 Args: timezone (str, optional): 时区例如 Asia/Shanghai。默认为系统时区。 Returns: str: 格式化后的当前时间字符串。 now datetime.datetime.now() # 这里可以做时区转换为简化示例直接返回 return now.strftime(%Y-%m-%d %H:%M:%S) # 按照NanoClaw的方式封装工具 from nanoclaw.tools import Tool # 假设它有这个基类或方法 current_time_tool Tool( nameget_current_time, description获取系统的当前日期和时间。, args_schema{ timezone: { type: string, description: 可选的时区名称如 UTC 或 Asia/Shanghai。, required: False } }, funcget_current_time )然后在初始化Agent时将这个新工具加入到工具列表中from nanoclaw.agent import Agent from my_tools import current_time_tool agent Agent( modelgpt-4, tools[current_time_tool, ...], # 加入其他已有工具 memory_size10 ) # 现在你可以问“现在几点了” result agent.run(现在几点了) print(result)通过这个过程你不仅学会了如何扩展NanoClaw更深刻地理解了工具是如何被Agent发现和调用的描述description是给LLM看的“说明书”函数func是实际执行的“机器”。4.3 连接真实世界集成外部API一个只会计算和报时的Agent用处有限。真正的威力在于连接外部系统。让我们以调用一个公开的天气API为例。# weather_tool.py import requests def get_weather(city): 获取指定城市的当前天气。 Args: city (str): 城市名称例如 Beijing。 Returns: str: 天气信息摘要或错误信息。 # 使用一个模拟的或真实的天气API这里用open-meteo为例免费无需key try: # 首先获取城市坐标简化处理实际应用需要更精确的地理编码 geo_url fhttps://geocoding-api.open-meteo.com/v1/search?name{city}count1 geo_resp requests.get(geo_url).json() if not geo_resp.get(results): return f未找到城市 {city} 的信息。 location geo_resp[results][0] lat, lon location[latitude], location[longitude] # 获取天气 weather_url fhttps://api.open-meteo.com/v1/forecast?latitude{lat}longitude{lon}current_weathertrue weather_resp requests.get(weather_url).json() current weather_resp.get(current_weather, {}) temp current.get(temperature) windspeed current.get(windspeed) weathercode current.get(weathercode) # 可以将weathercode转换为文字描述这里简化 return f{city}当前天气温度{temp}°C风速{windspeed} km/h天气代码{weathercode}。 except Exception as e: return f获取天气信息时出错{str(e)} # 封装成工具 weather_tool Tool( nameget_weather, description查询指定城市的实时天气情况。, args_schema{ city: { type: string, description: 城市名称例如 Beijing, Shanghai。, required: True } }, funcget_weather )将这个工具加入Agent后它就能回答“北京天气怎么样”这类问题了。这个过程清晰地展示了如何将任意一个HTTP API、数据库查询或系统命令封装成Agent可用的“技能”。NanoClaw的轻量级设计使得这种集成变得非常直接和灵活。5. 深入原理拆解Agent的决策循环与提示词设计运行起来之后我们有必要再回头深入一下原理层看看NanoClaw这个简洁的循环背后体现了哪些Agent设计的核心思想。这对于你未来设计更复杂的Agent系统至关重要。5.1 ReAct范式的极简实现NanoClaw的工作流本质上是ReActReasoning and Acting范式的一个高度简化版本。ReAct强调通过推理Reason来生成下一步的行动计划或思考轨迹然后行动Act来执行如调用工具再根据行动的观察Observation进行下一轮推理。在NanoClaw的代码中推理Reason体现在think()方法中。LLM根据提示词包含任务、记忆、工具描述进行“思考”其输出被解析为thought字典就是推理的结果。这个结果明确指出了下一步是“行动”还是“回答”。行动Act体现在_call_tool()方法中。根据推理结果执行具体的工具函数。观察Observe工具执行后的返回值被作为observation添加到记忆memory中成为下一轮推理的上下文。这个循环持续进行直到推理结果指出任务已完成action: final_answer。NanoClaw去掉了ReAct论文中常提到的在推理链中显式生成“Thought:”文本的部分而是直接将推理结构化为JSON指令这更贴近工程实现也减少了LLM输出的不确定性。5.2 提示词设计的艺术与陷阱NanoClaw的提示词是其能稳定工作的关键。我们来分析一下它的设计精妙之处和可能的改进点精妙之处角色明确“你是一个有帮助的AI助手。” 设定了基本行为准则。上下文清晰明确提供了“工具列表”和“对话历史”让LLM知道自己能做什么、之前发生了什么。选项有限且互斥只给两个明确的选择调用工具或最终回答极大地降低了LLM“胡思乱想”的概率。输出格式强制要求“严格按以下JSON格式回复”且“只输出JSON”这是保证程序能可靠解析的关键。通过Few-Shot示例在提示词中给出格式样例能进一步提高稳定性。指令简洁没有冗长的背景介绍所有句子都为达成决策服务。潜在陷阱与改进点工具描述的质量工具的描述description和参数模式args_schema必须清晰、准确、无歧义。模糊的描述会导致LLM错误调用或不敢调用。例如“处理文件”就不如“读取指定文本文件的内容并返回”来得明确。记忆的局限性简单的列表式记忆有长度限制且可能包含大量无关信息。当对话轮次变多时可能会干扰LLM的判断。改进方向可以是引入摘要记忆定期总结历史、或基于向量检索的相关记忆提取。错误处理与重试当前的循环中如果LLM输出不符合JSON格式或者调用工具出错处理方式比较简单。一个健壮的Agent需要包含错误处理逻辑比如当解析失败时让LLM重新生成当工具调用失败时将错误信息反馈给LLM让它尝试其他方案。复杂任务规划当前提示词只支持单步决策。对于“写一份报告并发送邮件”这样的多步骤复杂任务LLM可能无法在一步内规划完整。这就需要引入更高级的任务分解Task Decomposition机制这通常是OpenClaw等框架的重点但超出了NanoClaw的极简范畴。你可以在NanoClaw的基础上让LLM先输出一个任务列表然后再循环执行每个子任务。理解这些你就掌握了设计一个可用Agent的“配方”。你可以基于NanoClaw的骨架针对自己的应用场景去优化提示词、增强记忆、完善错误处理从而构建出更强大、更稳定的智能体。6. 性能调优与扩展思路虽然NanoClaw定位是极简和教学但当我们想把它用于一些轻度实际场景时还是需要考虑其性能和扩展性。这里分享一些基于其架构的优化思路。6.1 减少LLM调用次数与成本每次循环都要调用一次LLM这是主要的耗时和成本来源。优化方法包括批量工具调用修改提示词允许LLM在一次思考中规划多个连续的工具调用如果它们之间没有依赖关系。例如让LLM输出一个工具调用列表然后顺序执行。这需要更复杂的输出解析但能显著减少交互轮次。更精准的记忆检索不要总是把全部历史记忆塞进提示词。可以实现一个简单的基于最近性和相关性的记忆筛选。例如只保留最近3轮对话和与当前任务关键词相关的历史记录。这能缩短提示词长度降低Token消耗有时还能提升效果。设置超时与最大步数就像代码中已有的max_steps这是必须的。防止Agent陷入死循环或因为某个工具失败而卡住。达到上限后可以总结已获得的信息尝试给出一个部分答案或明确失败。6.2 增强可靠性与稳定性输出格式校验与重试在_parse_response函数中加入对JSON格式的严格校验。如果解析失败不要直接崩溃或使用默认值而是将错误信息如“你返回的内容不是有效的JSON”连同原始问题再次发送给LLM要求它重试。通常设置1-2次重试就能解决大部分格式问题。工具调用异常处理在_call_tool函数中用try...except包裹工具执行过程。捕获异常后将友好的错误信息如“调用搜索工具时网络超时”作为观察返回给Agent让它决定是重试、换一种方式还是向用户求助。引入验证步骤对于关键操作如发送邮件、修改数据可以在最终执行前增加一个“验证”环节。让LLM总结它将要执行的操作并请求用户确认“我将执行A、B、C确认吗”。这能大大提高系统的安全性。6.3 架构扩展方向当你需要更复杂的多Agent协作或持久化时可以在NanoClaw的基础上进行扩展多Agent协作创建多个NanoClaw Agent实例每个具备不同的专业工具集。设计一个“协调者”Agent或一套简单的规则如基于任务类型路由将任务分配给最专业的Agent去执行并管理它们之间的通信。这其实就是微型的Agent网络。状态持久化将记忆self.memory保存到数据库或文件中。每次启动Agent时加载历史实现跨会话的记忆。这可以让Agent在更长的周期内为用户提供连贯的服务。集成向量数据库对于需要基于大量文档知识进行回答的场景可以将文档切片、向量化后存入向量数据库如Chroma、Milvus。然后增加一个“检索”工具该工具接收用户问题去向量库中查找最相关的片段并将这些片段作为上下文提供给LLM。这就升级成了一个简单的检索增强生成RAGAgent。NanoClaw就像一个乐高积木的基础颗粒。它本身功能简单但结构清晰、接口明确非常适合作为你构建更复杂AI应用的原型或核心组件。通过上述的优化和扩展你可以让它从一个小玩具逐渐成长为一个能解决实际问题的工具。7. 常见问题排查与实战心得在实际把玩NanoClaw的过程中你肯定会遇到各种各样的问题。这里我总结了一些常见的坑和解决思路以及一些从实战中得来的心得。7.1 典型错误与解决方案错误{ error: { code: 400, message: ...可能原因这是最常见的API调用错误。400错误通常意味着请求格式有问题。排查步骤检查API密钥确保环境变量设置正确且密钥有效、有余额。检查模型名称代码中指定的模型如gpt-4是否在你的API账户中可用。有时需要用gpt-4-turbo-preview这样的具体名称。检查请求参数特别是max_tokens、temperature等参数是否在合理范围内。NanoClaw的默认参数可能不适合所有模型。查看完整错误信息错误信息的message字段通常会给出更具体的提示如“该模型不存在”或“输入token超长”。错误JSONDecodeError或无法解析LLM输出可能原因LLM没有严格按照你要求的JSON格式输出可能夹杂了其他解释性文字。解决方案强化提示词在提示词中更加强调“只输出JSON不要有任何其他文字”。可以使用三重引号包裹JSON示例使其更醒目。使用LLM的JSON模式如果使用的LLM API支持如OpenAI的response_format{ type: json_object }强烈建议开启。这会强制模型输出合法JSON。实现解析容错在解析代码中尝试用正则表达式从返回文本中提取第一个完整的JSON对象而不是直接对整个响应进行json.loads()。问题Agent陷入循环不断调用同一个工具可能原因工具返回的结果没有给Agent提供新的、有价值的信息或者任务本身模糊导致Agent无法判断何时结束。解决方案优化工具反馈确保工具返回的信息是明确、结构化、易于理解的。避免返回“成功”或“无结果”这样模糊的信息而是返回“未找到匹配XXX的数据”或“操作已完成影响了Y条记录”。在提示词中明确终止条件在给LLM的指令中加入更具体的任务完成标准。例如“当你获得了天气温度和风速信息后就可以组合成最终答案了。”引入反思步骤在每次工具调用后让LLM简短评估一下当前进度是否足以完成任务。这可以通过在提示词中增加一个问题来实现比如“基于当前获得的所有信息你是否已经可以给出最终答案如果是请输出最终答案如果否请说明还需要什么信息或操作。”7.2 实战心得与技巧从小任务开始不要一开始就让Agent处理“帮我写一个完整的项目计划”这种宏大任务。从“查一下天气”、“计算一下折扣价”这种有明确输入输出、步骤少的任务开始。验证基本流程跑通后再逐步增加复杂度。工具设计要“傻瓜式”给LLM用的工具其描述和参数要尽可能的“傻瓜化”。LLM不像程序员它不理解复杂的编程概念。参数名最好用自然语言词汇描述要像说明书一样一步一步写清楚这个工具是干什么的、输入什么、输出什么。好的工具设计能极大降低提示词工程的难度。温度Temperature参数很重要在调用LLM时temperature参数控制输出的随机性。对于Agent的决策环节通常建议设置为0或一个很低的值如0.1以保证其行为是确定和可靠的。如果设置过高Agent可能会做出一些意想不到的、不稳定的决策。日志是你的好朋友在run循环中详细打印出每一步的thought和observation。这不仅能帮你调试更是理解Agent“思考过程”的绝佳窗口。你会看到LLM是如何理解任务、选择工具、解析结果的这个过程本身非常有启发性。NanoClaw是“起点”不是“终点”它的价值在于让你用最小的代价理解了Agent的核心运行机制。当你需要更复杂的特性如并行任务、流式输出、复杂记忆、可视化监控时就应该考虑转向更成熟的框架如LangChain、AutoGen甚至是回过头去研究OpenClaw。但那时你将带着从NanoClaw获得的理解去学习事半功倍。通过NanoClaw这个精巧的“显微镜”我们得以窥见AI Agent内部最本质的齿轮是如何咬合转动的。它剥离了所有冗余将Agent技术浓缩为一个可运行、可修改、可理解的代码样本。无论你是想快速入门还是需要一个轻量级的实验平台它都提供了一个近乎完美的起点。理解它改造它最终超越它这或许就是开源项目带给我们的最大乐趣。