7天从零手搓 AI Agent | Day 1:你的第一个"会决策"的程序

Agent 的核心不是"AI",而是"决策"。今天我们从最简单的决策程序开始。


今天的目标

写一个程序,它能:

  1. 接收用户的输入
  2. 判断用户想做什么
  3. 选择对应的动作去执行
  4. 把结果返回给用户

这听起来很简单?对,但这就是 Agent 的核心思想。所有复杂的 Agent 系统,都是在这个基础上长出来的。


先理解一个概念:Agent 的本质

Agent 的本质是一个循环:

观察 → 思考 → 行动 → 观察 → 思考 → 行动 → ...

用代码表示就是:

while True:
    observation = observe()      # 观察:获取用户输入
    thought = think(observation)  # 思考:分析用户意图
    action = act(thought)         # 行动:执行对应操作

今天,我们用最简单的方式实现这个循环。


第一个版本:硬编码的决策

先来看最原始的版本——用 if/else 做决策:

# day1_basic.py

def think(user_input: str) -> str:
    """思考:判断用户想做什么"""
    user_input = user_input.lower().strip()

    if "天气" in user_input:
        return "check_weather"
    elif "时间" in user_input or "几点" in user_input:
        return "check_time"
    elif "新闻" in user_input:
        return "search_news"
    else:
        return "chat"


def check_weather():
    """工具:查天气"""
    return "北京:晴,25°C,空气质量良好"


def check_time():
    """工具:查时间"""
    from datetime import datetime
    return f"现在是 {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"


def search_news():
    """工具:搜新闻"""
    return "今日热点:AI Agent 成为 2025 年最热门技术方向"


def chat(response: str):
    """普通对话"""
    return f"你说的是:{response}"


def main():
    print("=" * 50)
    print("  我的第一个决策程序 v1.0")
    print("  输入 '退出' 结束程序")
    print("=" * 50)

    while True:
        user_input = input("\n你:").strip()
        if not user_input:
            continue
        if user_input == "退出":
            print("再见!")
            break

        # 核心:思考 → 行动
        action = think(user_input)

        if action == "check_weather":
            result = check_weather()
        elif action == "check_time":
            result = check_time()
        elif action == "search_news":
            result = search_news()
        else:
            result = chat(user_input)

        print(f"Agent:{result}")


if __name__ == "__main__":
    main()

运行效果

==================================================
  我的第一个决策程序 v1.0
  输入 '退出' 结束程序
==================================================

你:今天天气怎么样
Agent:北京:晴,25°C,空气质量良好

你:现在几点了
Agent:现在是 2025-06-01 10:30:45

你:有什么新闻
Agent:今日热点:AI Agent 成为 2025 年最热门技术方向

你:你好啊
Agent:你说的是:你好啊

你:退出
再见!

逐行解析

think() 函数——这是 Agent 的"大脑"

def think(user_input: str) -> str:
    user_input = user_input.lower().strip()

    if "天气" in user_input:
        return "check_weather"

这个函数做的事情就是意图识别:用户说了什么 → 它想做什么。

返回值是一个动作标识符(action identifier),比如 "check_weather"。这个标识符告诉后面的代码:应该执行什么操作。

为什么要把"思考"和"行动"分开?

因为思考的方式可能变(今天用 if/else,明天用 AI),但行动的方式不变。分开之后,你可以单独升级任何一部分。


问题来了:if/else 的局限性

上面的程序能跑,但有两个明显的问题:

问题1:每加一个功能,就要改 think()

# 想加一个"算数学"功能,就得加一个 elif
elif "数学" in user_input or "计算" in user_input:
    return "calculate"

功能少还好,多了就变成了几十行的 if/else 链。维护起来很痛苦。

问题2:意图识别太粗糙

if "天气" in user_input:
    return "check_weather"

如果用户说"帮我查一下明天去北京出差需要带什么",这里面有"北京"但不是想查天气。关键词匹配完全不够用。


改进版:用注册表替代 if/else

第二个版本,我们用字典注册来解决第一个问题:

# day1_registry.py

from datetime import datetime


# ========== 工具注册表 ==========
# 每个工具是一个字典:name(名称), description(描述), function(函数)
TOOLS = {
    "check_weather": {
        "name": "查天气",
        "description": "查询指定城市的天气情况",
        "function": lambda: "北京:晴,25°C",
    },
    "check_time": {
        "name": "查时间",
        "description": "获取当前时间",
        "function": lambda: f"现在是 {datetime.now().strftime('%H:%M:%S')}",
    },
    "search_news": {
        "name": "搜新闻",
        "description": "搜索最新的新闻资讯",
        "function": lambda: "AI Agent 是 2025 年最热门技术方向",
    },
}


def think(user_input: str) -> str:
    """思考:基于关键词匹配选择工具"""
    user_input = user_input.lower().strip()

    # 关键词 → 工具的映射
    keyword_map = {
        "天气": "check_weather",
        "几点": "check_time",
        "时间": "check_time",
        "新闻": "search_news",
    }

    for keyword, tool_name in keyword_map.items():
        if keyword in user_input:
            return tool_name

    return "chat"


def execute(tool_name: str) -> str:
    """执行工具"""
    if tool_name in TOOLS:
        return TOOLS[tool_name]["function"]()
    return "抱歉,我不太理解你的意思。"


def list_tools():
    """列出所有可用工具"""
    print("\n可用工具:")
    for name, tool in TOOLS.items():
        print(f"  - {tool['name']}{tool['description']}")


def main():
    print("=" * 50)
    print("  决策程序 v2.0(注册表版)")
    print("  输入 '工具' 查看可用功能")
    print("  输入 '退出' 结束程序")
    print("=" * 50)

    while True:
        user_input = input("\n你:").strip()
        if not user_input:
            continue
        if user_input == "退出":
            print("再见!")
            break
        if user_input == "工具":
            list_tools()
            continue

        action = think(user_input)
        result = execute(action)
        print(f"Agent:{result}")


if __name__ == "__main__":
    main()

关键改进

TOOLS = {
    "check_weather": {
        "name": "查天气",
        "description": "查询指定城市的天气情况",
        "function": lambda: "北京:晴,25°C",
    },
    # ...
}

现在要加一个新工具,只需要在 TOOLS 字典里加一项,然后在 keyword_map 里加一个关键词映射。不需要改 think()execute() 的逻辑。

这就是"注册表模式"——Agent 系统中管理工具的标准做法。


进步了,但还不够

v2 解决了"加功能要改代码"的问题,但"意图识别太粗糙"的问题还在。

关键词匹配永远无法覆盖所有情况。用户说"明天出差需要带伞吗",你说这里面有"天气"相关的意图吗?有,但关键词匹配捕捉不到。

怎么办?用 AI 来做决策。


终极版:让 AI 来思考

第三个版本,我们把 think() 函数交给 AI:

# day1_ai_think.py

import json
from openai import OpenAI

# 配置 Mimo API(兼容 OpenAI 格式)
client = OpenAI(
    api_key="你的API Key",
    base_url="https://api.mimo.ai/v1",  # Mimo API 地址
)

# 工具定义(告诉 AI 有哪些工具可用)
TOOLS_DESCRIPTION = """
你可以使用以下工具:

1. check_weather - 查询天气
   描述:查询指定城市的天气情况
   参数:city (城市名称)

2. check_time - 查询时间
   描述:获取当前日期和时间
   参数:无

3. search_news - 搜索新闻
   描述:搜索最新的新闻资讯
   参数:query (搜索关键词)
"""


def think_with_ai(user_input: str) -> dict:
    """让 AI 来思考应该做什么"""

    system_prompt = f"""你是一个智能助手。根据用户的输入,决定应该调用哪个工具。

{TOOLS_DESCRIPTION}

请用 JSON 格式回复,格式如下:
- 如果需要调用工具:{{"tool": "工具名", "params": {{"参数名": "参数值"}}}}
- 如果是普通对话:{{"tool": "chat", "params": {{"response": "你的回复"}}}}

只输出 JSON,不要输出其他内容。"""

    response = client.chat.completions.create(
        model="mimo-v2-flash",  # 使用 Mimo 模型
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_input},
        ],
        temperature=0,  # 让输出更确定
    )

    # 解析 AI 的回复
    reply = response.choices[0].message.content.strip()

    # 尝试解析 JSON
    try:
        # 去掉可能的 markdown 代码块标记
        if reply.startswith("```"):
            reply = reply.split("\n", 1)[1]
            reply = reply.rsplit("```", 1)[0]
        return json.loads(reply)
    except json.JSONDecodeError:
        # 如果 AI 返回的不是有效 JSON,当普通对话处理
        return {"tool": "chat", "params": {"response": reply}}


def execute(decision: dict) -> str:
    """根据 AI 的决策执行对应操作"""
    tool = decision.get("tool", "chat")
    params = decision.get("params", {})

    if tool == "check_weather":
        city = params.get("city", "北京")
        return f"{city}:晴,25°C,空气质量良好"

    elif tool == "check_time":
        from datetime import datetime
        return f"现在是 {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"

    elif tool == "search_news":
        query = params.get("query", "AI")
        return f"搜索 '{query}' 的结果:AI Agent 成为 2025 年最热门技术方向"

    elif tool == "chat":
        return params.get("response", "我不太理解你的意思。")

    else:
        return f"未知工具:{tool}"


def main():
    print("=" * 50)
    print("  决策程序 v3.0(AI 版)")
    print("  输入 '退出' 结束程序")
    print("=" * 50)

    while True:
        user_input = input("\n你:").strip()
        if not user_input:
            continue
        if user_input == "退出":
            print("再见!")
            break

        print("[AI 思考中...]")
        decision = think_with_ai(user_input)

        print(f"[决策]: 使用工具 '{decision['tool']}',参数: {decision.get('params', {})}")
        result = execute(decision)

        print(f"Agent:{result}")


if __name__ == "__main__":
    main()

运行效果

==================================================
  决策程序 v3.0(AI 版)
  输入 '退出' 结束程序
==================================================

你:明天去上海出差,需要带伞吗?
[AI 思考中...]
[决策]: 使用工具 'check_weather',参数: {'city': '上海'}
Agent:上海:晴,25°C,空气质量良好

你:现在几点了
[AI 思考中...]
[决策]: 使用工具 'check_time',参数: {}
Agent:现在是 2025-06-01 10:35:22

你:随便聊聊
[AI 思考中...]
[决策]: 使用工具 'chat',params: {'response': '当然可以!你想聊什么?'}
Agent:当然可以!你想聊什么?

关键变化

decision = think_with_ai(user_input)
# decision = {"tool": "check_weather", "params": {"city": "上海"}}

AI 理解了"明天去上海出差,需要带伞吗"这句话的意图是查上海天气,而不是简单地匹配关键词。

这就是 AI Agent 和传统程序的核心区别:AI 做决策,程序做执行。


今天的总结

版本 决策方式 优点 缺点
v1 if/else 硬编码 简单直接 每加功能要改代码
v2 关键词注册表 易扩展 意图识别粗糙
v3 AI 决策 理解自然语言 需要 API 调用

你今天学到的

  1. Agent = 观察 → 思考 → 行动 的循环
  2. 注册表模式:用字典管理工具,方便扩展
  3. AI 做决策:让 AI 理解用户意图,选择合适的工具

今天的代码哪里可以改着玩

  • TOOLS 里加一个新工具(比如"翻译")
  • system_prompt 的措辞,看看 AI 的决策会不会变化
  • 故意输入一些模糊的话,测试 AI 的理解能力

明天预告

今天我们的工具都是假的——check_weather 返回的是固定字符串。明天,我们给 Agent 装上真正的工具:能查真实天气、能读写文件、能执行代码。

Day 2:给 Agent 装上真实工具

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐