LLM - 白话AI Agent

文章目录

  • 一、AI Agent:让大模型从"思考者"变为"行动者"
  • 二、Agent的基本工作原理
  • 三、 Agent系统的基本组成
  • 四、Agent面临最大的挑战
  • 五、Java版智能体实战:竞品分析助手

LLM - 白话AI Agent_第1张图片

一、AI Agent:让大模型从"思考者"变为"行动者"

大模型已经非常强大,能够生成内容、回答问题甚至协助编程。那为什么我们还需要 AI Agent?

简单的说,大模型就像一个“超级大脑”,知识丰富、能力强大,但它的问题是“只懂回答,不懂行动”。你可以让它生成一篇文章、回答一个问题,但如果你希望它主动完成一系列复杂任务,仅靠大模型自身是不够的。

这时候大模型就无能为力了。原因是它只有聪明的”大脑“,但却没有”手脚“、也没有”工具“,因此无法自主的完成任务。所以AI需要这样的进化:

LLM - 白话AI Agent_第2张图片

这就是为什么需要Agent —— 因为我们需要AI不仅是被动的回答问题,更需要能够主动的解决问题

so, AI Agent(智能体) 是一种能利用大模型进行自主的任务规划、决策与执行的系统。它的核心思路是让人工智能不仅能回答问题,还能像人一样主动完成一系列关联性的任务;不仅有聪明的“大脑”,还有灵活的“手脚”,必要的时候还会使用“工具”


二、Agent的基本工作原理

LLM - 白话AI Agent_第3张图片

  • 1.输入理解:用户提出一个任务(比如发送一份产品对比报告),Agent首先借助大模型对用户输入指令进行理解和解析,识别任务目标和约束条件。

  • 2.任务规划:基于理解的目标,Agent 会规划完成任务的步骤,并决定采取哪些行动。这可能涉及将目标分解成多个子任务,确定任务优先级与执行顺序等(如获取竞品信息、查询企业产品信息、生成对比报告、发送电子邮件)。

  • 3.任务执行与反馈:通过大模型或外部工具完成每个子任务(如调用搜索引擎、查询数据库、生成对比结果、调用电子邮件发送服务);在此过程中,Agent会搜集与观察子任务结果,及时处理问题,必要时对任务进行调整(如任务执行发生了错误,可能会进行多次迭代尝试)。

  • 4.任务完成与交付:将任务的结果汇总并输出(如生成对比报告与邮件发送回执)。


三、 Agent系统的基本组成

组件 功能说明 技术实现示例
决策大脑 任务分解与逻辑推理 GPT-4、Claude 3
记忆模块 记录对话历史与操作状态 Redis时序数据库
工具库 扩展能力的外部接口 Web API/数据库连接器
感知终端 多模态输入输出 语音识别/图像生成模型

如下获得广泛认可的Agent架构来自于OpenAI公司的总结

LLM - 白话AI Agent_第4张图片
可以总结成:

Agent = LLM + 记忆 + 规划技能 + 工具使用

1.大模型:提供核心的语言理解、推理与生成能力,是整个Agent的“大脑”。

2.任务规划:对复杂任务借助大模型进行分解、规划和调度,并及时观察子任务执行的结果与反馈,对任务及时调整。

3.工具使用:与外部工具(如API、数据库、硬件设备)进行交互,扩展智能体的能力,执行任务,相当于Agent的“手脚”。

4.记忆:这是Agent的“存储器”,可用来存储短期的记忆(如一次任务过程中的多次人类交互)或长期记忆(如记录使用者的任务历史、个人信息、兴趣便好等)。

除此之外,通常Agent还需要提供一个直观的入口,让用户可以方便地给Agent下达指令或查看结果,这个入口可以是可视化的文字输入、语音输入,或者对外开放的API接口。


四、Agent面临最大的挑战

当前AI Agent仍然处于技术积累与实验阶段,尽管很多大模型厂家推出了Agent平台甚至商店,但主要集中在个人助理、娱乐、写作等对可靠性与确定性相对较低的领域,而在真正的生产力场景,还面临众多挑战。

AI Agent将LLM作为核心组件,用于理解用户需求、计划任务、生成响应并执行操作。但在一些对准确性、可预测性、可追溯性要求极高的场景中,LLM的不确定性会带来一些潜在问题。

错误的任务规划

LLM误解了用户的意图或语义,可能会导致错误的计划与结果

错误的工具调用

如果LLM生成了错误的工具调用逻辑,可能会导致任务失败

生成错误的建议

在医疗、法律、金融等需要高度准确的领域,不确定性可能带来严重后果

安全与伦理问题

LLM可能会根据不完整的上下文生成带有潜在风险甚至违反伦理的建议

稳定性和可重复性

在工业应用中,系统的行为需要可重复且稳定,而LLM由于其生成概率特性,可能在相同条件下输出不同的结果

五、Java版智能体实战:竞品分析助手


<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元起

LLM - 白话AI Agent_第5张图片

你可能感兴趣的:(【LLM大模型】,人工智能,AI,Agent,LLM)