Hello-Agent学习笔记-Day0
Day 1|从 Win10 到第一个智能体:环境配置全记录
社畜加班、笔记是Agent总结的。跑通效果:

学习打卡 · 《Hello-Agents 从零开始构建智能体》第一章
主线:Win10 → WSL2 → conda → pip → .env → 5 分钟跑通第一个智能体
今天的目标只有一个:把环境打通,然后亲手跑起来一个能自己决定"下一步调什么工具"的智能体。
不是聊天机器人 —— 是一个会自己规划、调工具、看结果、再决策的循环体。
Win10 → WSL2(Ubuntu 22.04) → conda create → pip install → .env 配 Key → QuickStart.py 跑通
全程约 40 分钟,其中真正写代码的部分不到 5 分钟。
一、Win10 → WSL2:为什么不用原生 Windows
第一章的代码本身在 Windows 上也能跑,但后面章节要碰 Docker、向量库、Neo4j、LlamaIndex,这些在 Linux 下少踩很多坑。所以第一天直接把环境落在 WSL2 里,一劳永逸。
二、conda 建环境
conda create -n agent python=3.12 -y
conda activate agent
单独建环境是为了和已有的 base / rag 隔开,避免依赖打架。
python --version # Python 3.12.14
三、装依赖
第一章只需要四个包:
pip install requests tavily-python openai python-dotenv
| 包 | 作用 |
|---|---|
requests |
调 wttr.in 查天气 |
tavily-python |
AI 搜索,用来推荐景点 |
openai |
调 LLM(任何兼容 OpenAI 接口的服务都能用) |
python-dotenv |
从 .env 读密钥,不把 Key 写进代码 |
装了 python-dotenv 之后,所有密钥都能从代码里挪出去,这点很关键 —— 见下一节。
四、配 API Key:用 .env,别写死在代码里
这一步最容易出问题,因为密钥泄露往往就发生在这里。
在项目根目录建一个 .env:
LLM_MODEL_ID="deepseek-flash"
LLM_API_KEY="sk-xxxxxxxx"
LLM_BASE_URL="https://api.deepseek.com/v1"
LLM_TIMEOUT=60
TAVILY_API_KEY="tvly-xxxxxxxx"
然后代码里:
from dotenv import load_dotenv
import os
load_dotenv("/mnt/wsl/data/hello-agents/.env")
API_KEY = os.getenv("LLM_API_KEY")
BASE_URL = os.getenv("LLM_BASE_URL")
MODEL_ID = os.getenv("LLM_MODEL_ID")
这里有个设计上的好处:因为走的是 OpenAI 兼容接口,只要改 LLM_BASE_URL 和 LLM_MODEL_ID,就能在 DeepSeek / Qwen / Moonshot 之间随便换,代码一行不用动。
踩坑 2:
.env必须加进.gitignore。我第一版图省事把 Key 直接写在了脚本里,后来翻 git 记录才清掉 —— 一旦提交,Key 就等于公开了,只能去后台吊销重发。
教训:密钥进代码 = 迟早要吊销。
五、5 分钟实现第一个智能体
核心思路:Thought → Action → Observation
第一章最重要的概念就这一个循环:
Thought: 我要先查天气
Action: get_weather(city="北京")
↓ 执行工具
Observation: 北京当前天气:晴,气温 25 摄氏度,微风
↓ 反馈给 LLM
Thought: 天气不错,该推荐户外景点了
Action: get_attraction(city="北京", weather="晴")
↓
Observation: ...
Action: finish(answer="...")
LLM 负责想,代码负责做,结果再喂回去让 LLM 继续想。 这就是智能体和普通聊天机器人的分水岭 —— 它会根据真实世界的返回结果改变下一步行动。
三个关键文件
1. 系统提示词(智能体的"说明书")
AGENT_SYSTEM_PROMPT = """
你是一个智能旅行助手。你的任务是分析用户的请求,并使用可用工具一步步地解决问题。
# 可用工具:
- `get_weather(city: str)`: 查询指定城市的实时天气。
- `get_attraction(city: str, weather: str)`: 根据城市和天气搜索推荐的旅游景点。
# 行动格式:
Thought: [你的思考过程和下一步计划]
Action: [你要调用的工具,格式为 function_name(arg_name="arg_value")]
# 任务完成:
收集到足够信息后,用 finish(answer="...") 输出最终答案。
"""
重点是约束输出格式。LLM 不按格式回,后面的正则就解析不出来。
2. 工具就是普通 Python 函数
def get_weather(city: str) -> str:
url = f"https://wttr.in/{city}?format=j1"
data = requests.get(url).json()
c = data['current_condition'][0]
return f"{city}当前天气:{c['weatherDesc'][0]['value']},气温{c['temp_C']}摄氏度"
available_tools = {
"get_weather": get_weather,
"get_attraction": get_attraction,
}
用个字典把函数名映射到函数对象,主循环就能按名字动态调用 —— 这是后面所有 Agent 框架工具注册表的雏形。
3. 主循环
prompt_history = [f"用户请求: {user_prompt}"]
for i in range(5): # 最多 5 轮,防死循环
llm_output = llm.generate("\n".join(prompt_history), AGENT_SYSTEM_PROMPT)
prompt_history.append(llm_output)
action_str = re.search(r"Action: (.*)", llm_output, re.DOTALL).group(1).strip()
if action_str.startswith("finish"):
break # 任务完成
tool_name = re.search(r"(\w+)\(", action_str).group(1)
kwargs = dict(re.findall(r'(\w+)="([^"]*)"', action_str))
observation = available_tools[tool_name](**kwargs)
prompt_history.append(f"Observation: {observation}")
跑起来:
cd /mnt/wsl/data/hello-agents/self
python QuickStart.py
输入"帮我查一下今天北京的天气,然后根据天气推荐一个景点",就能看到它自己分两步把任务做完。
踩坑 3:模型把思考过程也吐出来了
我用的模型默认会输出思考链,导致 Action: 解析错位。解法是调用时显式关掉:
extra_body = {
"enable_thinking": False
}
response = self.client.chat.completions.create(
model=self.model,
messages=messages,
extra_body=extra_body
)
用了支持思考的模型(Qwen / DeepSeek 等)时,这一步基本是必踩的。
踩坑 4:结束格式对不上
书里第一版用的是 Action: Finish[最终答案],但新版 hello-agents 框架统一成了 finish(answer="...")。
两处都要改,而且必须一致:
- system prompt 里的说明
- 主循环里的
action_str.startswith("finish")和取值正则
改了一处忘了另一处,表现就是模型答完了但循环不退出,白白跑满 5 轮。
六、今日产出
- ✅ WSL2 + conda
agent环境(Python 3.12.14) - ✅ 项目统一
.env,密钥零硬编码 - ✅ 手写 ReAct 循环跑通,智能体能自主调用两个真实工具
- ✅ 摸清了
Thought / Action / Observation这个贯穿全书的循环
最大的感受:所谓"智能体"没有想象中玄乎。核心就是一个 while 循环 + 一段格式约束 + 一个函数字典。真正的复杂度在怎么让 LLM 稳定地按格式输出。
明日计划
读第二章(智能体发展史),然后开始第四章 —— 把今天这个手写循环重构成可以复用的框架。
本文是《Hello-Agents》学习打卡第 1 天。项目地址:datawhalechina/Hello-Agents

浙公网安备 33010602011771号