基于Bash的极简LLM Agent:Dora实现原理与安全实践 如果你正在寻找一个能帮你自动处理日常任务的AI助手但又被那些动辄需要复杂环境、依赖众多、学习成本高的Agent框架劝退那么今天介绍的这个项目可能会让你眼前一亮。Dora一个在Hacker News上引发关注的微型LLM Agent它的核心设计理念是“极简”——整个Agent的实现只依赖一个工具Bash Shell。这意味着只要你的系统能运行Bash命令你就能拥有一个可以理解你自然语言指令并自动执行相应命令行操作的AI助手。这听起来可能有点“反直觉”。在AI Agent框架越来越庞大、功能越来越复杂的今天一个仅靠Bash的Agent能做什么它的价值究竟在哪里这篇文章将为你彻底拆解Dora并提供一个从零到一的完整实践指南。你会发现它的“简陋”恰恰是其强大和普适性的根源尤其适合那些希望快速将AI能力集成到现有运维、开发或数据流程中的开发者。我们将深入探讨为什么一个Bash工具就足以构建一个可用的Agent它背后的工作原理是什么如何亲手搭建并运行它在实际使用中又会遇到哪些“坑”以及如何避开读完本文你将不仅能跑通Dora更能理解这种“最小可行Agent”的设计哲学为你在更复杂的AI工程化实践中提供一种全新的思路。1. Dora 解决了什么问题为什么“仅Bash”是它的杀手锏在深入代码之前我们必须先理解Dora要解决的核心痛点。当前主流的AI Agent框架如LangChain、LlamaIndex、AutoGen等功能强大但架构复杂。它们通常需要你理解其特定的“Tool”、“Skill”、“Chain”等抽象概念。为每个工具编写对应的Python函数或类并处理复杂的输入输出格式。管理模型调用、记忆、流程控制等中间状态。处理Python环境依赖、版本冲突等问题。这对于想快速验证一个想法或者仅仅想用AI自动执行一些简单系统命令如文件操作、进程管理、软件安装的开发者来说学习成本和启动成本都太高了。Dora的答案极其简单既然最终绝大多数自动化操作都要落到执行系统命令上为什么不直接让LLM来生成并执行这些命令呢这就是Dora“仅Bash”设计的精髓零额外依赖不需要安装特定的SDK不需要学习新的框架API。Bash是Unix/Linux/macOS乃至Windows通过WSL或Git Bash系统的通用语言。能力无限扩展理论上任何你能在命令行里完成的操作Dora都能尝试去做。文件管理ls,cp,mv,find、文本处理grep,awk,sed、网络请求curl、包管理apt,yum,brew、进程控制ps,kill等等。你的系统工具链就是Dora的工具库。极低的集成成本你可以将Dora看作一个“智能化的命令行解释器”。它能非常容易地嵌入到现有的Shell脚本、CI/CD流水线或运维监控脚本中。因此Dora最适合的场景是个人效率工具自动整理下载文件夹、批量重命名文件、定时抓取网页信息并保存。轻量级运维自动化检查磁盘空间、查看服务日志、重启异常进程。开发环境搭建助手根据项目描述自动安装依赖、配置环境变量。AI Agent入门教学理解Agent最核心的“规划-执行-观察”循环而不被复杂框架干扰。它的局限性也同样明显安全性和可靠性。让AI直接执行Bash命令无异于赋予其很高的系统权限。一个错误的rm -rf命令就可能造成灾难。因此Dora更像是一把锋利的手术刀在信任的环境下如个人电脑、隔离的容器内能发挥巨大作用但在生产服务器上则需要极其审慎的沙箱隔离。接下来我们从原理到实践一步步揭开Dora的面纱。2. 核心原理LLM如何与Bash协同工作Dora的核心工作流程是一个经典的ReActReasoning Acting模式简化版。它不需要复杂的记忆模块或工具注册机制其生命周期完全围绕一次用户查询展开。我们可以将其分解为以下几个核心步骤指令接收用户输入一个自然语言描述的任务例如“帮我找出当前目录下所有超过100MB的日志文件并列出它们的名字和大小。”任务规划与命令生成Dora将用户指令和当前系统的上下文如当前工作目录PWD一起提交给大语言模型LLM。LLM的任务是进行“思考”并输出一个或多个安全、有效的Bash命令来逐步完成这个任务。关键点在于LLM输出的必须是纯Bash命令不能包含任何解释性文字。命令执行Dora接收到LLM生成的Bash命令后在子进程中执行它。结果观察Dora捕获命令执行后的标准输出stdout和标准错误stderr。循环判断Dora将上一步的执行结果再次反馈给LLM。LLM根据结果判断任务是否已经完成如果完成则输出最终答案给用户如果未完成则基于当前结果生成下一个Bash命令回到第3步。这个循环会持续进行直到LLM认为任务已达成或者达到了预设的最大循环次数。一个简化的伪代码逻辑如下# 伪代码展示Dora核心循环 def dora_agent(user_query, max_steps5): context f”当前目录{os.getcwd()}” full_prompt f”{context}\n用户请求{user_query}” for step in range(max_steps): # 1. LLM生成命令 llm_response call_llm(full_prompt) bash_command extract_command(llm_response) # 提取纯命令 if is_final_answer(llm_response): return bash_command # 或处理为最终答案 # 2. 执行命令 stdout, stderr run_bash_command(bash_command) # 3. 构建下一轮提示 full_prompt f”{full_prompt}\n上一步执行命令{bash_command}\n输出{stdout}\n错误{stderr}\n接下来应该做什么” return “达到最大步数任务未完成。”与复杂框架的对比特性Dora (极简Bash Agent)传统Agent框架 (如LangChain)工具定义无需定义整个Bash环境即工具集需要为每个功能编写Python Tool类交互协议纯文本指令-Bash命令-输出结构化对象ToolCall, ToolMessage学习成本极低只需懂Bash中高需学习框架概念和API灵活性极高无缝利用所有命令行工具受限于已封装的Tools安全性低直接操作系统可控可对每个Tool做权限限制适用场景个人自动化、快速原型、教育复杂业务流程、生产环境、需严格管控的场景理解了原理我们就可以开始动手搭建了。Dora的实现本身非常简单其复杂性主要在于如何与LLM API交互以及如何安全地执行命令。3. 环境准备你需要什么来运行Dora由于Dora是一个概念性项目其具体实现可能是一段Python脚本。为了复现我们需要准备一个基础的Python环境和访问LLM的能力。核心依赖操作系统推荐Linux或macOS因为它们拥有完整的Bash环境。Windows用户可以通过WSL2获得最佳体验或者使用Git Bash功能可能受限。Python版本3.8或以上。这是运行控制脚本的通用语言。Bash Shell确保/bin/bash可用。LLM API访问权限这是Dora的“大脑”。你可以选择OpenAI API最通用效果稳定。需要注册并获取API Key。Azure OpenAI企业级选择。开源模型本地部署如通过Ollama运行Llama 3、Qwen等模型或使用vLLM等推理框架。这需要一定的本地GPU资源或熟练的部署技巧。其他兼容OpenAI API的接口如DeepSeek、智谱AI等提供的接口。本文将以OpenAI API为例进行演示因为它最易于获取和集成。如果你使用其他方式只需替换API的Base URL和Key即可。环境检查打开你的终端执行以下命令来确认基础环境。# 检查Python版本 python3 --version # 检查Bash版本 bash --version # 创建一个干净的目录用于本项目 mkdir dora-agent-demo cd dora-agent-demo接下来我们将创建一个虚拟环境并安装必要的Python包。# 创建Python虚拟环境可选但强烈推荐 python3 -m venv venv # 激活虚拟环境 # Linux/macOS source venv/bin/activate # Windows (cmd) # venv\Scripts\activate.bat # Windows (PowerShell) # venv\Scripts\Activate.ps1 # 安装核心依赖用于调用OpenAI API pip install openai # 可选安装colorama用于彩色输出方便阅读 pip install colorama环境准备就绪现在我们可以开始编写Dora的核心逻辑了。4. 从零实现一个Dora核心代码拆解我们将分模块构建一个最小可用的Dora Agent。这个实现包含了安全执行、循环控制等关键考虑。4.1 项目结构规划dora-agent-demo/ ├── dora.py # Dora Agent 主逻辑 ├── config.py # 配置文件存放API Key等 ├── requirements.txt # 依赖列表 └── README.md # 项目说明4.2 配置文件 (config.py)首先将敏感信息如API Key放在配置文件中不要硬编码在代码里。# config.py import os from dotenv import load_dotenv # 可选用于从.env文件加载 # 如果使用python-dotenv可以加载.env文件 # load_dotenv() class Config: # 从环境变量中读取或直接写在这里不推荐 OPENAI_API_KEY os.getenv(“OPENAI_API_KEY”, “your-api-key-here-placeholder”) OPENAI_API_BASE os.getenv(“OPENAI_API_BASE”, “https://api.openai.com/v1”) # 默认为官方 OPENAI_MODEL os.getenv(“OPENAI_MODEL”, “gpt-4o-mini”) # 或 “gpt-3.5-turbo” # 注意生产环境中应使用环境变量或密钥管理服务切勿将真实密钥提交到代码仓库。创建一个.env文件来管理密钥确保该文件在.gitignore中# .env OPENAI_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx OPENAI_MODELgpt-4o-mini4.3 Dora Agent 主逻辑 (dora.py)这是最核心的部分。我们逐步构建这个类。# dora.py import subprocess import sys import os from typing import Tuple, Optional from openai import OpenAI from config import Config class DoraAgent: def __init__(self): # 初始化OpenAI客户端 self.client OpenAI( api_keyConfig.OPENAI_API_KEY, base_urlConfig.OPENAI_API_BASE ) self.model Config.OPENAI_MODEL self.max_steps 10 # 防止无限循环 self.current_dir os.getcwd() # 记录初始工作目录 def run_bash_command(self, command: str) - Tuple[str, str, int]: 安全地执行Bash命令并返回输出、错误和返回码。 注意这里的安全性非常基础仅做演示。生产环境需要沙箱。 try: # 使用subprocess.run可以更好地控制超时和输入 # shellTrue 是必须的因为我们要执行Bash命令 # textTrue 将输出解码为字符串 result subprocess.run( command, shellTrue, executable‘/bin/bash’, # 指定使用bash capture_outputTrue, textTrue, cwdself.current_dir, # 在指定目录执行 timeout30 # 设置超时防止命令长时间运行 ) return result.stdout, result.stderr, result.returncode except subprocess.TimeoutExpired: return “”, “Command timed out after 30 seconds.”, -1 except Exception as e: return “”, f”Failed to execute command: {e}”, -1 def call_llm(self, messages: list) - Optional[str]: 调用LLM获取其回复。 try: response self.client.chat.completions.create( modelself.model, messagesmessages, temperature0.1, # 低温度让输出更确定减少“胡言乱语” max_tokens500 ) return response.choices[0].message.content except Exception as e: print(f”调用LLM API失败: {e}”) return None def extract_bash_command(self, llm_output: str) - str: 从LLM的输出中提取Bash命令。 LLM有时会在命令前后加上解释我们需要提取被 bash 包裹或行首是$的内容。 这是一个简单的启发式方法。 lines llm_output.strip().split(‘\n’) command_lines [] in_code_block False for line in lines: if line.startswith(‘bash’) or line.startswith(‘’): in_code_block True continue elif line.startswith(‘’) and in_code_block: break elif in_code_block: command_lines.append(line) elif line.startswith(‘$ ‘): # 常见提示符格式 command_lines.append(line[2:]) # 如果LLM直接输出了命令没有标记我们假设第一行非空行就是命令 # 这是一个脆弱的假设但对于简单任务和调教好的prompt可能有效 if command_lines: return ‘\n’.join(command_lines).strip() # 如果没有找到代码块或$则返回整个输出风险较高 # 更好的做法是要求LLM严格遵守格式这里为演示简单处理 return llm_output.strip() def build_system_prompt(self) - str: 构建系统提示词这是指导LLM行为的关键。 return f”””你是一个Bash命令行助手。你的目标是根据用户的请求生成安全、正确的Bash命令来完成系统任务。 当前的工作目录是{self.current_dir} 规则 1. 你只能输出Bash命令不要输出任何解释、道歉或Markdown格式除非被要求。 2. 命令必须尽可能安全。避免使用 rm -rf / 或任何可能造成数据丢失或系统损坏的命令除非用户明确要求且你已给出警告。 3. 如果任务需要多个步骤请一次只生成一个命令。我会执行它并把结果返回给你然后你再生成下一个命令。 4. 如果任务已经完成请输出 ‘DORA_FINAL_ANSWER:’ 开头后面跟上给用户的最终总结。 5. 如果命令执行出错请分析错误信息并尝试修复或给出替代方案。 现在请开始帮助用户。你的第一次回复应该是一个Bash命令。“”” def run(self, user_query: str): 运行Agent的主循环。 print(f”用户请求: {user_query}”) print(“-” * 50) # 初始化对话历史 messages [ {“role”: “system”, “content”: self.build_system_prompt()}, {“role”: “user”, “content”: user_query} ] for step in range(self.max_steps): print(f”\n[步骤 {step 1}/{self.max_steps}]”) # 1. 获取LLM响应 llm_response self.call_llm(messages) if llm_response is None: print(“LLM调用失败终止。”) break print(f”LLM 原始回复:\n{llm_response}”) # 2. 检查是否为最终答案 if llm_response.startswith(“DORA_FINAL_ANSWER:”): final_answer llm_response[len(“DORA_FINAL_ANSWER:”):].strip() print(f”\n任务完成最终答案{final_answer}”) return final_answer # 3. 提取并执行命令 bash_command self.extract_bash_command(llm_response) if not bash_command: print(“未提取到有效命令终止。”) break print(f”即将执行命令: {bash_command}”) confirm input(“是否执行此命令(y/N): “).strip().lower() if confirm ! ‘y’: print(“用户取消执行。”) # 将用户取消的信息反馈给LLM让它重新规划 messages.append({“role”: “assistant”, “content”: llm_response}) messages.append({“role”: “user”, “content”: “用户取消了上一条命令的执行。请重新规划或提供一个新的命令。”}) continue stdout, stderr, returncode self.run_bash_command(bash_command) print(f”命令执行结果:”) if stdout: print(f”标准输出:\n{stdout}”) if stderr: print(f”标准错误:\n{stderr}”) print(f”返回码: {returncode}”) # 4. 将执行结果构建成下一轮对话 result_summary f”命令 {bash_command} 已执行。\n” if stdout: result_summary f”输出\n{stdout}\n” if stderr: result_summary f”错误\n{stderr}\n” result_summary f”返回码{returncode}” # 更新消息历史 messages.append({“role”: “assistant”, “content”: llm_response}) messages.append({“role”: “user”, “content”: result_summary}) print(f”\n达到最大步数 ({self.max_steps})任务可能未完成。”) return None if __name__ “__main__”: # 简单的命令行交互 agent DoraAgent() print(“Dora Bash Agent 已启动。输入 ‘quit’ 或 ‘exit’ 退出。”) while True: try: query input(“\n你想让我做什么 “).strip() if query.lower() in [‘quit’, ‘exit’, ‘q’]: break if query: agent.run(query) except KeyboardInterrupt: print(“\n再见”) break4.4 依赖文件 (requirements.txt)openai1.0.0 python-dotenv1.0.0 # 可选用于加载.env文件 colorama0.4.6 # 可选用于彩色终端输出5. 运行与实战让Dora帮你干活代码已经完成现在让我们来实际运行它并测试几个经典场景。5.1 启动Dora Agent首先确保你在项目目录下并且虚拟环境已激活。# 确保安装了依赖 pip install -r requirements.txt # 设置你的OpenAI API Key到环境变量如果你用了.env文件这步可省略 export OPENAI_API_KEY‘your-api-key-here’ # 运行Dora python dora.py如果一切正常你会看到提示符你想让我做什么5.2 实战场景一文件系统探索让我们从一个简单的任务开始。用户请求列出当前目录下所有的Python文件并统计有多少个。Dora背后的LLM可能会生成如下命令并执行# LLM生成的第一条命令 find . -name “*.py” -type f # 执行后输出类似 # ./dora.py # ./config.py # ./test_script.py # LLM根据输出生成的第二条命令 find . -name “*.py” -type f | wc -l # 执行后输出 # 3 # LLM判断任务完成输出最终答案 # DORA_FINAL_ANSWER: 当前目录下共有3个Python文件它们是./dora.py, ./config.py, ./test_script.py。在这个过程中你可以看到Agent的“思考”过程先探索再计数最后总结。5.3 实战场景二信息获取与处理用户请求获取CSDN首页的标题并保存到一个叫csdn_title.txt的文件里。这个任务需要网络请求和文本处理。Dora可能会这样规划# 第一步获取网页内容使用curl curl -s https://www.csdn.net # 输出是完整的HTML难以直接阅读。LLM会意识到需要提取标题。 # 第二步改进命令使用grep和sed提取title标签内容 curl -s https://www.csdn.net | grep -o ‘title.*/title’ | sed ‘s/title//;s/\/title//’ # 假设输出是CSDN - 专业开发者社区 # 第三步将结果保存到文件 echo “CSDN - 专业开发者社区” csdn_title.txt # 第四步验证文件内容 cat csdn_title.txt # 最终输出DORA_FINAL_ANSWER: 已成功获取CSDN首页标题“CSDN - 专业开发者社区”并保存至csdn_title.txt文件。这个例子展示了Dora如何组合多个简单命令curl,grep,sed,echo,cat来完成一个相对复杂的任务。5.4 实战场景三系统状态检查需要权限用户请求检查系统磁盘使用情况找出使用率超过80%的分区。# LLM可能生成的命令 df -h # 执行后输出所有分区信息。LLM需要解析这个表格。 # 它可能会尝试用awk来过滤 df -h | awk ‘NR1 $50 80 {print $1 “ 使用率: “ $5}’ # 最终输出结果。请注意执行df等命令通常是安全的。但在这个交互中手动确认我们代码中实现的y/N提示至关重要尤其是在命令涉及rm、chmod、dd或任何带有sudo的操作时。6. 安全第一Dora的最大风险与防护策略让AI自由执行Bash命令无疑是“赋予它一把能伤人的刀”。在兴奋之余我们必须严肃讨论安全性问题。以下是核心风险和应对策略核心风险数据丢失rm -rf /home/user/important_project即使不是根目录。系统破坏修改系统文件、卸载关键软件、耗尽资源。隐私泄露读取并上传敏感文件如~/.ssh/id_rsa,~/.bash_history。权限提升利用系统漏洞或诱导用户执行sudo命令。基础防护策略在我们的示例代码中已部分体现人工确认每个命令执行前都要求用户确认。这是最后也是最关键的防线。命令过滤实现一个“黑名单”或“危险模式检测”。# dora.py 补充代码 class DoraAgent: def __init__(self): # ... self.dangerous_patterns [ r’rm\s-(rf|fr)\s’, # rm -rf 或 rm -fr r’:\(\)\{.*:\|.*\}’, # Fork炸弹简化检测 r’/dev/sd[a-z]’, # 直接写入磁盘 r’sudo\s’, # 任何sudo命令可根据需要调整 r’chmod\s[0-7]{3,4}\s’, # 危险的权限修改 r’dd\sif.*of/dev/‘, r’mkfs\.‘, r’fdisk\s‘, ] def is_command_dangerous(self, command: str) - bool: import re for pattern in self.dangerous_patterns: if re.search(pattern, command, re.IGNORECASE): return True return False # 在 run_bash_command 或 extract_bash_command 后调用 if self.is_command_dangerous(bash_command): print(f”警告检测到潜在危险命令 ‘{bash_command}‘已阻止执行。”) return “”, “Command blocked by safety filter.”, -1沙箱环境这是生产级使用的必须要求。Docker容器在一个轻量级、无特权的Docker容器中运行Dora。限制其资源CPU、内存、文件系统挂载只读或特定目录和网络访问。系统调用拦截使用seccomp、AppArmor或SELinux来限制进程能执行的系统调用。专用用户使用一个低权限的专用系统用户来运行Dora进程。最佳实践建议永远不在生产服务器上直接运行未经沙箱处理的Dora。将Dora的运行范围限制在特定的“工作区”目录通过cwd参数控制。使用只读文件系统挂载防止其对系统文件进行写操作。网络隔离如果任务不需要网络则禁用容器的网络访问。审计日志记录所有用户查询、生成的命令、执行结果和用户确认操作便于事后追溯。7. 进阶与优化让Dora更强大、更可靠基础版本已经能工作但要让Dora成为一个真正有用的工具还需要很多优化。7.1 增强系统提示词Prompt Engineering系统提示词是Dora的“宪法”决定了LLM的行为模式。我们可以让它更精确明确输出格式严格要求LLM将命令包裹在bash … 中。提供范例在提示词中给出几个正确和错误的例子。限制命令范围例如“你只能使用find,grep,awk,sed,curl,wc,ls,du,df等查询和数据处理命令禁止使用rm,mv,cp等会修改文件的命令除非用户明确要求。”引入“思考链”鼓励LLM在输出命令前先以注释形式简要说明下一步要做什么虽然我们不执行注释。这能提高命令的准确性。7.2 实现短期记忆会话上下文当前的实现中每一轮对话都包含了完整的历史。这对于LLM理解上下文已经足够。但对于更复杂的多轮任务可能需要更结构化的记忆管理比如将重要的执行结果如文件路径、关键变量进行摘要存储。7.3 支持更复杂的工具调用虽然核心是Bash但我们可以包装一些常用操作为“高级工具”让LLM更容易调用。例如我们可以让Dora支持“运行一个Python脚本并处理输出”这本质上还是通过Bash调用python script.py但对LLM的提示可以更友好。7.4 集成到现有工作流Dora可以作为一个模块被其他程序调用CLI工具打包成dora “你的指令”这样的命令行工具。Web服务使用FastAPI或Flask包装成HTTP API供其他系统调用。IDE插件作为VSCode或JetBrains IDE的插件在编辑器内执行自动化任务。8. 常见问题与排查指南在运行Dora的过程中你可能会遇到以下问题问题现象可能原因排查方式解决方案ModuleNotFoundError: No module named ‘openai’Python依赖未安装。检查虚拟环境是否激活执行pip list | grep openai。在项目目录下执行pip install -r requirements.txt。openai.AuthenticationErrorAPI Key错误或未设置。检查config.py或环境变量OPENAI_API_KEY。确保Key正确且所属的API服务如Azure OpenAI的Base URL也配置正确。LLM回复不是Bash命令系统提示词不够严格或模型未遵循指令。查看LLM的原始回复内容。强化系统提示词明确要求“只输出Bash命令”。尝试使用更强大的模型如GPT-4。命令执行失败权限不足尝试执行需要更高权限的命令如监听1024以下端口。查看stderr输出通常包含Permission denied。在安全的前提下调整命令如改用用户目录或由用户手动执行sudo。切勿让Agent自动处理sudo密码。命令执行超时命令运行时间过长如无限循环。代码中已设置timeout30秒。检查生成的命令是否合理。对于已知的长耗时任务可以适当增加超时时间。Agent陷入死循环LLM无法判断任务完成或一直在重复相似命令。观察循环日志看输出是否没有实质性变化。设置更小的max_steps如5或在提示词中要求LLM在几步内完成。手动中断。提取命令失败extract_bash_command函数逻辑无法处理LLM的输出格式。打印llm_response看其具体格式。改进命令提取逻辑使用更稳健的正则表达式或要求LLM使用固定标记如COMMAND:。9. 总结Dora的启示与未来Dora这个“仅Bash”的LLM Agent项目其价值远不止于它那几百行代码所能实现的功能。它向我们清晰地展示了AI Agent的一个本质一个能够理解目标、规划步骤、使用工具、并从结果中学习的循环系统。Bash这个最古老、最通用的系统接口恰恰成为了连接AI与物理世界或数字世界底层最直接的桥梁。通过亲手实现和运行Dora你应该深刻理解到Agent的核心是循环规划-执行-观察-再规划这个循环是智能的体现。工具即能力Agent的能力边界完全由它能调用的工具决定。Bash提供了近乎无限的工具可能性但也带来了最大的安全挑战。提示词即法律系统提示词的质量直接决定了Agent的行为边界和可靠性。设计提示词是一门重要的工程学科。安全是生命线没有安全约束的Agent是危险的玩具。任何涉及自动执行命令的系统都必须将安全设计放在首位。Dora适合谁学习者用于理解Agent工作原理的绝佳教学工具。效率追求者在个人可信环境中自动化那些你明确知道步骤的重复性命令行任务。原型构建者快速验证一个需要与系统交互的AI应用想法。Dora不适合谁生产环境在没有严格沙箱、审计和权限控制的情况下。非技术用户他们无法判断一个Bash命令的安全性。复杂业务流程需要严格事务、状态管理和复杂逻辑编排的场景。你的下一步可以是从这个极简的Dora出发去探索更成熟的框架如LangChain看看它们是如何解决工具封装、记忆管理、安全性和可观测性等工程问题的。你也可以尝试为Dora添加更多功能比如文件上传/下载支持、图形界面GUI操作模拟等。记住最重要的不是工具本身而是你通过构建它而获得的对AI Agent本质的理解。现在你可以关闭这篇文章打开终端开始创建属于你自己的第一个“微型智能体”了。