前端开发AI Agent之RAG篇

开始之前突然发现trae编辑器更新了,它终于支持MCP了,还接入了自己的MCP市场,之后可能会想尝试一下figma mcpserver,看看能否通过AI对话生成一些简易的UI支持前端开发者进行一些个人创作。这样一些AI根据UI生成项目的快速启动方案和UI测试都可以尝试了

RAG简介

检索增强生成(Retrieval-Augmented Generation, RAG)是一种结合了大型语言模型(LLM)生成能力和信息检索技术的强大方法。与仅依赖预训练知识的传统语言模型不同,RAG通过在查询时动态检索外部数据,使模型能够生成基于最新和准确信息的回答。这种方法显著提高了回答的准确性,减少了"幻觉"(生成错误或虚构内容),并使语言模型更适合需要特定领域知识的任务。

RAG的工作原理

RAG可以看作一个ETL(提取、转换、加载)流水线,结合了专门的查询技术。其工作流程包括以下步骤:

  1. 文档处理与分块:原始文档(文本、HTML、Markdown、JSON等)被分割成较小的片段,称为"块"(chunks)。分块策略(如递归分块或滑动窗口)确保文本分割后仍保留语义完整性。例如,一个文档可能被分成512个标记(token)的块,并设置50个标记的重叠以保持上下文。
  2. 嵌入生成:每个块被转换为一个捕捉其语义的数值向量(嵌入)。嵌入模型(如OpenAI的text-embedding-3-small或Cohere的embed-english-v3.0)将文本转化为高维向量(例如1536维)。这些向量支持高效的相似性搜索。
  3. 向量存储:嵌入向量存储在专门的向量数据库中(如PGVector、Pinecone、Qdrant),这些数据库优化了快速相似性搜索。元数据(如文档来源或关键词)可以与嵌入一起存储,支持过滤搜索。
  4. 查询处理:用户提交查询时,查询被转换为嵌入向量(使用与文档嵌入相同的模型)。系统通过相似性搜索从向量数据库中检索最相关的块。
  5. 回答生成:检索到的块作为上下文传递给大型语言模型(如GPT-4o-mini),模型根据这些上下文生成准确且相关的回答。

RAG的优势

  • 提高准确性:通过基于检索数据的回答,RAG降低了生成错误信息的风险。
  • 上下文相关性:RAG可以融入特定领域或用户提供的知识,使回答更具针对性。
  • 可扩展性:向量数据库支持高效存储和检索大数据集,适合企业级应用。
  • 灵活性:RAG支持多种文档类型,并可与不同的嵌入模型和向量存储集成。

RAG的挑战

  • 分块策略:不当的分块可能导致上下文丢失或检索无关内容。
  • 嵌入质量:检索效果依赖于嵌入模型的质量。
  • 延迟:检索和处理数据会增加计算开销,影响响应时间。
  • 复杂性:RAG的实现需要管理文档处理、嵌入生成、向量存储和模型集成。

Mastra对RAG的实现

Mastra 是一个基于TypeScript的AI代理框架,为开发者提供了构建RAG应用的强大而易用的平台。Mastra通过提供处理文档、生成嵌入、存储向量和检索上下文的API和工具,简化了RAG的复杂性。以下我们将详细探讨Mastra如何实现RAG及其关键功能。

Mastra RAG系统的核心组件

Mastra的RAG实现设计为模块化和灵活性,支持多种使用场景。主要组件包括:

  1. MDocument类

    • MDocument类是Mastra文档处理的基础,支持多种格式,包括纯文本、HTML、Markdown和JSON。

    • 通过MDocument.fromText()、fromHTML()、fromMarkdown()和fromJSON()等方法,开发者可以从不同来源创建文档。

    • .chunk()方法使用递归或基于Markdown的分块策略将文档分割成块,开发者可以自定义块大小、重叠和元数据提取。

    • 示例:

      php 复制代码
      import { MDocument } from "@mastra/rag";
      
      const doc = MDocument.fromText("气候变化带来了重大挑战...");
      const chunks = await doc.chunk({
        strategy: "recursive",
        size: 512,
        overlap: 50,
        separator: "\n",
      });
  2. 嵌入生成

    • Mastra通过Vercel AI SDK集成了多种嵌入提供商(如OpenAI、Cohere、Google),开发者可选择最适合的模型。

    • embedMany()函数为文档块生成嵌入,支持降维以提高效率。

    • 示例:

      javascript 复制代码
      import { embedMany } from "ai";
      import { openai } from "@ai-sdk/openai";
      
      const { embeddings } = await embedMany({
        values: chunks.map(chunk => chunk.text),
        model: openai.embedding("text-embedding-3-small"),
      });
  3. 向量数据库

    • Mastra支持多种向量存储,包括PGVector、Pinecone、Qdrant、LibSQL和Cloudflare Vector,适应不同的部署环境。

    • 例如,PgVector类允许开发者在带有向量扩展的PostgreSQL数据库中存储和查询嵌入。

    • 示例:

      javascript 复制代码
      import { PgVector } from "@mastra/pg";
      
      const pgVector = new PgVector(process.env.POSTGRES_CONNECTION_STRING);
      await pgVector.upsert({
        indexName: "embeddings",
        vectors: embeddings,
      });
  4. 检索与语义搜索

    • Mastra的createVectorQueryTool()函数创建支持语义搜索的工具,代理可以通过查询嵌入检索相关块。

    • 开发者可以启用元数据过滤,使用MongoDB风格的查询来缩小搜索范围。

    • 示例:

      php 复制代码
      import { createVectorQueryTool } from "@mastra/rag";
      import { openai } from "@ai-sdk/openai";
      
      const vectorQueryTool = createVectorQueryTool({
        vectorStoreName: "pgVector",
        indexName: "embeddings",
        model: openai.embedding("text-embedding-3-small"),
        enableFilter: true,
      });
  5. GraphRAG

    • Mastra扩展了传统RAG,推出了GraphRAG,一种基于图的检索方法,通过文档块构建知识图谱。节点表示块,边表示语义关系,支持通过图遍历实现更复杂的检索。

    • createGraphRAGTool()函数支持基于图的查询,结合向量相似性和关系上下文。

    • 示例:

      php 复制代码
      import { createGraphRAGTool } from "@mastra/rag";
      
      const graphRagTool = createGraphRAGTool({
        vectorStoreName: "pgVector",
        indexName: "embeddings",
        model: openai.embedding("text-embedding-3-small"),
        graphOptions: { dimension: 1536, threshold: 0.7 },
      });
  6. 代理集成

    • Mastra的代理通过Agent类构建,集成了RAG工具以生成上下文感知的回答。开发者可以通过自定义指令确保回答简洁且相关。

    • 示例:

      javascript 复制代码
      import { Agent } from "@mastra/core/agent";
      import { openai } from "@ai-sdk/openai";
      
      const ragAgent = new Agent({
        name: "RAG Agent",
        model: openai("gpt-4o-mini"),
        instructions: "根据提供的上下文回答问题。",
        tools: { vectorQueryTool },
      });

Mastra RAG的高级功能

Mastra提供多项高级功能以提升RAG性能:

  • 元数据过滤:开发者可基于元数据字段(如文档来源、日期)使用统一的MongoDB风格查询语法进行过滤,适合处理大数据集。
  • 重新排序:rerank()函数通过结合向量相似性和语义理解提高检索质量,确保优先返回最相关的块。
  • 基于图的检索:GraphRAG通过语义关系发现相关内容,适合需要复杂上下文的查询。
  • 评估指标:Mastra的评估框架提供ContextRelevancy、Faithfulness和AnswerRelevancy等指标,用于评估RAG输出质量,生成0--1的标准化分数,便于记录和比较。

实践示例:构建研究助手

Mastra的文档提供了一个构建研究论文助手的完整指南。以下是简化的实现过程:

  1. 加载并处理研究论文

    ini 复制代码
    import { MDocument } from "@mastra/rag";
    import { fetch } from "undici";
    
    const paperUrl = "https://arxiv.org/html/1706.03762";
    const response = await fetch(paperUrl);
    const paperText = await response.text();
    const doc = MDocument.fromText(paperText);
    const chunks = await doc.chunk({
      strategy: "recursive",
      size: 512,
      overlap: 50,
    });
  2. 生成并存储嵌入

    javascript 复制代码
    import { embedMany } from "ai";
    import { openai } from "@ai-sdk/openai";
    import { PgVector } from "@mastra/pg";
    
    const { embeddings } = await embedMany({
      values: chunks.map(chunk => chunk.text),
      model: openai.embedding("text-embedding-3-small"),
    });
    const pgVector = new PgVector(process.env.POSTGRES_CONNECTION_STRING);
    await pgVector.upsert({
      indexName: "embeddings",
      vectors: embeddings,
    });
  3. 创建RAG代理

    javascript 复制代码
    import { Mastra } from "@mastra/core";
    import { Agent } from "@mastra/core/agent";
    import { createVectorQueryTool } from "@mastra/rag";
    
    const vectorQueryTool = createVectorQueryTool({
      vectorStoreName: "pgVector",
      indexName: "embeddings",
      model: openai.embedding("text-embedding-3-small"),
    });
    const researchAgent = new Agent({
      name: "Research Assistant",
      model: openai("gpt-4o-mini"),
      instructions: "分析学术论文并根据提供的上下文回答问题。",
      tools: { vectorQueryTool },
    });
    const mastra = new Mastra({
      agents: { researchAgent },
      vectors: { pgVector },
    });
  4. 查询助手

    ini 复制代码
    const agent = mastra.getAgent("researchAgent");
    const query = "翻译质量有哪些改进?";
    const response = await agent.generate(query);
    console.log("回答:", response.text);

此示例展示了Mastra如何简化RAG流水线,从文档处理到回答生成,使开发者能够轻松构建复杂的AI应用。

总结

RAG就是给Agent提高了脑容量,比如我打算实现的前端岗位搜索和模拟面试功能,它可以直接去网上搜索,也可以我自己定时爬取网站内容,或者把我的前端笔记交给它,让他做一个向量数据库,这样agent就能直接根据rag回答出更准确和基于现实的内容了。同时,rag技术对于企业内部知识库想要构建自己的agent做开发增效也是必不可少的

相关推荐
微学AI7 分钟前
详细介绍:MCP(大模型上下文协议)的架构与组件,以及MCP的开发实践
前端·人工智能·深度学习·架构·llm·mcp
liangshanbo121537 分钟前
CSS 包含块
前端·css
豆包MarsCode37 分钟前
玩转MCP | 一文看懂如何在 Trae IDE 中解锁 MCP
人工智能·mcp·trae
Mitchell_C38 分钟前
语义化 HTML (Semantic HTML)
前端·html
倒霉男孩40 分钟前
CSS文本属性
前端·css
晚风3081 小时前
前端
前端
JiangJiang1 小时前
🚀 Vue 人如何玩转 React 自定义 Hook?从 Mixins 到 Hook 的华丽转身
前端·react.js·面试
鱼樱前端1 小时前
让人头痛的原型和原型链知识
前端·javascript
用户19727304821961 小时前
传说中的开发增效神器-Trae,让我在开发智能旅拍小程序节省40%时间
前端
lianghj1 小时前
前端高手必备:深度解析高频场景解决方案与性能优化实战
前端·javascript·面试