s02 - 加入循环
上一章的代码只能说一句话。说完了,程序就结束了。 真正的 Agent 得一直听着——你说一句,它回一句,你再说,它再回。 这一章做的事情很简单:加一个循环。
这一章要解决什么问题
上一章的代码是一次性的。你改 messages 里的内容,运行,拿到回复,结束。
但 Agent 不是这样工作的。Agent 得持续运行——接收输入、处理、输出、再接收。就像你和 ChatGPT 的对话框,你不关掉它,它就一直在。
这一章的目标:让模型在终端里跟你持续对话。
代码
新建 agent.py(或直接改上一章的):
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url="https://api.deepseek.com",
)
# 对话历史——模型只看得到你喂给它的消息
messages = []
print("对话开始,输入 exit 退出。\n")
while True:
# 拿到用户输入
user_input = input("你: ")
# 退出条件
if user_input.strip().lower() in ("exit", "quit"):
print("再见。")
break
# 把用户消息加入历史
messages.append({"role": "user", "content": user_input})
# 发给模型(带着完整历史)
response = client.chat.completions.create(
model="deepseek-chat",
messages=messages,
)
# 取出模型回复
assistant_reply = response.choices[0].message.content
# 把模型回复也加入历史
messages.append({"role": "assistant", "content": assistant_reply})
# 打印
print(f"AI: {assistant_reply}\n")运行:
python agent.py你会看到:
对话开始,输入 exit 退出。
你: 你好
AI: 你好!有什么可以帮你的吗?
你: 什么是 Agent
AI: Agent 是一种能够自主感知环境、做出决策并采取行动来完成目标的系统...
你: 能举个例子吗
AI: 当然!比如一个智能客服 Agent,它能接收用户的问题(感知),判断该查什么资料(决策)...
你: exit
再见。发生了什么
跟上一章比,变化就一个:加了循环。
while True:让它一直跑
while True:
user_input = input("你: ")while True 是 Python 里最简单的死循环。程序会一直执行循环体里的代码,直到遇到 break。
input() 让程序暂停,等你在终端打字。你按下回车,拿到你输入的字符串。
退出条件
if user_input.strip().lower() in ("exit", "quit"):
print("再见。")
break没有 break,程序会永远跑下去。所以得给一个出口。strip() 去掉首尾空格,lower() 统一小写——这样不管用户打 Exit、EXIT 还是 exit,都能退出。
messages 在长什么
这是最关键的部分。messages 列表在循环里不断变长:
# 第一轮对话后
messages = [
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好!有什么可以帮你的吗?"},
]
# 第二轮对话后
messages = [
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好!有什么可以帮你的吗?"},
{"role": "user", "content": "什么是 Agent"},
{"role": "assistant", "content": "Agent 是一种能够自主感知..."},
]每一轮,你把用户的话追加进去,再把模型的回复追加进去。下一轮发请求的时候,messages 里带着之前所有的对话。
模型能看到你发的全部历史。 这就是为什么它能记住你之前说了什么。不是模型有记忆——是你每次都把完整的对话记录重新发给它。
上一章 vs 这一章
| s01 | s02 |
|---|---|
messages 是硬编码的列表 | messages 是动态增长的列表 |
| 运行一次就结束 | 循环运行,直到用户退出 |
| 模型只看到你写的那几条消息 | 模型看到完整的对话历史 |
试着改改
1. 加一个 system message
在循环之前加一行:
messages = [
{"role": "system", "content": "你是一个用中文回答的助手,每次回复不超过三句话。"},
]system 角色的消息不会显示给用户,但模型会看到。它用来设定模型的行为方式。试试看模型的回复风格有没有变化。
2. 打印 messages 的长度
在 print(f"AI: ...") 后面加:
print(f" (对话记录已有 {len(messages)} 条消息)\n")多聊几轮,看看数字怎么变。
3. 清空历史
加一个命令,比如用户输入 clear 时清空 messages:
if user_input.strip().lower() == "clear":
messages = []
print("对话已清空。\n")
continuecontinue 的意思是跳过本轮循环剩下的代码,直接回到循环开头。
教学边界
这一章只做一件事:让模型在循环里持续对话。
不涉及:
- 工具(模型只能聊天,不能调用搜索、计算等)
- 流式输出(回复还是一次性返回)
- 多 Agent 协作
- 任何持久化(关掉程序,对话历史就没了)
这些都在后面的章节里。现在你只需要理解一件事:
messages列表就是模型的"记忆"。你每轮把它喂给模型,模型就能基于整个对话历史来回复。记忆不是模型自带的——是你构建的。
一句话记住
Agent 的第二步,是加一个循环,让 messages 列表不断生长——模型的记忆,就是你传给它的完整对话历史。