智能体(Intelligent Agents)入门自学教程 6 小项目:构建“猜数字”智能体
·
6.1 项目目标
- 实现功能:智能体通过询问“我猜 X,请回复‘大’/‘小’/‘对’”的方式,最终猜出用户心中所想的数字。
- 用户体验:智能体自动调整猜测范围、记录猜测次数,并在猜对时给出祝贺。
- 核心思路:将用户的“大”“小”反馈转化为上下界调整,直到收敛到唯一解。
6.2 设计思路:二分法
- 初始范围
low = 最小值,high = 最大值,如1到100
- 每轮猜测
guess = (low + high) // 2- 向用户输出
“我猜 {guess},请回复‘大’/‘小’/‘对’:”
- 根据反馈更新范围
- 若用户回复“大” → 说明实际数字 >
guess→low = guess + 1 - 若用户回复“小” → 实际数字 <
guess→high = guess - 1 - 若用户回复“对” → 猜测成功,结束循环
- 若用户回复“大” → 说明实际数字 >
- 循环终止条件
- 当
low > high时,说明反馈中存在矛盾,需要额外处理(见 6.4)。
- 当
示例演示
假设用户心中数字是 73,范围 [1,100]:
| 轮次 | low | high | guess | 用户反馈 | 下一步 |
|---|---|---|---|---|---|
| 1 | 1 | 100 | 50 | 大 | low = 51 |
| 2 | 51 | 100 | 75 | 小 | high = 74 |
| 3 | 51 | 74 | 62 | 大 | low = 63 |
| 4 | 63 | 74 | 68 | 大 | low = 69 |
| 5 | 69 | 74 | 71 | 大 | low = 72 |
| 6 | 72 | 74 | 73 | 对 | 成功,6 次猜中! |
6.3 代码示例
6.3.1 交互版(控制台)
def guess_number_agent(low=1, high=100):
"""控制台交互版猜数字智能体"""
attempts = 0
while low <= high:
guess = (low + high) // 2
attempts += 1
feedback = input(f"我猜 {guess},请回复“大/小/对”:").strip()
if feedback == "大":
low = guess + 1
elif feedback == "小":
high = guess - 1
elif feedback == "对":
print(f"太棒了!我用了 {attempts} 次就猜对了。")
return
else:
print("输入无效,请只回复“大”、“小”或“对”。")
print("看来你的反馈有冲突,无法继续猜测。")
if __name__ == "__main__":
print("请在脑中想一个 1–100 之间的数字,我来猜!")
guess_number_agent(1, 100)
6.3.2 自动模拟版(无需人工反馈)
import random
def simulate_agent(secret, low=1, high=100):
"""自动模拟:智能体猜随机 secret,返回猜测次数"""
attempts = 0
while low <= high:
guess = (low + high) // 2
attempts += 1
if guess < secret:
low = guess + 1
elif guess > secret:
high = guess - 1
else:
return attempts
return None
# 多次模拟,统计平均猜测次数
trials = 1000
results = [simulate_agent(random.randint(1, 100)) for _ in range(trials)]
avg = sum(results) / len(results)
print(f"在 1–100 范围内,平均 {avg:.2f} 次猜对。")
6.4 练习:让智能体能自我纠正
-
反馈矛盾检测
- 思路:记录每次
low/high变动;如果更新后low > high,提示用户“你的大/小 反馈似乎有误,请检查是否有输入错误”,并允许重置最后一次反馈。 - 上手实践:在交互版中,增加一个历史记录栈,出问题时弹出并重试。
- 思路:记录每次
-
日志与回顾功能
- 思路:每次猜测后,将
(guess, feedback, new_low, new_high)存入列表,猜对后打印完整日志,帮助分析猜测过程。 - 上手实践:修改
guess_number_agent,在结束时输出:第1次:猜50 → “大” → 范围变为[51,100] 第2次:猜75 → “小” → 范围变为[51,74] ……
- 思路:每次猜测后,将
-
动态范围与自定义
- 思路:让用户在开始时自定义最小/最大值,例如
输入起始范围(格式 low high): - 上手实践:读取用户输入,解析为整数,并传给函数。
- 思路:让用户在开始时自定义最小/最大值,例如
-
批量性能测试
- 思路:模拟 1–N 范围中所有可能的 secret,记录最大最小与平均猜测次数,分析复杂度。
- 上手实践:
def profile_agent(max_value): stats = [simulate_agent(s, 1, max_value) for s in range(1, max_value+1)] print("最大尝试次数:", max(stats)) print("最小尝试次数:", min(stats)) print("平均尝试次数:", sum(stats)/len(stats)) profile_agent(100)
-
进阶扩展
- 增加“提示次数”限制,超出后自动放弃;
- 改用随机猜测或三分法,比对效率;
- 尝试用简单的 GUI(如 Tkinter)实现按钮交互版本。
通过以上示例、变体代码和练习,你可以从跟着输入–输出流程,到自动化模拟、再到增加鲁棒性与性能分析,全面掌握这个“小项目”的设计与实现。祝你练习愉快!
更多推荐
所有评论(0)