7天从零手搓 AI Agent | Day 1:你的第一个“会决策“的程序
7天从零手搓 AI Agent | Day 1:你的第一个"会决策"的程序
Agent 的核心不是"AI",而是"决策"。今天我们从最简单的决策程序开始。
今天的目标
写一个程序,它能:
- 接收用户的输入
- 判断用户想做什么
- 选择对应的动作去执行
- 把结果返回给用户
这听起来很简单?对,但这就是 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 调用 |
你今天学到的
- Agent = 观察 → 思考 → 行动 的循环
- 注册表模式:用字典管理工具,方便扩展
- AI 做决策:让 AI 理解用户意图,选择合适的工具
今天的代码哪里可以改着玩
- 在
TOOLS里加一个新工具(比如"翻译") - 改
system_prompt的措辞,看看 AI 的决策会不会变化 - 故意输入一些模糊的话,测试 AI 的理解能力
明天预告
今天我们的工具都是假的——check_weather 返回的是固定字符串。明天,我们给 Agent 装上真正的工具:能查真实天气、能读写文件、能执行代码。
更多推荐


所有评论(0)