跳到主要内容

【AI百炼实训】008:手把手教你写个 AI 智能体!


前言

想亲手搭建属于自己的Agent吗?让AI跳出对话框,成为你的得力助手。

本期为大家带来【AI百炼实训】的第八弹!让我们一起用AIBOOK算力本打造全新智能体。


📄 项目介绍

** 什么是 AI 智能体(AI Agent ) ** AI 智能体是一种能够通过「感知环境→思考决策→执行动作」循环实现目标的智能系统。想要深入理解其核心原理?最好的方式就是亲手搭建一个!

本项目将引导你从零开始构建一个极简但完整的 AI 智能体。我们不提供现成代码,而是通过分步拆解,让你理解每个模块的设计逻辑,最终独立完成一个包含「思考 - 行动 - 记忆」核心要素的智能助手。即使功能简单,却能让你透彻掌握 AI 智能体的底层工作机制。


🧠 项目难度

中级。本项目推荐有编程基础知识的用户体验,无需复杂算法基础,重点聚焦原理理解与流程实现。


🎓 适用人群

  • 具有编程基础知识和实作能力者

  • 想了解 AI 智能体原理的技术爱好者

  • 学生课程项目开发者

  • 希望构建 AI 应用底层框架的入门工程师


✨ 项目亮点

● 原理导向学习: 从基础概念到代码实现逐步拆解,拒绝「复制粘贴」,确保知其然且知其所以然。

● 渐进式成就感: 每完成一个方法即可看到智能体能力提升,学习过程充满反馈。

● 极简完整架构: 包含「思考 (Think)- 行动 (Act)」核心循环(即AI智能体的「感知 - 决策 - 执行」核心循环),代码简洁但原理清晰易读。

● 可扩展框架: 预留功能扩展接口,为后续添加复杂能力(如多轮对话、工具调用)奠定基础。

● 核心学习成果保障: 通过本项目,你将扎实掌握:

  • AI 智能体的「感知 - 决策 - 执行」核心循环

  • 基于规则的意图识别方法

  • 对话记忆系统的设计与实现

  • 面向对象编程在智能系统中的应用模式


📚 小知识:

**AI 智能体的三要素:**无论多简单的AI智能体,都必须具备如下三大核心能力

  1. 思考(Think)- 分析用户输入,识别意图并生成行动计划;

  2. 行动(Act)- 根据计划执行具体动作(如回复、调用工具);

  3. 记忆(Memory)- 存储历史对话,为多轮交互提供上下文支持。


🛠️ 操作步骤与代码解析

第一步:环境准备

1.1 打开终端并创建项目目录

图片1

mkdir my_first_agent && cd my_first_agent  

1.2 激活musa环境并安装依赖包

conda activate musa&&pip install colorama pyfiglet  # 用于控制台美化输出  

第二步:构建智能体基础框架

2.1 代码实现 (simple_agent.py)

此代码块定义了SimpleAgent类及其构造函数。当创建智能体实例时,会传入name参数作为智能体的名称,并将其存储在实例变量self.name中。同时,初始化一个空列表self.memory,用于存储后续的对话历史。通过Figlet类创建艺术字体生成器,将智能体名称转换为斜体艺术字并以青色打印输出,随后打印绿色的欢迎语,完成智能体的初始化展示。

import time  
from typing import List, Dict
from colorama import Fore, Style, init
from pyfiglet import Figlet

# 初始化控制台美化工具
init()

class SimpleAgent:
def __init__(self, name):
self.name = name
self.memory = [] # 记忆存储列表
# 欢迎语
f = Figlet(font='slant')
print(Fore.CYAN + f.renderText(self.name) + Style.RESET_ALL)
print(f"我是 {Fore.GREEN}{self.name}{Style.RESET_ALL},一个简单的AI助手!")

if __name__ == "__main__":
agent = SimpleAgent("SimpleBot")

2.2 运行效果

控制台将打印艺术字标题和欢迎语,标志智能体初始化完成。

第三步:实现思考能力 ——think 方法

3.1 代码增强(添加到 SimpleAgent 类中)

think方法负责分析用户输入并识别其意图。首先将用户输入转换为小写,以避免大小写敏感问题。接着通过条件判断检查输入中是否包含特定关键词:若包含 "你好" 或 "hello",则识别为问候意图,返回 "greeting";若包含 "天气" 或 "weather",则识别为天气查询意图,返回 "weather";若均不匹配,则返回 "default" 作为默认意图。这种设计将意图识别与后续的回复生成解耦,便于系统的扩展和维护。

def think(self, user_input: str) -> str:  
"""分析用户输入,生成行动计划"""
user_input = user_input.lower() # 统一小写处理
if "你好" in user_input or "hello" in user_input:
return "greeting" # 问候意图
elif "天气" in user_input or "weather" in user_input:
return "weather" # 天气查询意图
else:
return "default" # 默认意图

🤔 设计思考:

  • 通过关键词匹配实现意图分类,返回字符串作为「行动指令」

  • 解耦「意图识别」与「回复生成」,便于后续扩展复杂逻辑

  • 思考题:为何不直接返回回复内容?(提示:分离决策与执行)

第四步:实现行动能力 ——act 方法

4.1 代码增强(添加到 SimpleAgent 类中)

act方法根据think模块返回的意图标签生成具体回复。通过字典response_map建立意图标签与对应回复内容的映射关系:对于 "greeting" 意图,返回包含智能体名称的问候语,名称以黄色高亮显示;对于 "weather" 意图,返回表示暂不支持天气查询的提示;对于 "default" 意图,返回表示正在学习的默认回复。使用字典的get方法获取对应回复,若意图标签不存在则返回错误提示,确保系统的健壮性。

def act(self, plan: str) -> str:  
"""根据计划执行具体动作"""
response_map = {
"greeting": f"你好!我是{Fore.YELLOW}{self.name}{Style.RESET_ALL},很高兴为你服务!",
"weather": "抱歉,我暂时还不具备查询天气的能力 😔",
"default": "对不起,这个问题我还在学习中~可以换个话题吗?"
}
return response_map.get(plan, "发生未知错误,请重新输入") # 安全兜底

🤔 设计思考:

  • 使用字典映射计划与回复,提高可维护性

  • 分离「意图」与「回复内容」,方便后续修改话术或添加多语言支持

第五步:构建主循环 ——run 方法

5.1 代码增强(添加到 SimpleAgent 类中):

run方法实现了智能体的核心交互循环。通过无限循环持续获取用户输入,当检测到用户输入 "exit" 时,打印红色的退出提示并终止循环。在每次循环中,先调用think方法分析用户意图,再将意图标签传递给act方法生成回复,随后以绿色打印智能体的回复内容。最后,将当前对话的时间戳、用户输入和智能体回复以字典形式存入memory列表,实现对话历史的记录功能。

def run(self):  
"""智能体主循环:感知→思考→行动→记忆"""
while True:
user_input = input(f"\n{Fore.BLUE}[{self.name}] 请输入你的问题(输入'exit'退出):{Style.RESET_ALL}")

if user_input.lower() == "exit":
print(Fore.RED + "再见!期待下次相遇~" + Style.RESET_ALL)
break

# 核心循环
plan = self.think(user_input)
response = self.act(plan)
print(f"\n{Fore.GREEN}[{self.name}回复]{Style.RESET_ALL} {response}")

# 存储对话到记忆
self.memory.append({
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"user_input": user_input,
"response": response
})

5.2 循环解析:

(1)感知:获取用户输入

(2)思考:调用 think 方法生成行动计划

(3)行动:调用 act 方法生成回复

(4)记忆:以字典形式存储对话记录(含时间戳)

第六步:启动智能体

6.1 主程序入口(修改最后一行):

这部分代码作为程序的执行入口,当脚本被直接运行时,会创建一个名为 "SimpleBot" 的SimpleAgent实例,并调用其run方法启动智能体的交互循环。通过if name == "main":条件判断,确保代码作为脚本直接执行时才会启动智能体,若被其他模块导入则不会触发运行,提高了代码的可复用性。

if __name__ == "__main__":  
agent = SimpleAgent("SimpleBot")
agent.run() # 启动主循环

6.2 测试与验

运行命令:

python simple_agent.py  

测试用例:

用户输入预期回复
"你好""你好!我是 SimpleBot,很高兴为你服务!"
"今天天气如何?""抱歉,我暂时还不具备查询天气的能力 😔"
"你能做什么?""对不起,这个问题我还在学习中~..."
"exit""再见!期待下次相遇~"

🖼️ 最终效果展示

图片1

(图示:控制台显示智能体与用户的对话交互)

📜 完整代码清单

import time  
from typing import List, Dict
from colorama import Fore, Style, init
from pyfiglet import Figlet

init()

class SimpleAgent:
def __init__(self, name):
self.name = name
self.memory = []
f = Figlet(font='slant')
print(Fore.CYAN + f.renderText(name) + Style.RESET_ALL)
print(f"我是 {Fore.GREEN}{name}{Style.RESET_ALL},一个简单的AI助手!")

def think(self, user_input: str) -> str:
user_input = user_input.lower()
if "你好" in user_input or "hello" in user_input:
return "greeting"
elif "天气" in user_input or "weather" in user_input:
return "weather"
else:
return "default"

def act(self, plan: str) -> str:
response_map = {
"greeting": f"你好!我是{Fore.YELLOW}{self.name}{Style.RESET_ALL},很高兴为你服务!",
"weather": "抱歉,我暂时还不具备查询天气的能力 😔",
"default": "对不起,这个问题我还在学习中~可以换个话题吗?"
}
return response_map.get(plan, "发生未知错误,请重新输入")

def run(self):
while True:
user_input = input(f"\n{Fore.BLUE}[{self.name}] 请输入你的问题(输入'exit'退出):{Style.RESET_ALL}")

if user_input.lower() == "exit":
print(Fore.RED + "再见!期待下次相遇~" + Style.RESET_ALL)
break

plan = self.think(user_input)
response = self.act(plan)
print(f"\n{Fore.GREEN}[{self.name}回复]{Style.RESET_ALL} {response}")

self.memory.append({
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"user_input": user_input,
"response": response
})

if __name__ == "__main__":
agent = SimpleAgent("SimpleBot")
agent.run()


🚀 扩展挑战(进阶方向)

完成基础实现后,你可以尝试以下升级:

  1. 意图扩展:在 think 方法中添加更多意图(如时间查询、数学计算)

  2. 记忆增强:利用 memory 实现多轮对话上下文(如:"刚才你说天气不具备能力,那其他功能呢?")

  3. 工具集成:在 act 方法中调用外部 API(如天气接口、计算器接口)

  4. 个性化定制:为智能体添加性格设定(如幽默风、专业风)

通过亲手搭建这个极简智能体,你将打通从「理论认知」到「代码实现」的关键链路,为深入学习 LangChain、AutoGPT 等复杂智能体框架奠定坚实基础!立即开始你的 AI 开发之旅吧 🚀