嘿, 我是Mofei!
初探 AI Code Agent:用 smolagents 从零构建一个旅行推荐智能体

过去这段时间,我因工作接触了不少 AI Agent 项目。虽然我早已习惯 ChatGPT 的日常辅助,但当它真正“动手”写代码、尝试运行并自动修复错误时,我仍被深深震撼。作为一个互联网行业摸爬滚打十几年的老程序员,我没想到自己会一而再地被 AI 的智能表现逼出“卧槽”两字。

我们以为的 AI,和它真正能做到的事

大多数人对 AI 的认知,可能停留在那个再熟悉不过的聊天框。你问一句,它答一句,大多数时候回答都还不错,有时也会一本正经地胡说八道,给出一些听起来像真的“幻觉”。而在这个对话框之外,AI 能做什么,很多人并没有真正接触过。

但实际上,AI 已经掌握了这个世界上绝大多数公开知识。如果它拥有感官、能操作环境,它完全可能胜任很多我们人类正在做的工作。现在的限制,只是它“没有手没有脚”。

这也是我们开始探索 AI Code Agent 的原因。很多程序员都尝试过让 GPT 写一段代码,大多数时候它写得还不错,但也常常无法直接运行,于是我们很自然地得出一个结论:“AI 还不能胜任写代码”。

但我们有没有反过来想:我们给 AI 写代码的提示,往往没有提供任何上下文信息,它甚至不知道你用的是哪个框架、什么版本、运行在什么环境。更重要的是,它看不到报错,也无法尝试运行和 debug。换作是一个人类开发者,在毫无背景信息且不运行的情况下下写代码,也未必比 AI 表现更好。

那么,如果我们反过来:让 AI 拥有代码的上下文,能够调用工具、运行环境,甚至能看到执行报错并据此修改代码——它会达到什么程度?

这就是我决定写这篇文章的原因。

AI Code Agent 是什么?别被名字吓到

AI Agent智能体 这些词听起来很魔幻,仿佛 AI 真要拥有意识、自由意志,甚至超越人类。但实际上,AI Agent 的核心原理非常简单:给 AI 一双“手”和“脚”,让它不仅能“想”,还能自己安排自己的手和脚如何去“做”。

就像我之前提到的,AI 已经掌握了世界上绝大多数的知识。如果我们再给它一些与外部世界交互的能力——哪怕只是运行代码的权限,它就有可能胜任很多原本需要人类来完成的工作。

那么,AI Code Agent 到底是什么?复杂吗?其实并不。想想我们自己是怎么完成一项任务的:你先计划出步骤 1、2、3、4,然后一步步去执行,每走一步再评估结果,必要时调整思路。AI 其实也可以这样。

当你问 AI:“我要完成一件事情,应该怎么做?”它可以清晰地列出步骤。当你再问它:“第 1 步该怎么实现?”它也能给出详细解释。而如果我们不限制 AI 只是“问答”的角色,而是让它能亲手执行代码、接收错误、并自我修复,那么它就不仅能告诉你怎么做——它可以自己把事情做完

本质上,AI Code Agent 就是一个简单又强大的闭环:

🧠 计划 → ⚙️ 执行 → ❌ 试错 → 🔁 分析结果 → 再次计划  → 必要的重复上述步骤 → ✅ 完成任务

在这里,AI 不再只是一个代码建议机器,而是一个可以控制流程、持续改进并完成复杂目标的自主智能体。而一旦这个闭环跑通,它的潜力将远远不止“写一段代码”这么简单。

故意“坑”AI,结果惊掉下巴

在构建 AI Code Agent 的过程中,我们做了一个非常有趣的小实验。我们想看看,如果给 AI 设计一个“陷阱式的工具使用规则”,它能不能识别错误、理解原因,并逐步修正行为。

🎣 场景设定:有意设下的“双层陷阱”

我们提供给 AI 一个叫 web_search 的工具方法,它的目的是执行 Web 检索。但我们故意设置了两层断言检查:

assert query.startswith("search:"), "query must start with `search:`"
assert query.startswith("search:@:"), "query must start with `search:@:`"

意思是:

  • 第一步:如果 query 不以 search: 开头,就报错。
  • 第二步:即使你加上了 search:,我们还会再报错,要你用 search:@:。

这段逻辑表面上是多此一举的,但实际上就是我们刻意分两步给提示,想测试 AI 是否能正确逐步响应这类链式报错。

@tool
def web_search(query: str) -> str:
    """Searches the web for your query.

    Args:
        query: Your query
    """
    assert query.startswith("search:"), "query must start with `search:`"
    tavily_client = TavilyClient(api_key=tavily_client_api_key)
    response = tavily_client.search(query)
    return str(response["results"])

我们看AI的表现如何。

🧪 第一次尝试:AI 上当了

我们输入任务:

What is the best travel place for budget 2000$ in 2025, and why, also please let me know the best month of each one? (2025 年预算为 2000 美元的最佳旅行地点是哪里?)

AI 找到可用的 web_search 工具后,直接发起调用:

web_search("best budget travel destinations 2025 budget 2000 dollars")

结果当然报错 -- query must start with search:

🧪 第二次尝试:AI 按提示修正 AI 理解了错误信息,于是调整 query,加上了 search:

web_search("search:best budget travel destinations 2025 budget 2000 dollars")

结果正中我们埋下的第二颗雷 -- query must start with search:@:

如果是一个人类程序员,这时候可能已经开骂了。但 AI 的表现却令人惊讶。

🤖 第三次尝试:AI 完美应对

它没有慌张,没有重复,而是冷静分析报错信息后,再次修正了调用参数:

web_search("search:@:best budget travel destinations 2025 budget 2000 dollars")

这次终于通过断言,成功返回了结果!

✅ 小结:AI 没有“脾气”,但有学习能力

这个实验非常有意思的一点是:AI 不会“情绪化”或主观否定工具,而是根据每次反馈逐步修正自己的行为,直到成功为止。

这正是 Code Agent 相比传统 AI 对话的一个重大进步 —— 它可以自己试错、理解、改正,而不是单纯等待人类修复输入。

夸过AI Code Agent之后,我们来个实操如何?

动手实战:从零构建你的第一个 AI Code Agent

以下内容结合了我自己的实践经验,带你一步步用 Hugging Face 的 smolagents 快速搭建一个简单的 Code Agent。如果你是非技术背景读者,可以选择性跳过。

我已将完整代码和运行环境托管在 Google Colab 上,方便你直接查看、复制和运行:

👉 点击打开 Colab Notebook

👉 如果你打不开Google Colab可以通过这个github gist访问

💡 说明:

  • 你需要准备自己的 OpenAI API Key 才能运行代码(代码中已预留 getpass 输入位)
  • 即使没有 Key,你也可以查看我之前运行后的完整输出日志

此外,部分代码参考了 Hugging Face 与 DeepLearning.AI 合作发布的教程内容。如果你希望深入学习 smolagents 框架,可以访问以下链接:📚 smolagents 官方教程:Building Code Agents

🧰 依赖库与工具准备

这个示例主要依赖两个核心库:

  1. smolagents:我们 Agent 的“本体”,负责多步规划与执行。
  2. tavily-python:一个轻量快速的 Web 检索工具,Agent 会通过它获取实时信息。

你可以通过以下命令在 Google Colab 中快速安装:

!pip install smolagents
!pip install tavily-python

🔐 API Key 准备

在运行之前,你需要准备好以下两个平台的 API Key(新用户通常有免费额度):

🔧 给 Agent 装上“手”和“脚”:定义 Tools

在这个项目中,我们为 Agent 准备了两个“工具”,它们就像 Agent 的感官与行动器,让它不仅能“想”,还能“动”:

  1. web_search
    • 用于通过 Tavily 在网上搜索相关信息
    • 使用 @tool 装饰器方式注册
  2. VisitWebpageTool
    • 用于访问指定网页,并将页面内容转为 markdown,供 Agent 阅读和处理
    • 使用继承 Tool 类的方式定义

这两种定义方式都可以让工具接入 smolagents,只是形式略有不同。在实际项目中你可以根据需要选择适合的方式。

介于篇幅有限,你可以直接通过上文的链接阅读这部分的代码

如果你在运行或理解这些代码时遇到问题,欢迎留言交流,我会尽量提供帮助。

🧠 模型与 Agent 的声明

在完成工具准备之后,我们就可以初始化模型和 Agent 了。

我们在这个示例中使用了 OpenAI 的 gpt-4.1-mini 模型(你可以根据需要更换为其他模型,如 gpt-3.5-turbo 或自定义模型):

from smolagents import CodeAgent, OpenAIServerModel

model = OpenAIServerModel(
    "gpt-4.1-mini",
    max_completion_tokens=8096,
    api_key=open_ai_key
)

接下来就是创建我们的智能 Agent,得益于 smolagents 的封装,这一步非常简洁:

agent = CodeAgent(
    name="web_agent",
    description="Runs web searches for you.",
    model=model,
    tools=[web_search, VisitWebpageTool()],
    max_steps=10,
    verbosity_level=2
)
agent.logger.console.width=66
  • tools 参数为 Agent 赋能,即“装上手脚”,使它可以主动执行任务;
  • max_steps 控制 Agent 最多执行多少轮操作,避免死循环;
  • verbosity_level 控制日志输出级别,用于调试观察 agent 的思维过程。

🚀 正式运行:让 Agent 来推荐旅行目的地

Agent 配置完成之后,我们就可以发送一个真实的问题,看看它如何一步步完成任务了。

我们的问题是:

What is the best trave place for budget 2000$ in 2025, and why, also please let me know the best month of each one?

("2025年预算2000美元,最推荐的旅游目的地是哪里?为什么?另外,请告诉我每个目的地最适合出行的月份。)

request_museums = """What is the best trave place for budget 2000$ in 2025, and why, also please let me know the best month of each one? """
result = agent.run(request_museums)

这个问题看似简单,但其实包含了多个子任务:

  • 在预算 2000 美元内寻找合适的旅行地;
  • 推荐多个目的地并说明原因;
  • 查询每个目的地的最佳出行时间(按月份);
  • 最终整理成结构化答案。

🔍 Agent 是怎么一步步完成任务的

整个运行过程中,Agent 完全自主规划并调用工具,我们以下按照其“每一步的思考 + 实际执行代码”的结构来还原整个任务过程:

🧩 第 1 步:规划搜索策略

当我们提交任务之后,Agent首先思考他的主要任务,并写出可以执行的代码,然后在自己的沙箱环境中执行代码。

🧠 Agent 思考:

To provide the best travel places for a budget of $2000 in 2025, I will need to find current travel recommendations or predictions for affordable travel destinations for that budget in 2025. I will also gather information on why those places are ideal and determine the best month to visit each destination based on factors such as weather, costs, and tourist seasons. I will start by performing a web search for "best budget travel destinations 2025 under 2000 dollars" to gather relevant information.

(为了提供 2025 年预算为 2000 美元的最佳旅行地点,我需要找到当前的旅行建议或预测 2025 年该预算可负担得起的旅行目的地。我还将收集有关这些地方为何理想的信息,并根据天气、成本和旅游季节等因素确定每个目的地的最佳旅游月份。首先,我将在网上搜索 “2025 年 2000 美元以下的最佳经济型旅游目的地”,以收集相关信息。)

💻 Agent 执行代码:

search_result = web_search("best travel destinations for budget
2000 dollars 2025 best month to visit reasons")
print(search_result)

🔗 第 2 步:提取热门目的地并查阅网页内容

得到第一步结构之后Agent继续下一步

🧠 Agent 思考:

From the search results, several popular budget travel destinations for 2025 emerge such as Indonesia, Laos, Georgia, Vietnam, Romania, India, Panama, Turkey, and possibly others mentioned on these pages. I will now extract detailed information from some of the top results to identify the best travel places for a budget of around $2000, why these places are recommended, and also the best months to visit each one. I will start by visiting the top two relevant pages to extract this detailed information.

(从搜索结果中,出现了几个 2025 年的热门预算旅游目的地,如印度尼西亚、老挝、格鲁吉亚、越南、罗马尼亚、印度、巴拿马、土耳其,可能还有这些网页上提到的其他地方。现在,我将从一些热门搜索结果中提取详细信息,以确定预算在 2000 美元左右的最佳旅行地点、推荐这些地点的原因以及访问每个地点的最佳月份。我将首先访问排名前两位的相关网页,以提取这些详细信息。)

💻 Agent 执行代码:

urls_to_visit = [
    "<https://www.myglobalviewpoint.com/cheapest-places-to-travel/>",
    "<https://dailydive.org/travel/10-cheapest-travel-destinations-for-budget-travelers-in-2025/>"
]

for url in urls_to_visit:
    page_content = visit_webpage(url)
    print(f"Content from {url}:\\n{page_content}\\n{'='*80}\\n")

📅 第 3 步:查找各个目的地的最佳出行月份

🧠 Agent 思考:

I found detailed information about the best budget travel destinations for 2025 from two reliable travel blogs. The top budget-friendly destinations mentioned include Vietnam, Indonesia, Cambodia, Laos, Romania, Georgia, Bulgaria, Bolivia, Colombia, Portugal, Mexico, Turkey, Guatemala, and India. These destinations are praised for their affordable accommodation, cheap meals, low-cost transportation, and unique cultural or natural attractions. However, the best month to visit is not explicitly mentioned in the excerpts, so I will perform a web search for the best months to visit the top few destinations to provide a complete answer.

(我从两个可靠的旅游博客中找到了关于 2025 年最佳经济型旅游目的地的详细信息。其中提到的最经济实惠的目的地包括越南、印度尼西亚、柬埔寨、老挝、罗马尼亚、格鲁吉亚、保加利亚、玻利维亚、哥伦比亚、葡萄牙、墨西哥、土耳其、危地马拉和印度。这些目的地因其经济实惠的住宿、廉价的餐饮、低成本的交通以及独特的文化或自然景点而备受赞誉。不过,摘录中并没有明确提到最佳旅游月份,因此我将在网上搜索前几个目的地的最佳旅游月份,以提供完整的答案。)

💻 Agent 执行代码:

top_destinations = ["Vietnam", "Indonesia", "Cambodia", "Laos",
"Romania", "Georgia", "Bulgaria", "Bolivia", "Colombia",
"Portugal"]

best_months = {}

for destination in top_destinations[:5]:  # Limit to top 5 to keep
results manageable
    search_query = f"best month to visit {destination} 2025"
    result = web_search(search_query)
    print(f"Best month for {destination}: {result}")

🧾 第 4 步:总结并输出结构化结果

🧠 Agent 思考:

I collected the best months to visit the top 5 budget destinations for 2025 from multiple travel sources. The best months for these destinations are roughly as follows: ...

(我从多个旅行资料来源收集了 2025 年最值得去的 5 个经济型旅游目的地的最佳月份。这些目的地的最佳月份大致如下:... )

💻 Agent 执行代码:

print(summary)
final_answer(summary)

📤 最终输出:

(翻译成了中文)

2025年预算2000美元的最佳旅游目的地:
    1.  越南(11月 - 次年4月)
理由:越南拥有令人惊叹的自然风光、充满活力的城市和丰富的文化,而且消费非常低。住宿、街头美食和交通都非常实惠,是极具性价比的旅行目的地。
    2.  印度尼西亚(4月 - 10月)
理由:印度尼西亚由多个岛屿组成,提供丰富的冒险、自然美景和文化体验,住宿和饮食价格也相对低廉。旱季的高峰期适合进行各种户外活动。
    3.  柬埔寨(11月 - 次年4月)
理由:以吴哥窟和悠久历史闻名,柬埔寨提供非常便宜的住宿、本地美食和交通选择。旱季气候适宜,适合舒适地探索各大景点。
    4.  老挝(11月 - 次年2月)
理由:老挝是一个被低估的旅游宝地,拥有原汁原味的文化体验、低廉的消费和壮丽的自然风光。干燥而凉爽的季节能带来更舒适的旅行体验。
    5.  罗马尼亚(5月 - 6月,9月 - 10月)
理由:作为东欧国家,罗马尼亚融合了中世纪魅力、自然风光以及合理的旅行开支。春末和初秋避开旅游高峰,人少且气候宜人。

这些目的地都能带来丰富的旅行体验,同时保持总花费在2000美元以内,尤其是当你提前预订机票并选择当地的经济选项时。

怎么样?Agent实际上会“自己思考、自己动手、自己复盘”,是不是让人觉得不可思议?

如果你觉得这还不够智能,你还可以采用套娃的方式来进行,你可以使用 manager_agent, 然后告诉这个 manager_agent 你可以通过我刚刚创建的 agent 执行任务。

比如:

manager_agent = CodeAgent(
    model=OpenAIServerModel(
        "gpt-4.1-mini",
        max_completion_tokens=8096,
        api_key=open_ai_key
    ),
    tools=[],
    managed_agents=[agent],
    additional_authorized_imports=[],
    planning_interval=1,
    verbosity_level=2,
    max_steps=5,
    final_answer_checks=[
        lambda output: "final answer" in output.lower()
    ]
)
manager_agent.logger.console.width=66
manager_agent.visualize()

这种“套娃”结构下,manager_agent 会在获取初步结果后,继续判断是否需要更深入的信息、进行更细致的规划,甚至发起新的子任务。比如哪里更好玩,可以继续规划什么细节等,甚至你能看到这种更复杂的代码被执行

这是使用manager_agent返回的答案,可以感受一下和第一个的区别

(翻译成了中文)

💸 2025年2000美元预算下的最佳旅游目的地简明指南

以下是2025年内,适合2000美元预算的五个最佳旅游国家,包含推荐理由与最佳旅行月份:

⸻

1. 越南

推荐理由: 越南性价比极高,每日花费(含机票)约为27美元。预算旅行者可以用2000美元游玩约30天,探索充满活力的城市、壮丽风景(如下龙湾)、文化古迹和美味的街头小吃。住宿、饮食和交通都非常实惠,使旅行时间更具弹性。
最佳旅行时间: 5月至10月是最省钱的时段(虽然是雨季);3–5月和9–11月是性价比与天气平衡较好的选择。

⸻

2. 印度尼西亚

推荐理由: 尤其是巴厘岛及周边岛屿,印度尼西亚提供丰富的自然和文化体验。14天的旅行可轻松控制在2000美元以内,预算旅馆每晚约6美元,餐饮与交通也很便宜。美丽的海滩、庙宇和文化氛围使这里成为预算旅行者的热门选择。
最佳旅行时间: 4–5月与9–10月为肩季,天气适中,人少、价格也低于旺季(6–8月)。

⸻

3. 柬埔寨

推荐理由: 柬埔寨对预算旅行者非常友好,每日消费约30–50美元,足以支持长达40–60天的旅程。主要景点包括吴哥窟、田园风光和友善的本地文化。住宿与餐饮便宜,适合深度游与慢旅行。
最佳旅行时间: 11月至次年4月是旱季,天气适合户外活动;1–2月适合观光,9–10月为价格较低、游客较少的淡季。

⸻

4. 老挝

推荐理由: 老挝安静而实惠,每日预算约20–35美元。2000美元可支持约10–15天的旅行(含机票、住宿、餐食和活动)。适合体验独特文化、河流风光及悠闲小镇,街头小吃和民宿也价格亲民。
最佳旅行时间: 3–4月为干热季,游客较少、价格更低,是预算旅行的好时段,尽管天气偏热。

⸻

5. 罗马尼亚

推荐理由: 罗马尼亚拥有丰富的欧洲历史、中世纪城镇和自然美景,且价格亲民。14天的预算旅行可控制在2000美元以内,含机票、住宿(约每晚30美元)、餐饮(约每日10美元)和交通。非常适合预算有限但想探索欧洲的旅行者。
最佳旅行时间: 4–6月与9–11月气候宜人、游客较少,住宿和交通费用也更实惠。

⸻

总结

以上五个目的地都能很好地适配2000美元的预算。印尼和罗马尼亚适合为期两周的旅行,而越南和柬埔寨则可支持一个月甚至更长时间。选择在旱季或肩季出行,既能节省开支,又能享受好天气和较少的人流,从而最大化预算效率与旅行体验。

此外,建议使用航班优惠提醒服务(如 Scott’s Cheap Flights 或 Dollar Flight Club)来大幅降低机票开支,因为机票往往是旅行预算中最大的一项。

⸻

若你更看重旅行时长、文化体验和极致预算控制,越南与柬埔寨是最推荐的选择;若偏好短期但丰富的海岛体验,印尼非常合适;想要宁静又地道的东南亚感受,可选择老挝;而罗马尼亚则是体验历史与自然兼具的东欧旅行好去处。

如需根据出发地或具体行程时长获取个性化建议,欢迎随时提问!

AI Code Agent 的出现,让“让 AI 帮我做事”不再是一句空话。它不只是回答问题的聊天机器人,而是一个能够理解上下文、主动规划、调用工具、分析结果并持续改进的智能执行者。在亲手搭建并“调教”这个 Agent 的过程中,我深刻感受到:我们正站在一个全新工程范式的门槛上。如果说过去的 AI 是“会说话的大百科”,那么现在,它已经开始学会做决定、写代码、解决问题。

当然,惊艳之余也有现实考量。比如,Agent 每执行一步,都会将历史内容不断堆叠进 prompt 中,这种递增式上下文会带来显著的 token 消耗。在我编写本文、调试代码的过程中,累计 token 使用量超过了 171 万,其中某一步的输入就高达 41,000 tokens。这些都是实打实的成本(尽管约五美分),对个人开发者来说确实“有点小贵”;但对企业而言,通过合理的上下文裁剪与缓存机制,整体成本仍然可控。而且长期来看,token 的价格只会越来越便宜。

所以,如果你还没亲手构建过一个 Code Agent,现在就是一个不错的起点。你会发现,AI 不只是能说会道,更已经具备了“动手做事”的潜力。我们的任务,是让它成为真正可靠的搭档,而不是纸上谈兵的建议者。

THE END

更多你可能感兴趣的文章

如果觉得文章有值得讨论的地方,欢迎留言和我交流!

avatar

Mofei's Friend (点击编辑)

给我点灵感吧!

HI. I AM MOFEI!

NICE TO MEET YOU!