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

RAG简介
检索增强生成(Retrieval-Augmented Generation, RAG)是一种结合了大型语言模型(LLM)生成能力和信息检索技术的强大方法。与仅依赖预训练知识的传统语言模型不同,RAG通过在查询时动态检索外部数据,使模型能够生成基于最新和准确信息的回答。这种方法显著提高了回答的准确性,减少了"幻觉"(生成错误或虚构内容),并使语言模型更适合需要特定领域知识的任务。
RAG的工作原理
RAG可以看作一个ETL(提取、转换、加载)流水线,结合了专门的查询技术。其工作流程包括以下步骤:
- 文档处理与分块:原始文档(文本、HTML、Markdown、JSON等)被分割成较小的片段,称为"块"(chunks)。分块策略(如递归分块或滑动窗口)确保文本分割后仍保留语义完整性。例如,一个文档可能被分成512个标记(token)的块,并设置50个标记的重叠以保持上下文。
- 嵌入生成:每个块被转换为一个捕捉其语义的数值向量(嵌入)。嵌入模型(如OpenAI的text-embedding-3-small或Cohere的embed-english-v3.0)将文本转化为高维向量(例如1536维)。这些向量支持高效的相似性搜索。
- 向量存储:嵌入向量存储在专门的向量数据库中(如PGVector、Pinecone、Qdrant),这些数据库优化了快速相似性搜索。元数据(如文档来源或关键词)可以与嵌入一起存储,支持过滤搜索。
- 查询处理:用户提交查询时,查询被转换为嵌入向量(使用与文档嵌入相同的模型)。系统通过相似性搜索从向量数据库中检索最相关的块。
- 回答生成:检索到的块作为上下文传递给大型语言模型(如GPT-4o-mini),模型根据这些上下文生成准确且相关的回答。
RAG的优势
- 提高准确性:通过基于检索数据的回答,RAG降低了生成错误信息的风险。
- 上下文相关性:RAG可以融入特定领域或用户提供的知识,使回答更具针对性。
- 可扩展性:向量数据库支持高效存储和检索大数据集,适合企业级应用。
- 灵活性:RAG支持多种文档类型,并可与不同的嵌入模型和向量存储集成。
RAG的挑战
- 分块策略:不当的分块可能导致上下文丢失或检索无关内容。
- 嵌入质量:检索效果依赖于嵌入模型的质量。
- 延迟:检索和处理数据会增加计算开销,影响响应时间。
- 复杂性:RAG的实现需要管理文档处理、嵌入生成、向量存储和模型集成。
Mastra对RAG的实现
Mastra 是一个基于TypeScript的AI代理框架,为开发者提供了构建RAG应用的强大而易用的平台。Mastra通过提供处理文档、生成嵌入、存储向量和检索上下文的API和工具,简化了RAG的复杂性。以下我们将详细探讨Mastra如何实现RAG及其关键功能。
Mastra RAG系统的核心组件
Mastra的RAG实现设计为模块化和灵活性,支持多种使用场景。主要组件包括:
-
MDocument类:
-
MDocument类是Mastra文档处理的基础,支持多种格式,包括纯文本、HTML、Markdown和JSON。
-
通过MDocument.fromText()、fromHTML()、fromMarkdown()和fromJSON()等方法,开发者可以从不同来源创建文档。
-
.chunk()方法使用递归或基于Markdown的分块策略将文档分割成块,开发者可以自定义块大小、重叠和元数据提取。
-
示例:
phpimport { MDocument } from "@mastra/rag"; const doc = MDocument.fromText("气候变化带来了重大挑战..."); const chunks = await doc.chunk({ strategy: "recursive", size: 512, overlap: 50, separator: "\n", });
-
-
嵌入生成:
-
Mastra通过Vercel AI SDK集成了多种嵌入提供商(如OpenAI、Cohere、Google),开发者可选择最适合的模型。
-
embedMany()函数为文档块生成嵌入,支持降维以提高效率。
-
示例:
javascriptimport { 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"), });
-
-
向量数据库:
-
Mastra支持多种向量存储,包括PGVector、Pinecone、Qdrant、LibSQL和Cloudflare Vector,适应不同的部署环境。
-
例如,PgVector类允许开发者在带有向量扩展的PostgreSQL数据库中存储和查询嵌入。
-
示例:
javascriptimport { PgVector } from "@mastra/pg"; const pgVector = new PgVector(process.env.POSTGRES_CONNECTION_STRING); await pgVector.upsert({ indexName: "embeddings", vectors: embeddings, });
-
-
检索与语义搜索:
-
Mastra的createVectorQueryTool()函数创建支持语义搜索的工具,代理可以通过查询嵌入检索相关块。
-
开发者可以启用元数据过滤,使用MongoDB风格的查询来缩小搜索范围。
-
示例:
phpimport { 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, });
-
-
GraphRAG:
-
Mastra扩展了传统RAG,推出了GraphRAG,一种基于图的检索方法,通过文档块构建知识图谱。节点表示块,边表示语义关系,支持通过图遍历实现更复杂的检索。
-
createGraphRAGTool()函数支持基于图的查询,结合向量相似性和关系上下文。
-
示例:
phpimport { createGraphRAGTool } from "@mastra/rag"; const graphRagTool = createGraphRAGTool({ vectorStoreName: "pgVector", indexName: "embeddings", model: openai.embedding("text-embedding-3-small"), graphOptions: { dimension: 1536, threshold: 0.7 }, });
-
-
代理集成:
-
Mastra的代理通过Agent类构建,集成了RAG工具以生成上下文感知的回答。开发者可以通过自定义指令确保回答简洁且相关。
-
示例:
javascriptimport { 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的文档提供了一个构建研究论文助手的完整指南。以下是简化的实现过程:
-
加载并处理研究论文:
iniimport { 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, });
-
生成并存储嵌入:
javascriptimport { 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, });
-
创建RAG代理:
javascriptimport { 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 }, });
-
查询助手:
iniconst 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做开发增效也是必不可少的