大模型已经非常强大,能够生成内容、回答问题甚至协助编程。那为什么我们还需要 AI Agent?
简单的说,大模型就像一个“超级大脑”,知识丰富、能力强大,但它的问题是“只懂回答,不懂行动”。你可以让它生成一篇文章、回答一个问题,但如果你希望它主动完成一系列复杂任务,仅靠大模型自身是不够的。
这时候大模型就无能为力了。原因是它只有聪明的”大脑“,但却没有”手脚“、也没有”工具“,因此无法自主的完成任务。所以AI需要这样的进化:
这就是为什么需要Agent —— 因为我们需要AI不仅是被动的回答问题,更需要能够主动的解决问题。
so, AI Agent(智能体) 是一种能利用大模型进行自主的任务规划、决策与执行的系统。它的核心思路是让人工智能不仅能回答问题,还能像人一样主动完成一系列关联性的任务;不仅有聪明的“大脑”,还有灵活的“手脚”,必要的时候还会使用“工具”
1.输入理解:用户提出一个任务(比如发送一份产品对比报告),Agent首先借助大模型对用户输入指令进行理解和解析,识别任务目标和约束条件。
2.任务规划:基于理解的目标,Agent 会规划完成任务的步骤,并决定采取哪些行动。这可能涉及将目标分解成多个子任务,确定任务优先级与执行顺序等(如获取竞品信息、查询企业产品信息、生成对比报告、发送电子邮件)。
3.任务执行与反馈:通过大模型或外部工具完成每个子任务(如调用搜索引擎、查询数据库、生成对比结果、调用电子邮件发送服务);在此过程中,Agent会搜集与观察子任务结果,及时处理问题,必要时对任务进行调整(如任务执行发生了错误,可能会进行多次迭代尝试)。
4.任务完成与交付:将任务的结果汇总并输出(如生成对比报告与邮件发送回执)。
组件 | 功能说明 | 技术实现示例 |
---|---|---|
决策大脑 | 任务分解与逻辑推理 | GPT-4、Claude 3 |
记忆模块 | 记录对话历史与操作状态 | Redis时序数据库 |
工具库 | 扩展能力的外部接口 | Web API/数据库连接器 |
感知终端 | 多模态输入输出 | 语音识别/图像生成模型 |
如下获得广泛认可的Agent架构来自于OpenAI公司的总结
Agent = LLM + 记忆 + 规划技能 + 工具使用
1.大模型:提供核心的语言理解、推理与生成能力,是整个Agent的“大脑”。
2.任务规划:对复杂任务借助大模型进行分解、规划和调度,并及时观察子任务执行的结果与反馈,对任务及时调整。
3.工具使用:与外部工具(如API、数据库、硬件设备)进行交互,扩展智能体的能力,执行任务,相当于Agent的“手脚”。
4.记忆:这是Agent的“存储器”,可用来存储短期的记忆(如一次任务过程中的多次人类交互)或长期记忆(如记录使用者的任务历史、个人信息、兴趣便好等)。
除此之外,通常Agent还需要提供一个直观的入口,让用户可以方便地给Agent下达指令或查看结果,这个入口可以是可视化的文字输入、语音输入,或者对外开放的API接口。
当前AI Agent仍然处于技术积累与实验阶段,尽管很多大模型厂家推出了Agent平台甚至商店,但主要集中在个人助理、娱乐、写作等对可靠性与确定性相对较低的领域,而在真正的生产力场景,还面临众多挑战。
AI Agent将LLM作为核心组件,用于理解用户需求、计划任务、生成响应并执行操作。但在一些对准确性、可预测性、可追溯性要求极高的场景中,LLM的不确定性会带来一些潜在问题。
错误的任务规划
LLM误解了用户的意图或语义,可能会导致错误的计划与结果
错误的工具调用
如果LLM生成了错误的工具调用逻辑,可能会导致任务失败
生成错误的建议
在医疗、法律、金融等需要高度准确的领域,不确定性可能带来严重后果
安全与伦理问题
LLM可能会根据不完整的上下文生成带有潜在风险甚至违反伦理的建议
稳定性和可重复性
在工业应用中,系统的行为需要可重复且稳定,而LLM由于其生成概率特性,可能在相同条件下输出不同的结果
<dependencies>
<dependency>
<groupId>dev.langchain4jgroupId>
<artifactId>langchain4jartifactId>
<version>0.25.0version>
dependency>
<dependency>
<groupId>dev.langchain4jgroupId>
<artifactId>langchain4j-open-aiartifactId>
<version>0.25.0version>
dependency>
<dependency>
<groupId>org.junit.jupitergroupId>
<artifactId>junit-jupiterartifactId>
<version>5.9.2version>
<scope>testscope>
dependency>
dependencies>
// ProductAgent.java
import dev.langchain4j.chain.ConversationalRetrievalChain;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.parser.TextDocumentParser;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
import dev.langchain4j.retriever.EmbeddingStoreRetriever;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import static dev.langchain4j.data.document.loader.FileSystemDocumentLoader.*;
public class ProductAgent {
// RAG组件
private final ConversationalRetrievalChain retrievalChain;
// Agent记忆
private final ChatMemory chatMemory;
// 工具集
private final EmailService emailService;
public ProductAgent() {
// 初始化大模型
ChatLanguageModel chatModel = OpenAiChatModel.builder()
.apiKey("xxxxxx") // 替换为实际API Key
.modelName("gpt-3.5-turbo")
.temperature(0.3)
.build();
// 初始化RAG组件
EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()
.apiKey("xxxx")
.modelName("text-embedding-3-small")
.build();
EmbeddingStore<TextSegment> embeddingStore = createEmbeddingStore();
this.retrievalChain = ConversationalRetrievalChain.builder()
.chatLanguageModel(chatModel)
.retriever(EmbeddingStoreRetriever.from(embeddingStore, embeddingModel))
.build();
// 初始化记忆
this.chatMemory = MessageWindowChatMemory.withMaxMessages(10);
// 初始化工具
this.emailService = new EmailService();
}
private EmbeddingStore<TextSegment> createEmbeddingStore() {
try {
// 加载产品文档
Path documentPath = Paths.get(getClass().getClassLoader()
.getResource("products.txt").toURI());
List<Document> documents = loadDocument(documentPath, new TextDocumentParser());
// 分割文档并生成嵌入
InMemoryEmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
documents.stream()
.flatMap(doc -> DocumentSplitters.recursive(300, 0).split(doc).stream())
.forEach(segment -> {
var embedding = embeddingModel.embed(segment.text()).content();
embeddingStore.add(embedding, TextSegment.from(segment.text()));
});
return embeddingStore;
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
public String processRequest(String userQuery) {
// 记忆管理
chatMemory.addUserMessage(userQuery);
// 任务类型判断
if (isAnalysisRequest(userQuery)) {
return handleAnalysisRequest(userQuery);
} else if (isEmailRequest(userQuery)) {
return handleEmailRequest(userQuery);
}
return handleGeneralQuery(userQuery);
}
private boolean isAnalysisRequest(String query) {
return query.contains("分析") || query.contains("对比");
}
private boolean isEmailRequest(String query) {
return query.contains("发送") && query.contains("邮件");
}
private String handleAnalysisRequest(String query) {
// RAG检索增强
String context = retrievalChain.execute(query);
// Agent任务分解
String competitorInfo = webSearch(query);
String report = generateReport(context, competitorInfo);
return "分析报告已生成:\n" + report;
}
private String handleEmailRequest(String query) {
// 提取邮件信息
String emailContent = extractEmailContent(query);
String recipient = extractRecipient(query);
emailService.sendEmail(recipient, "分析报告", emailContent);
return "邮件已发送至:" + recipient;
}
private String handleGeneralQuery(String query) {
return retrievalChain.execute(query);
}
// 模拟工具方法
private String webSearch(String query) {
return "模拟搜索结果:竞品最新型号为X30 Pro,售价5999元";
}
private String generateReport(String context, String competitorInfo) {
String prompt = """
基于以下信息生成对比报告:
内部产品信息:%s
竞品信息:%s
要求:列出至少3项核心参数对比
""";
return retrievalChain.execute(prompt.formatted(context, competitorInfo));
}
private String extractEmailContent(String query) {
return chatMemory.getMessages().stream()
.filter(msg -> msg.text().contains("分析报告"))
.findFirst()
.map(msg -> msg.text())
.orElse("默认报告内容");
}
private String extractRecipient(String query) {
return query.replaceAll(".*?(\\d+@\\w+\\.com).*", "$1");
}
// 邮件服务工具
static class EmailService {
void sendEmail(String to, String subject, String content) {
System.out.printf("发送邮件到:%s\n主题:%s\n内容:%s\n", to, subject, content);
}
}
}
// ProductAgentTest.java
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class ProductAgentTest {
private ProductAgent agent;
@BeforeEach
void setUp() {
agent = new ProductAgent();
}
@Test
void testProductQuery() {
String response = agent.processRequest("你们的最新手机有什么特点?");
assertTrue(response.contains("潜望式镜头"));
System.out.println("产品查询测试通过:\n" + response);
}
@Test
void testCompetitorAnalysis() {
String response = agent.processRequest("请分析我们的产品与X30 Pro的差异");
assertTrue(response.contains("核心参数"));
System.out.println("竞品分析测试通过:\n" + response);
}
@Test
void testEmailSending() {
String response = agent.processRequest("将分析报告发送到[email protected]");
assertTrue(response.contains("邮件已发送"));
System.out.println("邮件发送测试通过:\n" + response);
}
}
测试资源文件 src/main/resources/products.txt
:
产品名称:X30 Pro
上市时间:2024年3月
核心配置:
- 处理器:第三代骁龙8
- 摄像头:200MP主摄 + 潜望式长焦
- 电池:5500mAh
- 价格:5999元起
产品名称:X30 Lite
上市时间:2024年5月
核心配置:
- 处理器:骁龙7 Gen3
- 摄像头:108MP主摄
- 电池:4800mAh
- 价格:2999元起