AI Agent Harness Engineering 如何重塑未来知识工作
AI Agent Harness Engineering:从理论到实践,重塑未来知识工作的新范式
副标题: 基于LangChain、AutoGPT与CrewAI的深度解析、实战指南与未来展望
摘要/引言
你是否曾在堆积如山的文档中挣扎,花费数小时只为整理一份市场报告?是否曾因重复性的代码审查、数据清洗工作而感到创造力被消耗?在信息爆炸的时代,知识工作者正面临着前所未有的挑战:一方面,我们需要处理越来越复杂的任务;另一方面,我们的时间和精力却极其有限。
好消息是,一场由AI驱动的变革正在悄然发生——这就是AI Agent Harness Engineering(AI智能体工程化)。它不仅仅是让AI帮我们写几行代码或回答几个问题,而是要构建具有自主感知、规划、执行和学习能力的"智能代理",让它们像专业团队一样协作,自动完成从信息检索、分析决策到成果交付的全流程工作。
在本文中,我将带你从零基础开始,深入理解AI Agent的核心概念,手把手教你使用LangChain、AutoGPT和CrewAI等主流框架构建实用的AI Agent系统,并探讨这一技术将如何重塑未来的知识工作形态。读完本文,你将:
- 掌握AI Agent的核心架构与设计原则
- 能够独立构建单功能AI Agent与多Agent协作系统
- 理解AI Agent在实际工作中的应用场景与最佳实践
- 洞察这一领域的未来发展趋势
让我们一起开启这场智能革命之旅!
目标读者与前置知识
目标读者:
- 有一定Python基础,对AI/LLM感兴趣的软件工程师
- 希望通过AI提升工作效率的产品经理、数据分析师、内容创作者等知识工作者
- 关注AI前沿技术,想要了解AI Agent如何落地应用的技术管理者
前置知识:
- 基本的Python编程能力(熟悉函数、类、模块等概念)
- 对大语言模型(LLM)如GPT-4、Claude等有基本了解
- 了解RESTful API的基本概念与调用方法
- (可选)熟悉Docker环境配置
文章目录
-
第一部分:引言与基础
1.1 引人注目的标题
1.2 摘要/引言
1.3 目标读者与前置知识
1.4 文章目录 -
第二部分:核心内容
2.1 问题背景与动机
2.2 核心概念与理论基础
2.3 环境准备
2.4 分步实现:从单Agent到多Agent协作
2.5 关键代码解析与深度剖析 -
第三部分:验证与扩展
3.1 结果展示与验证
3.2 性能优化与最佳实践
3.3 常见问题与解决方案
3.4 未来展望与扩展方向 -
第四部分:总结与附录
4.1 总结
4.2 参考资料
4.3 附录
2. 问题背景与动机
2.1 知识工作的现状与挑战
在当今数字化时代,知识工作已经成为经济发展的核心驱动力。从软件开发到市场分析,从内容创作到医疗诊断,各行各业都依赖于知识工作者的创造力和决策能力。然而,随着信息爆炸和任务复杂度的提升,知识工作者正面临着一系列严峻的挑战:
-
信息过载与处理效率低下:我们每天需要处理大量的邮件、文档、报告和数据,仅筛选和整理信息就消耗了大量时间。据统计,知识工作者平均每周要花费超过20小时在信息搜索和整理上,而真正用于创造性思考的时间却不足10小时。
-
任务复杂度高,跨领域协作困难:现代知识工作往往需要跨领域的知识和技能,例如一个产品发布会的筹备需要市场调研、内容创作、设计、技术开发等多个团队的协作。传统的协作方式效率低下,沟通成本高昂。
-
重复性工作消耗大量精力:代码审查、数据清洗、报告生成等重复性工作占据了知识工作者大量的时间,使得他们无法专注于更有价值的创造性工作。
-
决策质量受限于个人认知:在复杂的决策场景中,个人的知识和经验往往有限,难以全面考虑所有因素,导致决策质量不高。
2.2 现有解决方案的局限性
面对这些挑战,人们已经尝试了各种解决方案:
-
传统自动化工具:如RPA(机器人流程自动化)可以处理一些结构化、重复性的任务,但对于非结构化、需要创造性和决策能力的任务却无能为力。
-
通用大语言模型(LLM):GPT-4、Claude等LLM的出现给我们带来了惊喜,它们可以生成文本、回答问题、写代码等。然而,纯LLM也有明显的局限性:
- 缺乏长期规划和执行能力:LLM通常只能处理单轮或少量轮次的对话,难以完成需要多步骤规划和执行的复杂任务。
- 无法访问实时信息和外部工具:LLM的知识是静态的,无法访问互联网、数据库或其他外部工具。
- 缺乏记忆和学习能力:LLM在对话过程中的记忆有限,难以从历史经验中学习和优化。
- 难以进行多角色协作:单个LLM无法模拟多个专业角色之间的协作。
-
特定领域的AI工具:如代码补全工具GitHub Copilot、设计工具Figma AI等,虽然在特定领域表现不错,但功能单一,无法完成端到端的复杂任务。
2.3 AI Agent Harness Engineering的必要性
正是在这样的背景下,AI Agent Harness Engineering应运而生。它不是要取代知识工作者,而是要作为"智能伙伴",帮助我们:
- 自动化复杂任务:从信息检索、分析到决策、执行,全流程自动化。
- 提升工作效率:将知识工作者从重复性工作中解放出来,专注于创造性思考。
- 增强决策质量:通过多Agent协作,整合不同领域的知识,做出更全面的决策。
- 降低协作成本:AI Agent之间可以高效协作,减少沟通成本。
如果说LLM是"大脑",那么AI Agent就是完整的"智能体"——它不仅有大脑,还有感知器官(获取信息)、四肢(执行工具)和记忆系统(存储经验)。而AI Agent Harness Engineering就是研究如何设计、构建、部署和管理这些智能体的工程方法。
3. 核心概念与理论基础
3.1 核心概念定义
3.1.1 AI Agent(人工智能智能体)
核心概念: AI Agent是一种基于大语言模型(LLM)构建的智能系统,它具备自主感知环境、制定规划、执行任务、从经验中学习的能力,能够自动完成给定的目标。
概念结构与核心要素组成: 一个完整的AI Agent通常包含以下核心组件:
- 大脑(LLM Core):Agent的核心决策单元,负责理解任务、生成规划、做出决策。
- 感知模块(Perception Module):负责获取环境信息,包括文本、图像、音频等多模态数据。
- 行动模块(Action Module):负责执行具体的行动,如调用工具、生成文本、与其他Agent交互等。
- 记忆模块(Memory Module):分为短期记忆和长期记忆,存储Agent的历史经验、任务状态和知识。
- 规划模块(Planning Module):负责将复杂目标分解为可执行的子任务,并制定执行计划。
- 评估模块(Evaluation Module):负责评估任务执行结果,优化规划和决策。
我们可以用以下Mermaid架构图来表示AI Agent的核心组件:
3.1.2 AI Agent Harness Engineering(AI智能体工程化)
核心概念: AI Agent Harness Engineering是一门研究如何高效设计、构建、部署、监控和优化AI Agent系统的工程学科。它涵盖了从需求分析、架构设计、开发测试到部署运维的全流程。
核心要素:
- Agent设计原则:如何定义Agent的角色、能力和边界。
- 工具集成:如何让Agent有效地调用外部工具(API、数据库、文件系统等)。
- 多Agent协作:如何设计多个Agent之间的通信机制和协作模式。
- 记忆管理:如何设计高效的记忆系统,让Agent能够从经验中学习。
- 安全与对齐:如何确保Agent的行为符合人类的价值观和安全要求。
- 监控与优化:如何监控Agent的性能,持续优化其行为。
3.1.3 关键术语对比
为了帮助大家更好地理解,我们将AI Agent与其他相关概念进行对比:
| 概念 | 核心特点 | 优势 | 局限性 | 典型应用 |
|---|---|---|---|---|
| 传统RPA | 基于规则,处理结构化任务 | 执行稳定,成本低 | 无法处理非结构化任务,缺乏灵活性 | 发票处理、数据录入 |
| 纯LLM | 文本生成与理解能力强 | 通用性强,可处理多种任务 | 缺乏规划执行能力,无法访问实时信息 | 文本创作、代码补全 |
| 单AI Agent | 具备感知、规划、执行能力 | 可完成端到端任务,自主性强 | 能力受限于单个LLM,复杂任务处理有限 | 个人助手、客户服务 |
| 多Agent系统 | 多个Agent协作,模拟专业团队 | 可处理复杂跨领域任务,能力互补 | 设计复杂,协调成本高 | 软件开发团队、市场调研团队 |
3.2 AI Agent的核心理论基础
3.2.1 Agent的认知架构
AI Agent的设计受到了认知科学和人工智能理论的影响,其中最具代表性的是SOAR认知架构和ACT-R理论。不过,现代AI Agent更多地基于LLM,采用了一种简化但有效的认知循环:
- 观察(Observe):感知环境和任务状态。
- 思考(Think):利用LLM进行推理和规划。
- 行动(Act):执行规划好的行动。
- 学习(Learn):从结果中学习,优化未来的行为。
这个循环可以用以下Mermaid流程图表示:
3.2.2 提示工程(Prompt Engineering)与Agent提示
提示工程是AI Agent设计中的核心技术之一。对于AI Agent来说,提示不仅仅是一个问题,而是包含了角色定义、任务描述、工具说明、格式要求等丰富信息的"指令集"。
一个典型的Agent提示通常包含以下部分:
- 角色定义(Role Definition):明确Agent的身份和专业领域。
- 目标描述(Goal Description):清晰地描述Agent需要完成的目标。
- 工具说明(Tool Instructions):列出Agent可以使用的工具及其使用方法。
- 输出格式(Output Format):规定Agent的输出格式,便于解析和执行。
- 约束条件(Constraints):明确Agent不能做的事情,确保安全。
3.2.3 数学模型:马尔可夫决策过程(MDP)
从数学角度来看,AI Agent的决策过程可以用**马尔可夫决策过程(Markov Decision Process, MDP)**来建模。MDP是一个五元组 (S,A,P,R,γ)(S, A, P, R, \gamma)(S,A,P,R,γ),其中:
- SSS 是状态集合,表示Agent可能处于的所有状态。
- AAA 是行动集合,表示Agent可以执行的所有行动。
- P(s′∣s,a)P(s'|s, a)P(s′∣s,a) 是状态转移概率,表示在状态 sss 执行行动 aaa 后转移到状态 s′s's′ 的概率。
- R(s,a,s′)R(s, a, s')R(s,a,s′) 是奖励函数,表示在状态 sss 执行行动 aaa 转移到状态 s′s's′ 后获得的奖励。
- γ∈[0,1]\gamma \in [0, 1]γ∈[0,1] 是折扣因子,表示未来奖励的重要性。
Agent的目标是找到一个策略 π:S→A\pi: S \rightarrow Aπ:S→A,使得长期累积奖励最大化:
maxπEπ[∑t=0∞γtR(st,at,st+1)] \max_{\pi} \mathbb{E}_{\pi} \left[ \sum_{t=0}^{\infty} \gamma^t R(s_t, a_t, s_{t+1}) \right] πmaxEπ[t=0∑∞γtR(st,at,st+1)]
虽然在实际应用中,我们通常不会直接求解MDP,但这个数学模型为我们理解Agent的决策过程提供了理论基础。
3.3 主流AI Agent框架介绍
目前,有多个优秀的开源框架可以帮助我们快速构建AI Agent系统,以下是最常用的几个:
3.3.1 LangChain
简介: LangChain是一个用于构建LLM应用的开源框架,它提供了丰富的组件和工具,支持链(Chain)、代理(Agent)、记忆(Memory)等核心概念。
核心优势:
- 生态丰富,集成了大量的LLM、工具和向量数据库。
- 组件化设计,灵活度高。
- 社区活跃,文档完善。
适用场景: 构建单Agent应用、复杂的LLM链、RAG系统等。
3.3.2 AutoGPT
简介: AutoGPT是一个开源的自主AI Agent项目,它可以自主设定目标、分解任务、执行工具、记忆经验,完成端到端的任务。
核心优势:
- 自主性强,可以自动完成复杂任务。
- 支持多种工具和记忆系统。
- 可视化界面,便于调试。
适用场景: 市场调研、内容创作、代码开发等需要自主性的任务。
3.3.3 CrewAI
简介: CrewAI是一个专注于多Agent协作的框架,它可以让我们轻松构建由多个Agent组成的"团队",每个Agent有不同的角色和技能,通过协作完成复杂任务。
核心优势:
- 专为多Agent协作设计,简单易用。
- 支持角色定义、任务分配、Agent间通信。
- 集成了LangChain,可以复用其生态。
适用场景: 模拟专业团队协作,如软件开发团队、市场分析团队等。
4. 环境准备
在开始构建AI Agent之前,我们需要先准备好开发环境。
4.1 软件与依赖清单
| 软件/库 | 版本要求 | 用途 |
|---|---|---|
| Python | 3.10+ | 开发语言 |
| langchain | 0.1.0+ | AI Agent开发框架 |
| langchain-openai | 0.0.5+ | OpenAI模型集成 |
| crewai | 0.22.0+ | 多Agent协作框架 |
| python-dotenv | 1.0.0+ | 环境变量管理 |
| requests | 2.31.0+ | HTTP请求 |
| beautifulsoup4 | 4.12.0+ | 网页解析 |
| faiss-cpu | 1.7.4+ | 向量数据库(可选) |
4.2 环境配置步骤
4.2.1 创建虚拟环境(推荐)
首先,我们创建一个Python虚拟环境,避免依赖冲突:
# 使用conda创建虚拟环境(推荐)
conda create -n ai-agent-env python=3.11
conda activate ai-agent-env
# 或者使用venv
python -m venv ai-agent-env
# Windows
ai-agent-env\Scripts\activate
# Linux/Mac
source ai-agent-env/bin/activate
4.2.2 安装依赖
创建一个 requirements.txt 文件:
langchain>=0.1.0
langchain-openai>=0.0.5
crewai>=0.22.0
python-dotenv>=1.0.0
requests>=2.31.0
beautifulsoup4>=4.12.0
faiss-cpu>=1.7.4
然后安装依赖:
pip install -r requirements.txt
4.2.3 配置API密钥
我们需要配置OpenAI API密钥(或其他LLM API密钥)。创建一个 .env 文件:
OPENAI_API_KEY=your-openai-api-key-here
OPENAI_MODEL_NAME=gpt-4-turbo-preview # 或 gpt-3.5-turbo
注意:请确保将 .env 文件添加到 .gitignore 中,避免泄露API密钥。
5. 分步实现:从单Agent到多Agent协作
在这一部分,我们将通过三个实战项目,循序渐进地学习如何构建AI Agent系统:
- 项目一:构建一个基础的搜索+分析Agent(使用LangChain)
- 项目二:构建一个自主任务执行Agent(使用AutoGPT的核心思想)
- 项目三:构建一个多Agent协作的市场调研团队(使用CrewAI)
5.1 项目一:构建基础的搜索+分析Agent(LangChain)
5.1.1 项目目标
我们将构建一个Agent,它可以:
- 接收用户的问题或任务。
- 自动搜索互联网获取相关信息。
- 分析搜索结果,生成结构化的报告。
5.1.2 核心组件设计
- LLM核心:使用GPT-4作为决策和推理引擎。
- 工具:
SearchTool:使用SerpAPI或DuckDuckGo搜索互联网。ScrapeTool:爬取网页内容。
- 记忆:使用ConversationBufferMemory存储对话历史。
- Agent类型:使用ReAct Agent(Reasoning + Acting)。
5.1.3 代码实现
首先,我们导入必要的库:
import os
from dotenv import load_dotenv
from langchain.agents import AgentType, initialize_agent, Tool
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain_community.tools import DuckDuckGoSearchRun
from langchain_community.utilities import DuckDuckGoSearchAPIWrapper
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains.summarize import load_summarize_chain
import requests
from bs4 import BeautifulSoup
# 加载环境变量
load_dotenv()
接下来,我们创建网页爬取工具:
def scrape_website(url: str) -> str:
"""爬取网页内容并返回文本"""
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.content, 'html.parser')
# 移除脚本和样式元素
for script in soup(["script", "style"]):
script.extract()
# 获取文本
text = soup.get_text(separator='\n', strip=True)
# 清理文本
lines = (line.strip() for line in text.splitlines())
chunks = (phrase.strip() for line in lines for phrase in line.split(" "))
text = '\n'.join(chunk for chunk in chunks if chunk)
return text[:5000] # 限制文本长度,避免token过多
except Exception as e:
return f"Error scraping website: {str(e)}"
# 创建搜索工具
search_wrapper = DuckDuckGoSearchAPIWrapper(time="y", max_results=5)
search_tool = DuckDuckGoSearchRun(api_wrapper=search_wrapper)
# 定义工具列表
tools = [
Tool(
name="Internet Search",
func=search_tool.run,
description="用于搜索互联网上的最新信息。当你需要回答关于时事、产品、公司等问题时使用此工具。"
),
Tool(
name="Website Scraper",
func=scrape_website,
description="用于爬取指定URL的网页内容。当你需要从特定网站获取详细信息时使用此工具。输入应该是一个完整的URL。"
)
]
然后,我们初始化Agent:
# 初始化LLM
llm = ChatOpenAI(
model=os.getenv("OPENAI_MODEL_NAME", "gpt-4-turbo-preview"),
temperature=0.7
)
# 初始化记忆
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
# 初始化Agent
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
memory=memory,
verbose=True, # 开启详细日志,便于调试
agent_kwargs={
"system_message": """你是一个专业的信息收集和分析专家。你的任务是帮助用户收集信息、分析问题并提供有价值的见解。
请遵循以下原则:
1. 先使用搜索工具获取相关信息,必要时再使用网页爬取工具获取详细内容。
2. 分析信息时要客观、全面,引用信息来源。
3. 回答要结构清晰,使用markdown格式。
4. 如果信息不足,要明确告诉用户,并建议进一步的信息收集方向。"""
}
)
最后,我们测试一下Agent:
# 测试Agent
query = "请分析2024年AI Agent领域的发展趋势,并列出3家最具代表性的公司。"
result = agent.invoke({"input": query})
print("\n最终结果:")
print(result["output"])
5.1.4 运行结果分析
当我们运行这段代码时,Agent会:
- 先使用
Internet Search工具搜索"2024年AI Agent发展趋势"和"AI Agent代表性公司"。 - 根据搜索结果,选择几个相关的URL,使用
Website Scraper工具爬取详细内容。 - 分析收集到的信息,生成结构化的报告。
通过verbose=True,我们可以看到Agent的思考过程和工具调用情况,这对于调试非常有帮助。
5.2 项目二:构建自主任务执行Agent(AutoGPT思想)
5.2.1 项目目标
在这个项目中,我们将实现一个简化版的AutoGPT,它可以:
- 接收用户的总体目标。
- 自动将目标分解为子任务。
- 制定执行计划。
- 逐步执行任务,并根据结果调整计划。
- 保存任务执行记录。
5.2.2 核心组件设计
- 目标分解模块:使用LLM将大目标分解为可执行的子任务。
- 计划生成模块:为每个子任务生成执行计划。
- 任务执行模块:调用工具执行具体任务。
- 结果评估模块:评估任务执行结果,判断是否需要调整计划。
- 记忆系统:保存任务执行历史和中间结果。
5.2.3 代码实现
首先,我们定义记忆系统:
import json
from datetime import datetime
from typing import List, Dict, Any
class SimpleMemory:
def __init__(self, storage_file: str = "agent_memory.json"):
self.storage_file = storage_file
self.memory: List[Dict[str, Any]] = []
self._load_memory()
def _load_memory(self):
if os.path.exists(self.storage_file):
with open(self.storage_file, 'r', encoding='utf-8') as f:
self.memory = json.load(f)
def _save_memory(self):
with open(self.storage_file, 'w', encoding='utf-8') as f:
json.dump(self.memory, f, ensure_ascii=False, indent=2)
def add(self, entry: Dict[str, Any]):
entry["timestamp"] = datetime.now().isoformat()
self.memory.append(entry)
self._save_memory()
def get_recent(self, n: int = 10) -> List[Dict[str, Any]]:
return self.memory[-n:]
def get_all(self) -> List[Dict[str, Any]]:
return self.memory
接下来,我们定义自主Agent类:
class AutonomousAgent:
def __init__(self, llm, tools, memory):
self.llm = llm
self.tools = tools
self.memory = memory
self.goal = ""
self.tasks = []
self.current_task_index = 0
def set_goal(self, goal: str):
self.goal = goal
self.memory.add({"type": "goal", "content": goal})
print(f"🎯 目标已设定: {goal}")
def decompose_goal(self):
"""将目标分解为子任务"""
prompt = f"""你是一个任务分解专家。请将以下总体目标分解为5-8个可执行的子任务。
总体目标:{self.goal}
要求:
1. 子任务应该按照逻辑顺序排列。
2. 每个子任务应该具体、明确,可在1-2步内完成。
3. 子任务之间应该相互衔接,共同完成总体目标。
请以JSON列表格式返回,每个元素包含"task_name"(任务名称)和"description"(任务描述)字段。"""
response = self.llm.invoke(prompt)
try:
self.tasks = json.loads(response.content)
self.memory.add({"type": "task_decomposition", "tasks": self.tasks})
print(f"✅ 目标已分解为 {len(self.tasks)} 个子任务:")
for i, task in enumerate(self.tasks, 1):
print(f" {i}. {task['task_name']}: {task['description']}")
except json.JSONDecodeError:
print("❌ 任务分解失败,LLM返回的不是有效的JSON。")
print(f"LLM响应: {response.content}")
def execute_task(self, task: Dict[str, str]) -> Dict[str, Any]:
"""执行单个任务"""
task_name = task["task_name"]
description = task["description"]
print(f"\n🔄 正在执行任务: {task_name}")
print(f" 描述: {description}")
# 创建一个简单的Agent来执行具体任务
task_agent = initialize_agent(
tools=self.tools,
llm=self.llm,
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
result = task_agent.invoke({"input": description})
task_result = {
"task_name": task_name,
"description": description,
"result": result["output"],
"status": "completed"
}
self.memory.add({"type": "task_execution", "result": task_result})
print(f"✅ 任务完成: {task_name}")
return task_result
def evaluate_progress(self, completed_tasks: List[Dict[str, Any]]) -> bool:
"""评估进度,判断是否需要调整计划"""
prompt = f"""请评估以下任务执行情况,判断是否需要调整剩余任务的计划。
总体目标:{self.goal}
已完成任务:
{json.dumps(completed_tasks, ensure_ascii=False, indent=2)}
剩余任务:
{json.dumps(self.tasks[self.current_task_index+1:], ensure_ascii=False, indent=2)}
请回答:
1. 是否需要调整剩余任务的计划?(是/否)
2. 如果需要,应该如何调整?
请以JSON格式返回,包含"need_adjustment"(布尔值)和"adjustment_suggestion"(字符串)字段。"""
response = self.llm.invoke(prompt)
try:
evaluation = json.loads(response.content)
self.memory.add({"type": "evaluation", "result": evaluation})
if evaluation["need_adjustment"]:
print(f"⚠️ 需要调整计划: {evaluation['adjustment_suggestion']}")
# 这里可以实现计划调整逻辑
return True
else:
print("✅ 进度良好,无需调整计划。")
return False
except json.JSONDecodeError:
print("❌ 评估失败,LLM返回的不是有效的JSON。")
return False
def generate_final_report(self, completed_tasks: List[Dict[str, Any]]) -> str:
"""生成最终报告"""
prompt = f"""请根据以下任务执行情况,生成一份详细的最终报告。
总体目标:{self.goal}
任务执行记录:
{json.dumps(completed_tasks, ensure_ascii=False, indent=2)}
要求:
1. 报告结构清晰,包含执行摘要、主要发现、结论与建议等部分。
2. 内容全面,涵盖所有已完成任务的结果。
3. 语言专业,使用markdown格式。"""
response = self.llm.invoke(prompt)
final_report = response.content
self.memory.add({"type": "final_report", "content": final_report})
return final_report
def run(self):
"""运行Agent"""
if not self.goal:
print("❌ 请先设定目标!")
return
# 1. 分解目标
self.decompose_goal()
if not self.tasks:
return
# 2. 执行任务
completed_tasks = []
for i, task in enumerate(self.tasks):
self.current_task_index = i
result = self.execute_task(task)
completed_tasks.append(result)
# 每完成2个任务评估一次进度
if (i + 1) % 2 == 0 and i < len(self.tasks) - 1:
self.evaluate_progress(completed_tasks)
# 3. 生成最终报告
print("\n📊 正在生成最终报告...")
final_report = self.generate_final_report(completed_tasks)
print("\n🎉 所有任务已完成!最终报告:")
print(final_report)
return final_report
最后,我们测试这个自主Agent:
# 初始化组件
llm = ChatOpenAI(
model=os.getenv("OPENAI_MODEL_NAME", "gpt-4-turbo-preview"),
temperature=0.7
)
memory = SimpleMemory()
# 使用之前定义的tools
agent = AutonomousAgent(llm, tools, memory)
# 设定目标并运行
agent.set_goal("研究2024年全球AI芯片市场的竞争格局,分析NVIDIA、AMD、Intel三家公司的优劣势,并预测未来2年的市场趋势。")
final_report = agent.run()
5.3 项目三:构建多Agent协作的市场调研团队(CrewAI)
5.3.1 项目目标
在这个项目中,我们将使用CrewAI构建一个由多个Agent组成的市场调研团队,每个Agent有不同的角色和技能,通过协作完成一份完整的市场调研报告。
5.3.2 团队角色设计
我们将设计以下4个角色:
- 市场调研专家(Market Researcher):负责收集市场数据和行业信息。
- 竞争对手分析师(Competitive Analyst):负责分析主要竞争对手的情况。
- 内容撰稿人(Content Writer):负责将分析结果整理成结构化的报告。
- 报告审核专家(Report Reviewer):负责审核报告内容,确保质量。
5.3.3 代码实现
首先,我们导入CrewAI相关的库:
from crewai import Agent, Task, Crew, Process
from langchain_openai import ChatOpenAI
from langchain_community.tools import DuckDuckGoSearchRun
import os
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
# 初始化LLM
llm = ChatOpenAI(
model=os.getenv("OPENAI_MODEL_NAME", "gpt-4-turbo-preview"),
temperature=0.7
)
# 初始化搜索工具
search_tool = DuckDuckGoSearchRun()
接下来,我们定义各个Agent:
# 1. 市场调研专家
market_researcher = Agent(
role='市场调研专家',
goal='收集最新的市场数据、行业趋势和消费者洞察,为市场调研报告提供基础信息。',
backstory="""你是一位拥有10年经验的市场调研专家,擅长使用各种工具收集和分析市场信息。
你对技术行业尤其是AI领域有深入的了解,能够从海量信息中筛选出有价值的内容。""",
tools=[search_tool],
llm=llm,
verbose=True,
allow_delegation=False
)
# 2. 竞争对手分析师
competitive_analyst = Agent(
role='竞争对手分析师',
goal='深入分析主要竞争对手的产品、战略、市场份额和优劣势,为决策提供参考。',
backstory="""你是一位资深的竞争对手分析师,曾在多家知名咨询公司工作。
你擅长通过公开信息分析竞争对手的内部战略,能够发现别人忽略的关键信息。""",
tools=[search_tool],
llm=llm,
verbose=True,
allow_delegation=False
)
# 3. 内容撰稿人
content_writer = Agent(
role='内容撰稿人',
goal='将市场调研和竞争分析的结果整理成结构清晰、内容详实、语言专业的市场调研报告。',
backstory="""你是一位优秀的技术内容撰稿人,拥有丰富的报告写作经验。
你擅长将复杂的信息转化为易懂的文字,能够写出既专业又有可读性的报告。""",
llm=llm,
verbose=True,
allow_delegation=False
)
# 4. 报告审核专家
report_reviewer = Agent(
role='报告审核专家',
goal='审核市场调研报告的内容准确性、结构完整性和逻辑合理性,提出修改建议并完善报告。',
backstory="""你是一位严谨的报告审核专家,对质量有极高的要求。
你能够发现报告中的错误和不足,并提出建设性的修改意见,确保报告的专业性和可信度。""",
llm=llm,
verbose=True,
allow_delegation=False
)
然后,我们定义任务:
# 任务1:市场调研
task_market_research = Task(
description="""收集2024年AI Agent领域的以下信息:
1. 市场规模和增长率
2. 主要应用场景
3. 技术发展趋势
4. 政策环境
5. 消费者/企业用户的需求特点
请使用搜索工具收集最新的信息,并整理成结构化的文档。""",
agent=market_researcher,
expected_output="一份包含上述5个方面信息的市场调研报告初稿,数据来源明确,内容详实。"
)
# 任务2:竞争分析
task_competitive_analysis = Task(
description="""分析AI Agent领域的3-5家主要公司(如OpenAI、Anthropic、Google、Microsoft等):
1. 各公司的AI Agent产品/服务介绍
2. 市场份额和用户规模
3. 技术特点和优劣势
4. 商业模式
5. 未来发展战略
请使用搜索工具收集信息,并进行深入分析。""",
agent=competitive_analyst,
expected_output="一份详细的竞争分析报告,包含每个公司的全面分析和对比总结。"
)
# 任务3:撰写报告
task_write_report = Task(
description="""根据市场调研和竞争分析的结果,撰写一份完整的市场调研报告。
报告应包含以下部分:
1. 执行摘要
2. 市场概述(规模、趋势、应用场景)
3. 竞争格局分析
4. 主要公司详细分析
5. 未来展望与机遇
6. 结论与建议
要求结构清晰、逻辑严谨、语言专业、数据准确。""",
agent=content_writer,
expected_output="一份完整的、结构化的AI Agent市场调研报告,使用markdown格式,字数不少于3000字。"
)
# 任务4:审核报告
task_review_report = Task(
description="""审核已撰写的市场调研报告,重点关注:
1. 内容准确性和数据来源可靠性
2. 结构完整性和逻辑合理性
3. 语言表达的专业性和流畅性
4. 是否有遗漏的重要信息
请提出具体的修改建议,并根据建议完善报告。""",
agent=report_reviewer,
expected_output="审核意见和修改后的最终报告,审核意见应具体明确,修改后的报告质量更高。"
)
最后,我们创建Crew并运行:
# 创建Crew
crew = Crew(
agents=[market_researcher, competitive_analyst, content_writer, report_reviewer],
tasks=[task_market_research, task_competitive_analysis, task_write_report, task_review_report],
process=Process.sequential, # 顺序执行任务
verbose=True
)
# 运行Crew
print("🚀 市场调研团队开始工作...")
result = crew.kickoff()
print("\n🎉 任务完成!最终报告:")
print(result)
6. 关键代码解析与深度剖析
在这一部分,我们将深入解析前面项目中的关键代码,帮助你理解AI Agent背后的工作原理。
6.1 LangChain Agent的工作原理
在项目一中,我们使用了initialize_agent函数创建了一个Agent。让我们来解析它的工作原理:
6.1.1 Agent的核心组成
- LLM:作为Agent的"大脑",负责推理和决策。
- Tools:Agent可以使用的工具列表。
- AgentType:定义Agent的推理模式,常见的有:
ZERO_SHOT_REACT_DESCRIPTION:零样本ReAct模式,根据工具描述选择工具。CHAT_CONVERSATIONAL_REACT_DESCRIPTION:支持对话记忆的ReAct模式。OPENAI_FUNCTIONS:专门为OpenAI的函数调用API设计。
- Memory:存储对话历史和任务状态。
6.1.2 ReAct模式的工作流程
ReAct(Reasoning + Acting)是一种常用的Agent推理模式,它的工作流程如下:
在这个流程中,Agent会不断地在"思考"、"行动"和"观察"之间循环,直到任务完成。
6.1.3 关键代码解析
让我们看一下initialize_agent函数背后的关键逻辑(简化版):
def simple_agent_executor(llm, tools, input_text):
# 1. 定义ReAct提示模板
react_prompt = """你是一个智能助手,可以使用以下工具:
{tools}
使用以下格式:
Question: 输入的问题
Thought: 你应该思考该做什么
Action: 要执行的行动,应该是 [{tool_names}] 中的一个
Action Input: 行动的输入
Observation: 行动的结果
... (这个 Thought/Action/Action Input/Observation 过程可以重复多次)
Thought: 我现在知道最终答案了
Final Answer: 原始输入问题的最终答案
开始!
Question: {input}
Thought:"""
# 2. 准备工具描述
tool_descriptions = "\n".join([f"{tool.name}: {tool.description}" for tool in tools])
tool_names = ", ".join([tool.name for tool in tools])
# 3. 循环执行ReAct流程
current_thought = ""
while True:
# 构建提示
prompt = react_prompt.format(
tools=tool_descriptions,
tool_names=tool_names,
input=input_text,
agent_scratchpad=current_thought
)
# 调用LLM
response = llm.invoke(prompt)
response_text = response.content
# 解析响应
if "Final Answer:" in response_text:
final_answer = response_text.split("Final Answer:")[-1].strip()
return final_answer
# 提取Action和Action Input
if "Action:" in response_text and "Action Input:" in response_text:
action_part = response_text.split("Action:")[-1].split("Action Input:")[0].strip()
input_part = response_text.split("Action Input:")[-1].strip()
# 执行工具
tool = next((t for t in tools if t.name == action_part), None)
if tool:
observation = tool.run(input_part)
current_thought += f"\n{response_text}\nObservation: {observation}"
else:
current_thought += f"\n{response_text}\nObservation: 工具 {action_part} 不存在"
else:
return f"无法解析LLM响应: {response_text}"
这个简化版的代码展示了ReAct Agent的核心逻辑:构建提示、调用LLM、解析响应、执行工具、循环直到得到最终答案。
6.2 CrewAI的多Agent协作机制
在项目三中,我们使用CrewAI构建了一个多Agent协作系统。让我们来解析它的工作原理:
6.2.1 CrewAI的核心概念
- Agent:具有特定角色、目标和工具的智能体。
- Task:分配给Agent的具体任务。
- Crew:由多个Agent和Task组成的团队。
- Process:定义Task的执行顺序(顺序执行、并行执行等)。
6.2.2 多Agent协作的信息传递机制
CrewAI通过以下机制实现Agent之间的信息传递:
- 任务输出作为后续任务的输入:在顺序执行模式下,前一个任务的输出会自动作为后一个任务的上下文。
- Agent记忆共享:Crew中的Agent可以共享记忆,了解之前的任务执行情况。
- Agent间委托:Agent可以将部分任务委托给其他Agent(需要设置
allow_delegation=True)。
6.2.3 关键代码解析
CrewAI的Agent类核心属性和方法(简化版):
class SimpleAgent:
def __init__(self, role, goal, backstory, tools=None, llm=None):
self.role = role
self.goal = goal
self.backstory = backstory
self.tools = tools or []
self.llm = llm
self.memory = []
def _build_prompt(self, task_description, context):
"""构建Agent的提示词"""
更多推荐


所有评论(0)