RAG Agent业务落地全攻略(非常详细),实现方案从入门到精通,收藏这一篇就够了!

OpenViking上下文数据库Golang集成实践 技术创新文件系统范式:将AI Agent的上下文管理从扁平向量存储提升为结构化文件系统分层检索策略:L0/L1/L2三层加载机制,减少62.1%的Token消耗记忆自迭代:会话提交触发Agent经验沉淀,实现越用越智能工程实践完整Golang实现:提供生产级可用的OpenViking客户端库企业级集成方案:涵盖文档摄入、检索、会话管理等全流程性能优化成果:检索准确率提升24.1%,响应时间减少53.3%可观测性提升可视化检索轨迹:实现检索过程的白盒化,调试效率提升77.1%全面监控指标。 阅读详情

1. RAG 基础概念

1.1 什么是 RAG?

RAG(Retrieval-Augmented Generation,检索增强生成)是一种将**「外部知识检索」与「大语言模型生成」**相结合的技术架构。

┌──────────────────────────────────────────────────────────────────────────────┐│                          RAG 核心思想                                         │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   问题:LLM 的知识是训练时固化的,无法获取实时/私有数据                          ││                                                                              ││   ┌─────────────────────────────────────────────────────────────────────┐   ││   │  传统 LLM                                                           │   ││   │                                                                     │   ││   │  用户问:"公司最新的休假政策是什么?"                                 │   ││   │                     │                                               │   ││   │                     ▼                                               │   ││   │              LLM(不知道)                                          │   ││   │                     │                                               │   ││   │                     ▼                                               │   ││   │              "抱歉,我没有这方面的信息"                               │   ││   │                                                                     │   ││   └─────────────────────────────────────────────────────────────────────┘   ││                                                                              ││   ┌─────────────────────────────────────────────────────────────────────┐   ││   │  RAG 增强                                                           │   ││   │                                                                     │   ││   │  用户问:"公司最新的休假政策是什么?"                                 │   ││   │                     │                                               │   ││   │                     ▼                                               │   ││   │          ┌─────────────────────┐                                   │   ││   │          │  向量检索知识库      │ ← 包含公司文档、政策等              │   ││   │          └─────────────────────┘                                   │   ││   │                     │                                               │   ││   │                     ▼ 检索到相关文档片段                             │   ││   │          ┌─────────────────────┐                                   │   ││   │          │  LLM + 检索结果     │                                   │   ││   │          └─────────────────────┘                                   │   ││   │                     │                                               │   ││   │                     ▼                                               │   ││   │              "根据公司2024年最新政策,年假..."                        │   ││   │                                                                     │   ││   └─────────────────────────────────────────────────────────────────────┘   ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘

1.2 RAG vs Fine-tuning

维度RAGFine-tuning
「知识更新」实时更新,修改文档即可需要重新训练模型
「成本」低(只需存储和检索)高(需要 GPU 训练)
「可解释性」高(可以追溯来源)低(知识融入参数)
「幻觉问题」基于真实文档,幻觉较少可能产生虚构内容
「适用场景」事实性问答、知识库风格迁移、特定任务

1.3 RAG 完整流程

┌──────────────────────────────────────────────────────────────────────────────┐│                          RAG 完整流程                                         │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   【离线阶段:构建知识库】                                                     ││                                                                              ││   文档源 ──────► 文档解析 ──────► 文本分块 ──────► 向量化 ──────► 向量存储      ││   (PDF/MD/...)  (提取文本)     (Chunking)      (Embedding)    (VectorDB)    ││                                                                              ││   ─────────────────────────────────────────────────────────────────────────  ││                                                                              ││   【在线阶段:检索生成】                                                       ││                                                                              ││   用户查询                                                                    ││       │                                                                      ││       ▼                                                                      ││   查询增强(可选)──► 用户问"最新政策" → 扩展为"2024年公司休假政策规定"         ││       │                                                                      ││       ▼                                                                      ││   查询向量化 ──────► 将查询文本转为向量                                        ││       │                                                                      ││       ▼                                                                      ││   向量检索 ────────► 在向量库中找相似文档                                      ││       │                                                                      ││       ▼                                                                      ││   结果重排序(可选)─► 用更精确的模型对结果排序                                 ││       │                                                                      ││       ▼                                                                      ││   构建 Prompt ────► 将检索结果 + 用户问题组合                                  ││       │                                                                      ││       ▼                                                                      ││   LLM 生成回答                                                               ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘

— 2. trpc-agent-go 的 RAG 实现架构

本节详细介绍 trpc-agent-go 框架中 RAG 能力的完整实现,包括知识库构建、同步更新、检索流程和会话集成。

2.1 整体架构

┌──────────────────────────────────────────────────────────────────────────────┐│                    trpc-agent-go RAG 架构                                     │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   ┌─────────────────────────────────────────────────────────────────────┐   ││   │                        Knowledge(知识库)                           │   ││   │                                                                     │   ││   │   核心接口:Search(ctx, SearchRequest) → SearchResponse             │   ││   │                                                                     │   ││   └───────────────────────────────┬─────────────────────────────────────┘   ││                                   │                                         ││          ┌────────────────────────┼────────────────────────┐                ││          │                        │                        │                ││          ▼                        ▼                        ▼                ││   ┌─────────────┐         ┌─────────────┐         ┌─────────────┐          ││   │   Source    │         │  Embedder   │         │ VectorStore │          ││   │  (数据源)    │         │ (向量化模型) │         │ (向量存储)   │          ││   ├─────────────┤         ├─────────────┤         ├─────────────┤          ││   │ • File      │         │ • OpenAI    │         │ • InMemory  │          ││   │ • Directory │         │ • Ollama    │         │ • pgvector  │          ││   │ • URL       │         │ • HuggingFace│        │ • Milvus    │          ││   │ • Auto      │         │ • Gemini    │         │ • Qdrant    │          ││   └─────────────┘         └─────────────┘         │ • ES        │          ││                                                   │ • TCVector  │          ││                                                   └─────────────┘          ││                                                                              ││          ┌────────────────────────┼────────────────────────┐                ││          │                        │                        │                ││          ▼                        ▼                        ▼                ││   ┌─────────────┐         ┌─────────────┐         ┌─────────────┐          ││   │  Chunking   │         │  Retriever  │         │  Reranker   │          ││   │  (文本分块)  │         │  (检索器)    │         │  (重排序)    │          ││   ├─────────────┤         ├─────────────┤         ├─────────────┤          ││   │ • Fixed     │         │ • Default   │         │ • TopK      │          ││   │ • Recursive │         │             │         │ • Cohere    │          ││   │ • Markdown  │         │             │         │ • Infinity  │          ││   │ • JSON      │         │             │         │             │          ││   └─────────────┘         └─────────────┘         └─────────────┘          ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘

2.2 知识库的构建

2.2.1 构建流程
┌──────────────────────────────────────────────────────────────────────────────┐│                          知识库构建流程                                        │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   步骤 1:配置组件                                                            ││   ┌─────────────────────────────────────────────────────────────────────┐   ││   │                                                                     │   ││   │   kb := knowledge.New(                                              │   ││   │       knowledge.WithEmbedder(embedder),     // 向量化模型            │   ││   │       knowledge.WithVectorStore(store),     // 向量存储              │   ││   │       knowledge.WithSources(sources...),    // 数据源               │   ││   │       knowledge.WithReranker(reranker),     // 重排序器(可选)      │   ││   │       knowledge.WithEnableSourceSync(true), // 启用增量同步(可选)  │   ││   │   )                                                                 │   ││   │                                                                     │   ││   └─────────────────────────────────────────────────────────────────────┘   ││                                                                              ││   步骤 2:加载数据                                                            ││   ┌─────────────────────────────────────────────────────────────────────┐   ││   │                                                                     │   ││   │   err := kb.Load(ctx)                                               │   ││   │                                                                     │   ││   │   内部流程:                                                         │   ││   │   Source.ReadDocuments() → Chunking → Embedder → VectorStore.Add() │   ││   │                                                                     │   ││   └─────────────────────────────────────────────────────────────────────┘   ││                                                                              ││   步骤 3:搜索使用                                                            ││   ┌─────────────────────────────────────────────────────────────────────┐   ││   │                                                                     │   ││   │   resp, err := kb.Search(ctx, &knowledge.SearchRequest{             │   ││   │       Query:      "休假政策",                                        │   ││   │       MaxResults: 5,                                                │   ││   │       MinScore:   0.7,                                              │   ││   │   })                                                                │   ││   │                                                                     │   ││   └─────────────────────────────────────────────────────────────────────┘   ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘
2.2.2 数据源(Source)

框架支持多种数据源类型:

Source 类型说明适用场景
「FileSource」单个文件加载特定文档
「DirSource」目录下所有文件批量加载文档
「URLSource」网页内容爬取在线文档
「AutoSource」自动识别类型智能加载
// Source 接口定义type Source interface {    ReadDocuments(ctx context.Context) ([]*document.Document, error)    Name() string                    // 数据源名称(用于增量同步)    Type() string                    // 数据源类型    GetMetadata() map[string]any     // 元数据(用于生成文档 ID)}
2.2.3 文本分块(Chunking)

分块策略决定了文档如何被切分成适合检索的片段:

分块策略说明适用场景
「FixedChunking」固定大小分块通用场景
「RecursiveChunking」递归分块,按分隔符层级切分结构化文本
「MarkdownChunking」按 Markdown 标题层级切分Markdown 文档
「JSONChunking」按 JSON 结构切分JSON 数据
// Chunking 接口type Chunking interface {    Chunk(doc *document.Document) ([]*document.Document, error)}
2.2.4 向量存储(VectorStore)

框架支持多种向量数据库:

VectorStore特点适用场景
「InMemory」内存存储,重启丢失开发测试
「pgvector」PostgreSQL 扩展已有 PG 基础设施
「Milvus」专业向量数据库,高性能大规模生产环境
「Qdrant」轻量级向量数据库中小规模场景
「Elasticsearch」支持混合检索(向量+关键词)需要全文检索
「TCVector」腾讯云向量数据库腾讯云环境
// VectorStore 核心接口type VectorStore interface {    Add(ctx context.Context, doc *document.Document, embedding []float64) error    Get(ctx context.Context, id string) (*document.Document, error)    Update(ctx context.Context, doc *document.Document, embedding []float64) error    Delete(ctx context.Context, id string) error    Search(ctx context.Context, query *SearchQuery) ([]*SearchResult, error)    DeleteByFilter(ctx context.Context, opts ...DeleteOption) error    Count(ctx context.Context) (int, error)    GetMetadata(ctx context.Context, opts ...GetMetadataOption) (map[string]DocumentMetadata, error)}

2.3 知识库的同步更新

知识库的同步更新是 RAG 系统中的核心难题:如何高效地处理文档的新增、修改、删除,同时避免重复处理?

2.3.1 问题分析:为什么同步更新是难题?
┌──────────────────────────────────────────────────────────────────────────────┐│                    知识库同步更新的核心挑战                                      │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   场景描述:                                                                   ││   • 数据源:100 个 Markdown 文档                                               ││   • 向量库:已存储 500 个向量(每个文档分成 5 个 chunk)                         ││   • 变化:用户修改了 2 个文档,删除了 1 个文档,新增了 3 个文档                  ││                                                                              ││   ─────────────────────────────────────────────────────────────────────────  ││                                                                              ││   传统方案的问题:                                                             ││                                                                              ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │  方案 A:全量重建                                                   │    ││   │                                                                    │    ││   │  每次同步都:清空向量库 → 重新加载所有文档 → 重新生成向量              │    ││   │                                                                    │    ││   │  问题:                                                             │    ││   │  • ❌ 浪费计算资源(98 个未变化的文档白白重新处理)                   │    ││   │  • ❌ Embedding API 调用成本高                                      │    ││   │  • ❌ 同步期间知识库不可用                                          │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │  方案 B:按文件修改时间判断                                          │    ││   │                                                                    │    ││   │  比较文件的 mtime,只处理修改过的文件                                │    ││   │                                                                    │    ││   │  问题:                                                             │    ││   │  • ❌ URL 数据源没有 mtime                                          │    ││   │  • ❌ 跨系统同步时 mtime 可能不准                                    │    ││   │  • ❌ 无法检测"内容没变但文件被 touch 过"的情况                      │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              ││   框架采用的方案:基于内容哈希的增量同步                                        ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘
2.3.2 核心机制:基于内容哈希的文档 ID

框架的核心思路:「用文档内容生成唯一 ID,内容变了 ID 就变,内容没变 ID 就不变」。

┌──────────────────────────────────────────────────────────────────────────────┐│                    文档 ID 生成策略                                            │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   DocumentID = SHA256(                                                       ││       SourceName  +     // 数据源名称(区分不同来源的同名文件)                 ││       URI         +     // 文档路径/URL(区分同一来源的不同文件)               ││       Content     +     // 文档内容(核心:内容变了 ID 就变)                   ││       ChunkIndex  +     // 分块索引(区分同一文档的不同 chunk)                 ││       SourceMetadata    // 数据源元数据(用户自定义的过滤条件)                 ││   )                                                                          ││                                                                              ││   ─────────────────────────────────────────────────────────────────────────  ││                                                                              ││   举例说明:                                                                   ││                                                                              ││   文档 A:api-guide.md, chunk 0, 内容 = "# API 指南\n调用方式..."               ││   → ID = sha256("docs" + "api-guide.md" + "# API 指南..." + "0" + "{}")      ││   → ID = "a1b2c3d4e5f6..."                                                   ││                                                                              ││   ─────────────────────────────────────────────────────────────────────────  ││                                                                              ││   用户修改了 api-guide.md,内容变成 "# API 指南\n新的调用方式..."               ││   → ID = sha256("docs" + "api-guide.md" + "# API 指南\n新的..." + "0" + "{}")││   → ID = "f6e5d4c3b2a1..."   ← ID 变了!                                     ││                                                                              ││   ─────────────────────────────────────────────────────────────────────────  ││                                                                              ││   这样判断变化就变得简单:                                                      ││   • 新 ID 在向量库中不存在 → 新文档或内容有变化,需要处理                        ││   • 新 ID 在向量库中已存在 → 内容没变,跳过                                     ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘

「代码实现」:

// generateDocumentID 生成文档唯一 IDfunc generateDocumentID(sourceName, uri, content string, chunkIndex int, sourceMetadata map[string]any) string {    hasher := sha256.New()        hasher.Write([]byte(sourceName))    hasher.Write([]byte(":"))    hasher.Write([]byte(uri))    hasher.Write([]byte(":"))    hasher.Write([]byte(content))                      // 关键:内容参与哈希    hasher.Write([]byte(":"))    hasher.Write([]byte(strconv.Itoa(chunkIndex)))        // 元数据排序后序列化,保证相同元数据生成相同哈希    iflen(sourceMetadata) > 0 {        keys := make([]string, 0, len(sourceMetadata))        for k := range sourceMetadata {            keys = append(keys, k)        }        sort.Strings(keys)        for _, k := range keys {            hasher.Write([]byte(k))            hasher.Write([]byte(fmt.Sprintf("%v", sourceMetadata[k])))        }    }        return hex.EncodeToString(hasher.Sum(nil))}
2.3.3 增量同步流程详解

启用增量同步:

kb := knowledge.New(    knowledge.WithEnableSourceSync(true),  // 关键配置    knowledge.WithVectorStore(vectorStore),    knowledge.WithEmbedder(embedder),)

「调用 Load() 时的完整流程」:

┌──────────────────────────────────────────────────────────────────────────────┐│                       Load() 增量同步流程详解                                   │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││ 步骤 1:构建"向量库现有文档"的索引                                              ││ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ││                                                                              ││   refreshAllDocInfo()                                                        ││   │                                                                          ││   │   从 VectorStore 获取所有已存在文档的元数据                                ││   │   ┌─────────────────────────────────────────────────────────────────┐   ││   │   │  vectorStore.GetMetadata(ctx)                                   │   ││   │   │  返回: { "a1b2c3...": {URI, SourceName, ChunkIndex}, ... }      │   ││   │   └─────────────────────────────────────────────────────────────────┘   ││   │                                                                          ││   └──► 构建三个缓存 Map:                                                     ││        • cacheMetaInfo:   {文档ID → 文档信息}     // 按 ID 索引               ││        • cacheURIInfo:    {URI → [文档信息列表]}   // 按文件路径索引           ││        • cacheSourceInfo: {数据源名 → [文档信息]} // 按数据源索引              ││                                                                              ││ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ││                                                                              ││ 步骤 2:遍历数据源,处理每个文档                                                 ││ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ││                                                                              ││   for 每个数据源中的每个 chunk:                                                 ││   │                                                                          ││   │   1. 生成文档 ID(基于内容哈希)                                           ││   │      docID = generateDocumentID(sourceName, uri, content, chunkIdx, meta)││   │                                                                          ││   │   2. 调用 shouldProcessDocument(doc) 判断是否需要处理                      ││   │      ┌─────────────────────────────────────────────────────────────┐    ││   │      │                                                             │    ││   │      │   检查 1:docID 是否已在 processedDocIDs 中?                │    ││   │      │           → 是:跳过(本次同步已处理过)                      │    ││   │      │                                                             │    ││   │      │   检查 2:docID 是否已在 processingDocIDs 中?               │    ││   │      │           → 是:跳过(其他协程正在处理)                      │    ││   │      │                                                             │    ││   │      │   检查 3:该 URI 是否在向量库中存在?                         │    ││   │      │           → 否:新文件,需要处理 ✅                          │    ││   │      │                                                             │    ││   │      │   检查 4:向量库中该 URI 的文档 ID 是否与新 ID 相同?         │    ││   │      │           → 是:内容没变,跳过 ⏭️                           │    ││   │      │           → 否:内容变了,需要处理 ✅                         │    ││   │      │                                                             │    ││   │      └─────────────────────────────────────────────────────────────┘    ││   │                                                                          ││   │   3. 如果需要处理:                                                       ││   │      → 生成 Embedding                                                    ││   │      → 存入 VectorStore(会覆盖旧的同 URI 文档)                          ││   │      → processedDocIDs.Store(docID)  // 标记为已处理                      ││   │                                                                          ││   └──► 处理完成                                                               ││                                                                              ││ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ││                                                                              ││ 步骤 3:清理孤儿文档(处理删除场景)                                             ││ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ││                                                                              ││   cleanupOrphanDocuments()                                                   ││   │                                                                          ││   │   "孤儿文档" = 向量库中存在,但本次同步没有处理到的文档                      ││   │                                                                          ││   │   产生原因:                                                              ││   │   • 用户删除了源文件 → 该文件的 chunk 不会被遍历到                          ││   │   • 用户修改了文件 → 旧 ID 的 chunk 不会被标记为 processed                 ││   │                                                                          ││   │   处理逻辑:                                                              ││   │   ┌─────────────────────────────────────────────────────────────────┐   ││   │   │  toDelete = []                                                  │   ││   │   │  for docID in cacheMetaInfo:         // 向量库中的所有文档       │   ││   │   │      if docID not in processedDocIDs: // 本次没处理到            │   ││   │   │          toDelete.append(docID)                                 │   ││   │   │                                                                 │   ││   │   │  vectorStore.DeleteByFilter(toDelete)  // 批量删除              │   ││   │   └─────────────────────────────────────────────────────────────────┘   ││   │                                                                          ││   └──► 清理完成                                                               ││                                                                              ││ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ││                                                                              ││ 步骤 4:刷新缓存                                                                ││ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ││                                                                              ││   refreshAllDocInfo()                                                        ││   → 重新从 VectorStore 获取元数据,更新缓存为最新状态                           ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘
2.3.4 三种变化场景的处理
┌──────────────────────────────────────────────────────────────────────────────┐│                    场景一:文档内容更新                                          │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   原文档:api-guide.md                                                        ││   原内容:"# API 指南\n旧内容..."                                              ││   原 ID:a1b2c3...                                                           ││                                                                              ││   修改后内容:"# API 指南\n新内容..."                                          ││   新 ID:f6e5d4...(内容变了,ID 变了)                                        ││                                                                              ││   同步流程:                                                                   ││   1. refreshAllDocInfo() → cacheURIInfo["api-guide.md"] = [{ID: a1b2c3...}] ││   2. 遍历到 api-guide.md,生成新 ID = f6e5d4...                               ││   3. shouldProcessDocument() 检查:                                           ││      - URI "api-guide.md" 存在于 cacheURIInfo ✓                              ││      - 但新 ID f6e5d4... ≠ 旧 ID a1b2c3...                                   ││      - → 返回 true,需要处理                                                   ││   4. 生成 Embedding,存入向量库(新 ID)                                        ││   5. processedDocIDs.Store("f6e5d4...")                                      ││   6. cleanupOrphanDocuments():                                               ││      - a1b2c3... 在 cacheMetaInfo 中 ✓                                       ││      - a1b2c3... 不在 processedDocIDs 中 ✓                                   ││      - → 删除 a1b2c3...(旧版本)                                             ││                                                                              ││   结果:旧向量被删除,新向量被添加                                               ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘┌──────────────────────────────────────────────────────────────────────────────┐│                    场景二:新增文档                                              │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   新增文件:new-feature.md                                                    ││                                                                              ││   同步流程:                                                                   ││   1. refreshAllDocInfo() → cacheURIInfo 中没有 "new-feature.md"              ││   2. 遍历到 new-feature.md,生成 ID = x1y2z3...                               ││   3. shouldProcessDocument() 检查:                                           ││      - URI "new-feature.md" 不存在于 cacheURIInfo                            ││      - → 返回 true,需要处理(新文件)                                         ││   4. 生成 Embedding,存入向量库                                                ││   5. processedDocIDs.Store("x1y2z3...")                                      ││                                                                              ││   结果:新向量被添加                                                           ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘┌──────────────────────────────────────────────────────────────────────────────┐│                    场景三:删除文档                                              │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   删除文件:old-doc.md(用户在文件系统中删除了这个文件)                          ││   向量库中存在:old-doc.md 的 3 个 chunk,ID 分别为 p1q2r3, s4t5u6, v7w8x9    ││                                                                              ││   同步流程:                                                                   ││   1. refreshAllDocInfo() → cacheMetaInfo 包含 {p1q2r3, s4t5u6, v7w8x9}       ││   2. 遍历数据源:old-doc.md 已被删除,不会被遍历到                               ││   3. processedDocIDs 中不会有 p1q2r3, s4t5u6, v7w8x9                         ││   4. cleanupOrphanDocuments():                                               ││      - p1q2r3 在 cacheMetaInfo 中 ✓,不在 processedDocIDs 中 ✓ → 删除        ││      - s4t5u6 在 cacheMetaInfo 中 ✓,不在 processedDocIDs 中 ✓ → 删除        ││      - v7w8x9 在 cacheMetaInfo 中 ✓,不在 processedDocIDs 中 ✓ → 删除        ││                                                                              ││   结果:旧文档的所有向量被清理                                                   ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘
2.3.5 同步触发时机:框架不会自动同步

「重要说明」:框架本身**「没有内置定时同步功能」**,Load() 方法需要用户主动调用。

┌──────────────────────────────────────────────────────────────────────────────┐│                    同步触发时机                                                  │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   框架设计理念:                                                                 ││   • 框架只提供同步能力,不强制同步策略                                            ││   • 何时同步、多久同步一次,由用户根据业务场景决定                                 ││   • 这样设计更灵活,适应不同的使用场景                                            ││                                                                              ││   ─────────────────────────────────────────────────────────────────────────  ││                                                                              ││   常见的同步触发方式:                                                           ││                                                                              ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │  方式 1:服务启动时同步(最常见)                                     │    ││   │                                                                    │    ││   │  func main() {                                                     │    ││   │      kb := knowledge.New(...)                                      │    ││   │      if err := kb.Load(ctx); err != nil {  // 启动时加载            │    ││   │          log.Fatalf("load knowledge failed: %v", err)              │    ││   │      }                                                             │    ││   │      // 启动服务...                                                 │    ││   │  }                                                                 │    ││   │                                                                    │    ││   │  适用场景:文档变化不频繁,可以接受重启才能看到新文档                   │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │  方式 2:定时同步(推荐)                                            │    ││   │                                                                    │    ││   │  // 启动后台 goroutine 定时同步                                     │    ││   │  go func() {                                                       │    ││   │      ticker := time.NewTicker(1 * time.Hour) // 每小时同步一次       │    ││   │      defer ticker.Stop()                                           │    ││   │      for range ticker.C {                                          │    ││   │          if err := kb.Load(ctx); err != nil {                      │    ││   │              log.Errorf("sync failed: %v", err)                    │    ││   │          }                                                         │    ││   │      }                                                             │    ││   │  }()                                                               │    ││   │                                                                    │    ││   │  适用场景:需要定期更新知识库,但不需要实时                            │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │  方式 3:事件驱动同步                                                │    ││   │                                                                    │    ││   │  // 监听文件变化事件(如使用 fsnotify)                               │    ││   │  watcher.Events <- func(event fsnotify.Event) {                    │    ││   │      if event.Op&fsnotify.Write == fsnotify.Write {                │    ││   │          kb.Load(ctx)  // 文件变化时触发同步                         │    ││   │      }                                                             │    ││   │  }                                                                 │    ││   │                                                                    │    ││   │  // 或者通过消息队列接收同步信号                                      │    ││   │  for msg := range syncChannel {                                    │    ││   │      kb.Load(ctx)                                                  │    ││   │  }                                                                 │    ││   │                                                                    │    ││   │  适用场景:需要近实时更新,对延迟敏感                                  │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │  方式 4:API 触发同步                                                │    ││   │                                                                    │    ││   │  // 提供管理接口,允许手动触发同步                                    │    ││   │  http.HandleFunc("/admin/sync", func(w http.ResponseWriter, r) {   │    ││   │      if err := kb.Load(ctx); err != nil {                          │    ││   │          http.Error(w, err.Error(), 500)                           │    ││   │          return                                                    │    ││   │      }                                                             │    ││   │      w.Write([]byte("sync completed"))                             │    ││   │  })                                                                │    ││   │                                                                    │    ││   │  适用场景:运维人员需要手动控制同步时机                                │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘

2.4 知识检索流程详解

知识检索是 RAG 系统的核心环节。用户的查询如何转化为最相关的文档?本节详细剖析检索的完整流程。

2.4.1 检索流程总览
┌──────────────────────────────────────────────────────────────────────────────┐│                    Search() 检索流程详解                                       │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   用户调用 kb.Search(ctx, &SearchRequest{Query: "如何请年假"})                 ││                                                                              ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │                                                                    │    ││   │  Step 1: 查询增强(Query Enhancement)                              │    ││   │  ────────────────────────────────────────────────────────────────  │    ││   │  "如何请年假" → "2024年公司员工年假申请流程 休假政策 请假系统"        │    ││   │                                                                    │    ││   │  作用:扩展查询语义,提高召回率                                      │    ││   │  组件:QueryEnhancer(可选,默认 Passthrough 不做处理)              │    ││   │                                                                    │    ││   └────────────────────────────────────────────────────────────────────┘    ││                          │                                                   ││                          ▼                                                   ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │                                                                    │    ││   │  Step 2: 查询向量化(Query Embedding)                              │    ││   │  ────────────────────────────────────────────────────────────────  │    ││   │  "2024年公司员工年假申请流程..." → [0.12, -0.34, 0.56, ...]        │    ││   │                                                                    │    ││   │  作用:将文本转为向量,用于相似度计算                                │    ││   │  组件:Embedder(OpenAI/Ollama/HuggingFace 等)                    │    ││   │                                                                    │    ││   └────────────────────────────────────────────────────────────────────┘    ││                          │                                                   ││                          ▼                                                   ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │                                                                    │    ││   │  Step 3: 向量检索(Vector Search)                                  │    ││   │  ────────────────────────────────────────────────────────────────  │    ││   │  在向量库中计算余弦相似度,返回 Top-K 最相似的文档                   │    ││   │                                                                    │    ││   │  支持多种搜索模式:                                                  │    ││   │  • SearchModeVector  - 纯向量搜索(默认)                           │    ││   │  • SearchModeKeyword - 纯关键词搜索                                 │    ││   │  • SearchModeHybrid  - 混合搜索(向量 + 关键词)                    │    ││   │  • SearchModeFilter  - 纯过滤(不做相似度计算)                     │    ││   │                                                                    │    ││   │  组件:VectorStore(Milvus/pgvector/Qdrant/ES 等)                 │    ││   │                                                                    │    ││   └────────────────────────────────────────────────────────────────────┘    ││                          │                                                   ││                          ▼                                                   ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │                                                                    │    ││   │  Step 4: 结果重排序(Reranking)                                    │    ││   │  ────────────────────────────────────────────────────────────────  │    ││   │  用更精细的模型对 Top-K 结果重新排序                                 │    ││   │                                                                    │    ││   │  作用:提高精度,向量召回的可能不是最相关的排在最前面                 │    ││   │  组件:Reranker(TopK/Cohere/Infinity 等,可选)                    │    ││   │                                                                    │    ││   └────────────────────────────────────────────────────────────────────┘    ││                          │                                                   ││                          ▼                                                   ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │                                                                    │    ││   │  Step 5: 返回结果                                                   │    ││   │  ────────────────────────────────────────────────────────────────  │    ││   │  返回 SearchResult,包含最相关的文档及其相似度分数                   │    ││   │                                                                    │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘
2.4.2 核心代码实现

「Retriever.Retrieve() - 检索器的核心逻辑」:

// Retrieve 执行完整的 RAG 检索流程func (dr *DefaultRetriever) Retrieve(ctx context.Context, q *Query) (*Result, error) {    // Step 1: 查询增强(如果配置了 QueryEnhancer)    finalQuery := q.Text    if dr.queryEnhancer != nil {        queryReq := &query.Request{            Query:     q.Text,            History:   q.History,    // 可以利用历史对话上下文            UserID:    q.UserID,            SessionID: q.SessionID,        }        enhanced, err := dr.queryEnhancer.EnhanceQuery(ctx, queryReq)        if err != nil {            returnnil, err        }        finalQuery = enhanced.Enhanced  // 使用增强后的查询    }    // Step 2: 查询向量化    var embedding []float64    if dr.embedder != nil && finalQuery != "" {        var err error        embedding, err = dr.embedder.GetEmbedding(ctx, finalQuery)        if err != nil {            returnnil, err        }    }    // Step 3: 向量检索    searchResults, err := dr.vectorStore.Search(ctx, &vectorstore.SearchQuery{        Query:      finalQuery,       // 原始查询文本(用于混合搜索)        Vector:     embedding,        // 查询向量        Limit:      q.Limit,          // 返回数量限制        MinScore:   q.MinScore,       // 最小相似度阈值        Filter:     convertFilter(q.Filter),  // 过滤条件        SearchMode: q.SearchMode,     // 搜索模式    })    if err != nil {        returnnil, err    }    // Step 4: 结果重排序(如果配置了 Reranker)    rerankerResults := convertToRerankerFormat(searchResults)    if dr.reranker != nil {        rerankerResults, err = dr.reranker.Rerank(ctx, &reranker.Query{            Text:       q.Text,       // 原始查询            FinalQuery: finalQuery,   // 增强后的查询            History:    q.History,        }, rerankerResults)        if err != nil {            returnnil, err        }    }    // Step 5: 返回结果    return &Result{        Documents: convertToFinalFormat(rerankerResults),    }, nil}
2.4.3 搜索模式详解

框架支持四种搜索模式,适用于不同场景:

┌──────────────────────────────────────────────────────────────────────────────┐│                    四种搜索模式对比                                             │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   SearchModeVector(向量搜索)                                                 ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │  原理:计算查询向量与文档向量的余弦相似度                             │    ││   │  优点:语义理解强,"年假" 能匹配到 "休假申请"                         │    ││   │  缺点:对精确关键词不敏感                                            │    ││   │  适用:大多数语义搜索场景                                            │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              ││   SearchModeKeyword(关键词搜索)                                              ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │  原理:基于 BM25 等算法的传统关键词匹配                               │    ││   │  优点:对精确关键词敏感,搜 "API-V2.1" 能精确匹配                     │    ││   │  缺点:语义理解弱,"年假" 无法匹配 "休假"                             │    ││   │  适用:技术文档、代码搜索等需要精确匹配的场景                          │    ││   │  要求:向量库需支持全文索引(如 ES、开启 TSVector 的 pgvector)        │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              ││   SearchModeHybrid(混合搜索)                                                 ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │  原理:同时执行向量搜索和关键词搜索,融合两者结果                      │    ││   │  优点:兼顾语义理解和关键词精确性                                     │    ││   │  缺点:计算开销较大                                                  │    ││   │  适用:对召回率和精确度都有要求的场景                                 │    ││   │  要求:向量库需同时支持向量搜索和全文搜索                             │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              ││   SearchModeFilter(过滤搜索)                                                 ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │  原理:只根据元数据过滤,不做相似度计算                               │    ││   │  优点:性能最高                                                      │    ││   │  缺点:无法按相关性排序                                              │    ││   │  适用:已知文档 ID 或按标签筛选的场景                                 │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘

「使用示例」:

// 向量搜索(默认)result, err := kb.Search(ctx, &knowledge.SearchRequest{    Query:      "如何请年假",    MaxResults: 5,    SearchMode: vectorstore.SearchModeVector,})// 混合搜索result, err := kb.Search(ctx, &knowledge.SearchRequest{    Query:      "API-V2.1 调用示例",    MaxResults: 5,    SearchMode: vectorstore.SearchModeHybrid,})// 带过滤条件的搜索result, err := kb.Search(ctx, &knowledge.SearchRequest{    Query:      "部署流程",    MaxResults: 5,    SearchFilter: &knowledge.SearchFilter{        Metadata: map[string]any{            "doc_type": "运维手册",            "version":  "v2",        },    },})
2.4.4 查询增强器(Query Enhancer)

查询增强器用于在检索前优化用户的原始查询,提高召回率。

┌──────────────────────────────────────────────────────────────────────────────┐│                    查询增强的作用                                               │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   问题:用户查询往往很简短或口语化,难以召回最相关的文档                          ││                                                                              ││   示例:                                                                       ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │                                                                    │    ││   │   用户查询:"年假怎么请"                                            │    ││   │                                                                    │    ││   │   直接检索可能问题:                                                 │    ││   │   • 文档中用的是 "休假申请"、"请假流程" 等正式表述                    │    ││   │   • 向量相似度可能不够高,召回不理想                                  │    ││   │                                                                    │    ││   │   增强后查询:"2024年 公司 员工 年假 休假 申请 流程 请假 系统 规定"  │    ││   │                                                                    │    ││   │   增强效果:                                                         │    ││   │   • 扩展了同义词和相关词                                            │    ││   │   • 向量覆盖更广的语义空间                                          │    ││   │   • 召回率显著提升                                                  │    ││   │                                                                    │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘

「框架内置的查询增强器」:

增强器说明适用场景
「PassthroughEnhancer」不做任何处理,直接返回原查询默认,简单场景
「LLM-based Enhancer」用 LLM 扩展查询(需自己实现)高质量需求场景

「自定义查询增强器示例」:

// 实现 Enhancer 接口type LLMQueryEnhancer struct {    llm model.ChatModel}func (e *LLMQueryEnhancer) EnhanceQuery(ctx context.Context, req *query.Request) (*query.Enhanced, error) {    // 构建 prompt,让 LLM 扩展查询    prompt := fmt.Sprintf(`请将以下用户查询扩展为更完整的搜索查询,添加同义词和相关术语:用户查询:%s扩展查询:`, req.Query)        resp, err := e.llm.Generate(ctx, prompt)    if err != nil {        returnnil, err    }        return &query.Enhanced{        Enhanced: resp.Content,        Keywords: extractKeywords(resp.Content),    }, nil}// 使用自定义增强器kb := knowledge.New(    knowledge.WithQueryEnhancer(&LLMQueryEnhancer{llm: myLLM}),    // ... 其他配置)
2.4.5 结果重排序器(Reranker)

向量检索的 Top-K 结果不一定是最相关的,Reranker 用更精细的模型重新排序。

┌──────────────────────────────────────────────────────────────────────────────┐│                    Reranker 的作用                                            │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   向量检索后的 Top-10 结果(按向量相似度排序):                                  ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │  1. 员工福利政策总览.md           相似度: 0.89                       │    ││   │  2. 2024年休假管理办法.md         相似度: 0.87  ← 实际最相关         │    ││   │  3. 公司规章制度汇编.md           相似度: 0.85                       │    ││   │  4. HR系统使用指南.md             相似度: 0.82                       │    ││   │  5. 请假申请流程说明.md           相似度: 0.80  ← 也很相关          │    ││   │  ...                                                                │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              ││   Rerank 后的结果(按精细模型重新排序):                                        ││   ┌────────────────────────────────────────────────────────────────────┐    ││   │  1. 2024年休假管理办法.md         得分: 0.95  ← 提升到第一           │    ││   │  2. 请假申请流程说明.md           得分: 0.92  ← 提升到第二           │    ││   │  3. 员工福利政策总览.md           得分: 0.78                         │    ││   │  4. HR系统使用指南.md             得分: 0.65                         │    ││   │  5. 公司规章制度汇编.md           得分: 0.52                         │    ││   │  ...                                                                │    ││   └────────────────────────────────────────────────────────────────────┘    ││                                                                              ││   原理:                                                                       ││   • 向量检索是"召回"阶段,追求覆盖面                                           ││   • Reranker 是"精排"阶段,追求精确度                                         ││   • Reranker 通常用 Cross-Encoder 模型,同时输入 query 和 document 计算得分    ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘

「框架内置的 Reranker」:

Reranker说明特点
「TopK」简单截取 Top-K,不重新排序默认,无额外开销
「Cohere」使用 Cohere Rerank API高精度,需要 API Key
「Infinity」使用 Infinity Rerank 服务可自部署

「配置 Reranker 示例」:

import "trpc.group/trpc-go/trpc-agent-go/knowledge/reranker/cohere"// 使用 Cohere RerankercohereReranker := cohere.New(    cohere.WithAPIKey("your-api-key"),    cohere.WithModel("rerank-multilingual-v3.0"),    cohere.WithTopN(5),  // 重排后返回 Top 5)kb := knowledge.New(    knowledge.WithReranker(cohereReranker),    // ... 其他配置)

2.5 知识库与会话的集成

2.5.1 集成方式概览
┌──────────────────────────────────────────────────────────────────────────────┐│                    知识库与 Agent 的集成方式                                    │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   方式 1:作为 Tool 集成(推荐)                                                ││   ┌─────────────────────────────────────────────────────────────────────┐   ││   │                                                                     │   ││   │   知识库 ──► 封装为 Tool ──► 注册到 Agent ──► LLM 决定何时调用        │   ││   │                                                                     │   ││   │   优点:                                                             │   ││   │   • LLM 自主判断是否需要检索                                         │   ││   │   • 支持多知识库,LLM 选择合适的                                     │   ││   │   • 与其他 Tool 统一管理                                            │   ││   │                                                                     │   ││   └─────────────────────────────────────────────────────────────────────┘   ││                                                                              ││   方式 2:自动注入上下文                                                       ││   ┌─────────────────────────────────────────────────────────────────────┐   ││   │                                                                     │   ││   │   用户问题 ──► 自动检索 ──► 检索结果注入 System Prompt ──► LLM 回答  │   ││   │                                                                     │   ││   │   优点:                                                             │   ││   │   • 每次都检索,不遗漏                                               │   ││   │   适用:知识库范围明确,所有问题都需要参考                            │   ││   │                                                                     │   ││   └─────────────────────────────────────────────────────────────────────┘   ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘
2.5.2 方式一:作为 Tool 集成
// 创建知识搜索 ToolsearchTool := tool.NewKnowledgeSearchTool(    kb,  // 知识库实例    tool.WithToolName("search_company_docs"),    tool.WithToolDescription("搜索公司内部文档,包括政策、规范、技术文档等"),    tool.WithMaxResults(5),    tool.WithMinScore(0.7),)// 注册到 Agentagent := llmagent.New(    llmagent.WithModel(model),    llmagent.WithTools(searchTool),  // 注册知识搜索 Tool)

「Tool 定义结构」:

// KnowledgeSearchRequest Tool 的输入参数type KnowledgeSearchRequest struct {    Query string `json:"query" jsonschema:"description=搜索查询语句"`}// KnowledgeSearchResponse Tool 的输出type KnowledgeSearchResponse struct {    Documents []*DocumentResult `json:"documents"`    Message   string            `json:"message,omitempty"`}

「LLM 看到的 Tool 定义」:

{  "name": "search_company_docs","description": "搜索公司内部文档,包括政策、规范、技术文档等","parameters": {    "type": "object",    "properties": {      "query": {        "type": "string",        "description": "搜索查询语句"      }    },    "required": ["query"]  }}
2.5.3 多知识库管理
┌──────────────────────────────────────────────────────────────────────────────┐│                    多知识库场景                                                │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   场景:企业有多个知识库,需要 LLM 选择合适的                                   ││                                                                              ││   ┌─────────────────────────────────────────────────────────────────────┐   ││   │                                                                     │   ││   │   知识库 1:公司政策文档                                             │   ││   │   知识库 2:技术 API 文档                                           │   ││   │   知识库 3:产品使用手册                                            │   ││   │                                                                     │   ││   │   每个知识库封装为独立 Tool:                                        │   ││   │   • search_policy_docs   - "搜索公司政策、HR相关文档"                │   ││   │   • search_api_docs      - "搜索技术API文档、开发规范"               │   ││   │   • search_product_docs  - "搜索产品使用手册、FAQ"                   │   ││   │                                                                     │   ││   │   LLM 根据用户问题选择:                                             │   ││   │   • "年假怎么请?" → 调用 search_policy_docs                        │   ││   │   • "getUserInfo 接口参数?" → 调用 search_api_docs                 │   ││   │   • "如何重置密码?" → 调用 search_product_docs                     │   ││   │                                                                     │   ││   └─────────────────────────────────────────────────────────────────────┘   ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘
``````plaintext
// 多知识库配置示例policyKB := knowledge.New(/* 政策文档配置 */)apiKB := knowledge.New(/* API 文档配置 */)productKB := knowledge.New(/* 产品手册配置 */)// 创建多个 ToolpolicyTool := tool.NewKnowledgeSearchTool(policyKB,    tool.WithToolName("search_policy_docs"),    tool.WithToolDescription("搜索公司政策、HR相关、行政规定等文档"),)apiTool := tool.NewKnowledgeSearchTool(apiKB,    tool.WithToolName("search_api_docs"),    tool.WithToolDescription("搜索技术API文档、开发规范、架构设计等"),)productTool := tool.NewKnowledgeSearchTool(productKB,    tool.WithToolName("search_product_docs"),    tool.WithToolDescription("搜索产品使用手册、操作指南、常见问题等"),)// 全部注册到 Agentagent := llmagent.New(    llmagent.WithModel(model),    llmagent.WithTools(policyTool, apiTool, productTool),)
2.5.4 动态过滤:AgenticFilterSearchTool

框架提供了更高级的 AgenticFilterSearchTool,让 LLM 可以动态指定过滤条件:

// 创建支持动态过滤的搜索 ToolfilterTool := tool.NewAgenticFilterSearchTool(    kb,    tool.WithToolName("search_docs"),    tool.WithToolDescription("搜索文档,支持按类型、日期等过滤"),    tool.WithAgenticFilterableFields([]tool.FilterableField{        {Name: "doc_type", Description: "文档类型:policy/api/product"},        {Name: "create_date", Description: "创建日期,格式 YYYY-MM-DD"},    }),)

「LLM 看到的 Tool 定义」:

{  "name": "search_docs","description": "搜索文档,支持按类型、日期等过滤","parameters": {    "type": "object",    "properties": {      "query": { "type": "string", "description": "搜索查询语句" },      "filters": {        "type": "object",        "properties": {          "doc_type": { "type": "string", "description": "文档类型:policy/api/product" },          "create_date": { "type": "string", "description": "创建日期,格式 YYYY-MM-DD" }        }      }    }  }}

「LLM 调用示例」:

{  "name": "search_docs",  "arguments": {    "query": "请假流程",    "filters": {      "doc_type": "policy",      "create_date": "2024-01-01"    }  }}
2.5.5 运行时过滤

除了 LLM 动态过滤,还支持在 Agent 运行时注入过滤条件:

// 在调用时注入过滤条件resp, err := agent.Run(ctx, "请假流程是什么?",    agent.WithKnowledgeFilter(map[string]any{        "department": "engineering",  // 只搜索工程部门的文档    }),)

「过滤条件的优先级和合并」:

┌──────────────────────────────────────────────────────────────────────────────┐│                    过滤条件合并逻辑                                            │├──────────────────────────────────────────────────────────────────────────────┤│                                                                              ││   最终过滤 = Tool静态过滤 AND Tool动态过滤 AND 运行时过滤                       ││                                                                              ││   ┌─────────────────────────────────────────────────────────────────────┐   ││   │                                                                     │   ││   │   1. Tool 静态过滤(WithFilter)                                    │   ││   │      → 创建 Tool 时固定的过滤条件                                    │   ││   │      → 例如:只搜索 status=active 的文档                            │   ││   │                                                                     │   ││   │   2. Tool 动态过滤(AgenticFilterSearchTool)                        │   ││   │      → LLM 调用时指定的过滤条件                                      │   ││   │      → 例如:doc_type=policy                                        │   ││   │                                                                     │   ││   │   3. 运行时过滤(WithKnowledgeFilter)                               │   ││   │      → Agent.Run() 时注入的过滤条件                                  │   ││   │      → 例如:department=engineering                                 │   ││   │                                                                     │   ││   │   三者用 AND 合并                                                    │   ││   │                                                                     │   ││   └─────────────────────────────────────────────────────────────────────┘   ││                                                                              │└──────────────────────────────────────────────────────────────────────────────┘

2.6 最佳实践

2.6.1 分块策略选择
文档类型推荐分块策略参数建议
通用文本RecursiveChunkingchunk_size=500, overlap=50
MarkdownMarkdownChunking按标题层级切分
代码文件RecursiveChunkingchunk_size=1000, 按函数分割
JSON/结构化JSONChunking按对象切分
2.6.2 向量存储选择
场景推荐存储原因
开发测试InMemory快速启动,无需依赖
小规模生产Qdrant轻量级,易部署
大规模生产Milvus高性能,支持分布式
已有 PGpgvector复用现有基础设施
需要全文检索Elasticsearch混合检索能力
2.6.3 知识库设计建议
  1. 「按领域划分知识库」:不同领域的文档放入不同知识库,提高检索精度
  2. 「合理设置 MinScore」:根据业务需求调整阈值,避免返回不相关结果
  3. 「启用增量同步」:生产环境建议启用,减少重复计算
  4. 「使用 Reranker」:对检索结果进行二次排序,提高准确性
  5. 「添加元数据」:为文档添加丰富的元数据,支持精确过滤

— 3. 总结

问题方案
「怎么建立知识库?」配置 Source + Embedder + VectorStore,调用 Load()
「怎么同步更新?」启用 WithEnableSourceSync(true),基于内容哈希增量同步
「怎么检索?」调用 Search(),支持向量/关键词/混合搜索模式
「怎么提高检索精度?」使用 QueryEnhancer 增强查询 + Reranker 重排序结果
「怎么集成到会话?」封装为 Tool,LLM 自主决定调用时机和目标知识库
「怎么知道调哪个知识库?」通过 Tool 描述让 LLM 理解各知识库的用途
「怎么动态过滤?」使用 AgenticFilterSearchTool 或运行时注入过滤条件

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

在这里插入图片描述

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

用AI学习graphify Graphify是一个AI驱动的知识图谱构建工具,能够将代码、文档、论文、图像和视频等多模态数据转换为结构化知识图谱。其核心技术特点包括: 多模态处理能力: 支持25+编程语言的AST解析 处理PDF、Markdown等文档 集成Whisper进行音视频转录 高效知识提取: 采用确定性AST解析与LLM语义提取结合 相比直接读取源文件,查询token消耗最多减少71.5倍 增量更新机制仅处理变更文件 智能分析功能: 自动识别高中心性的"上帝节点" 发现跨领域的"意外连接&quo 阅读详情

相关推荐

到底什么是Harness工程?一篇文章从入门到企业落地全解析

随着OpenClaw爆火,Harness Engineering(驾驭工程)成为AI编程时代的热门概念,很多小白对其感到陌生。本文用通俗类比和真实案例,避开复杂术语,从基础定义入手,讲清Harness Engineering的核心逻辑——人类工程师设计“约束系统”(马具),让AI模型(烈马)安全高效地完成代码工作,同时拆解其核心组件、企业落地场景和实战成果,帮小白快速入门,读懂这项能解放人力、提升效率的新技术,轻松掌握它的核心价值和落地思路。

program哲学 3270

基于RAG的企业智能客服项目,已拿70万offer!

基于 RAG 构建一套企业智能客服系统📖。

m0_59164520的博客 1445

Android 面试题 Handler篇

1.Handler的实现原理。

ViewHandKownHealth的博客 955

从Vibe Coding到可控生产力:Harness Engineering的实践启示

摘要:OpenAI提出的Harness Engineering(工程化治理)理念为AI Agent时代的软件工程提供了关键方法论,旨在解决代码高产出下的质量闭环、上下文管理等核心矛盾。其三大目标包括重构工程师角色、将AI纳入可控体系、实现低成本纠错,通过六大举措(如角色重构、机械化约束、反熵机制等)重构工程流程。该理念与vibe coding高度互补,既保留灵感驱动的敏捷性,又通过工程化体系保障稳定性,最终推动工程师从"代码生产者"升级为"工程体系设计者"。

小程故事多的博客 4400

向NCBI上传16S rDNA数据的操作详解

专门介绍向NCBI上传16S rDNA数据的方法不太多。因为自己有上传数据的需要,所以决定边摸索边写下操作流程。如果这篇博文交代了上传步骤以及一些描述文件属性的书写,帮到你的话,还请点赞收藏。

yue81560的博客 2万+

信号与系统——卷积、相关运算与FFT关系以及工程应用(三)

卷积运算、相关运算

qq_35028634的博客 6612

Agent 设计模式全攻略(非常详细),20个大厂方案从入门到精通,收藏这一篇就够了!

很多产品经理一听 Agent 就觉得是 AI 加强版,随便套个 Chatbot 就算完事。但你翻开字节、阿里、腾讯的技术博客,会发现他们讲的 Agent 和你理解的完全不是一个东西。大厂的 Agent 不是一个对话框,而是一套复杂的任务执行系统,核心在于规划、调度、验证。

m0_59164520的博客 1308

手把手教你排查Abaqus中的Johnson-Cook损伤参数:避免因d3正负号导致的仿真失败

本文详细解析了Abaqus中Johnson-Cook损伤参数d3正负号设置的关键问题,帮助用户避免因参数错误导致的仿真失败和Excessive distortion报错。通过对比不同文献定义、提供实操指南和典型错误排查流程,有效提升非线性分析的准确性和效率。

weixin_33960567的博客 355

AI Agent 系统开发全攻略(非常详细),借助 AI Coding 从入门到精通,收藏这一篇就够了!

在AI驱动的电商运营时代,如何让运营同学通过自然语言快速生成个性化购物场景,并自动关联优质商品搭建会场,成为提升运营效率的关键问题。购物场景生成AI Agent应运而生,通过智能化的场景生成和商品匹配,让运营可以用一句话,就能自动生成包含场景标题、描述、一二级标签的完整购物场景,并智能查询热点知识库,关联相关商品,对商品进行信息补全和相关性过滤,最终快速对接会场搭建来产出一个完整的场景导购会场。

m0_59163425的博客 1043

IPD的分析工具与模型(十六)CBB公用基础模块管理实现资源共享,缩短开发周期降低成本

CBB流程的开发环节,基于CBB规划中所识别和设计的CBB,进行CBB的详细设计(包括参数设计和接口设计),并最终实现CBB的落地开发。作为特殊类型的技术构件,CBB的开发流程,可沿用技术开发中的构件开发流程,具体包括概念、计划、开发和迁移等步骤,具体可参见前文的相关介绍。有了蓝图与架构设计,落地实施是关键攻坚。具体工作内容包括:具体工作内容包括:a. 以相似性、聚类、相对独行性、可组合、可扩展性、可维护性等原则为指导,按照产品的功能特征和业务类型,聚焦零散的功能点,形成功能模块,实现产品功能模块的划分;

Easyways1的博客 1378

LobeHub开源AI应用平台:从部署到定制的全栈实践指南

在现代AI应用开发领域,大语言模型(LLM)的集成与部署是核心技术挑战之一。其原理在于通过API或本地化部署,将预训练模型的强大能力封装为可调用的服务。这项技术的核心价值在于极大地降低了AI应用的开发门槛,使开发者能够快速构建智能对话、内容生成等场景的应用。随着模型即服务(MaaS)模式的普及,一个关键痛点是如何高效地管理多模型、设计友好的用户界面并实现功能扩展。这正是开源项目LobeHub所聚焦的领域,它通过提供可插拔的架构和配置驱动的低代码理念,解决了AI能力落地的“最后一公里”问题。本文将结合Dock

weixin_27210125的博客 754

Agent架构选型全攻略(非常详细),Agent、Skills、Teams从入门到精通,收藏这一篇就够了!

一个反直觉的事实:把Agent从1个加到10个,效果不但没提升,错误反而被放大了17倍。

m0_59235945的博客 401

服务部署之配置WSUS更新服务(基于Windows配置 Server 2022)

服务部署之配置WSUS更新服务(基于Windows配置 Server 2022)

2301_77192876的博客 2214

AI Agent技能开发全攻略(非常详细),Agent Skills核心技术从入门到精通,收藏这一篇就够了!

最近一段时间,AI Agent 领域变化非常快。 从最早的 Prompt Engineering,到后来的 RAG,再到 MCP(Model Context Protocol),AI 的工程化能力正在迅速提升。很多开发者都在讨论一个问题:

m0_59235245的博客 662

【AI工具】Browser use搭建及使用的保姆级教程:让AI帮你自动操作浏览器

【AI工具】Browser use搭建及使用的保姆级教程:让AI帮你自动操作浏览器

funfan的博客 2535

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

AI大模型应用开发全攻略:从入门到精通,非常详细收藏我这一篇就够了

本文系统介绍AI大模型应用开发核心技术,包括Messages对话记忆机制、RAG检索增强生成、Tools工具调用、ReAct推理行动框架、Agent自主任务执行等关键技术。通过实际案例解析大模型交互原理、知识库构建和微调方法,揭示大模型通过上下文传递实现"记忆"、借助外部工具扩展能力等核心机制。文章提供从基础概念到企业级应用的全流程指南,帮助开发者掌握提示词工程、知识检索优化等实践技巧,为AI大模型应用开发提供清晰学习路径和技术全景图。

2401_85390073的博客 803

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

MCP 入门基础教程(非常详细),让大模型用上系统能力全攻略,收藏这一篇就够了!

MCP(Model Context Protocol)是一套开放的AI连接标准,旨在统一AI应用与外部系统的对接方式。它将工具能力、上下文数据和提示模板抽象为协议层,使AI应用能快速复用和扩展能力,避免重复开发对接代码。MCP包含三类核心组件:Tools(执行操作)、Resources(提供数据)和Prompts(标准指令模板)。该协议重点解决AI应用落地中的工程问题,强调安全控制机制如权限管理和调用审计。MCP并非提升模型智能,而是标准化模型与现实系统的连接方式,推动AI应用的高效部署和安全扩展。

m0_59235245的博客 2177

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

别再收藏了!这篇才是AI大模型应用开发的“终极答案”,从入门到精通,一篇就够!

AI 大模型应用开发作为新兴领域,不断出现新的技术:LLM、Prompt、RAG、Agent、Fine-tuning、MCP 等,本文聚焦 AI 大模型应用开发,带领大家入门,带领大家了解 AI 大模型应用开发的全攻略。

m0_56255097的博客 937

掌握上下文工程,就是掌握Agent的灵魂!从入门到精通全攻略,一篇通收藏够了!

这不是我第一次在我的文章里提到上下文工程了,我相信也绝对不会是最后一次。 因为这真的很重要,尤其是对于 Agent 大行其道的今天。知道上下文工程在 Agent 中的运转和作用,绝逼比你去抄别人的 Prompt 来的有用的多。

Python_cocola的博客 959

【干货收藏】2026年AI Agent开发全攻略:从零到精通,程序员必学大模型智能体指南

我们不是在开发Agent,是在用Agent赋能业务。AI Agent开发的终极答案不是"技术多牛",而是"业务价值多高"。没有业务价值,技术再炫酷也无用;没有清晰路线图,投入再多也白费。2025年,AI Agent不再是"可选",而是"必需"。你,准备好了吗?

youmaob的博客 1388

【必看】大模型业务应用全攻略:程序员入门到精通的技术路线图

本文详解了大模型业务落地的四种模式:嵌入式、辅助式、代理式和群体式,以及PE、RAG、FT等六种核心技术。根据业务类型和数据条件,可选择不同技术方案:垂类业务适合微调,通用业务以提示工程和智能体为主。文章提供了从简单到复杂的升级路线图,帮助开发者根据需求选择合适的大模型应用方式。

2401_85373691的博客 1723

LLM Agent彻底爆火!2025年AI必争风口,从入门到精通全攻略,收藏这一篇就够了!

《AI Agents》系统介绍了AI智能体的核心概念、架构设计与应用实践。全书通过丰富的示意图与案例,生动解析智能体如何感知、决策与交互,覆盖从基础模型到多智能体协作的前沿进展。无论是初学者还是开发者,都能通过本书快速理解智能体的运作机制与未来潜力,探索人工智能的下一波浪潮。

xx_nm98的博客 1221

AI 大模型应用开发全攻略,非常详细收藏我这一篇就够了

本文介绍了AI大模型应用开发的核心技术与范式,包括LLM、Prompt、RAG、Agent等关键概念。重点解析了大模型的工作原理:通过Messages参数实现对话"记忆",实则是无状态的上下文传递;RAG技术通过检索知识库提升回答质量;Tools参数使大模型能选择执行工具而非直接操作。文章还阐述了ReAct模式,展示了大模型如何模拟人类"推理-行动"的决策过程。这些技术共同构成了大模型应用开发的基础框架,为开发者提供了系统化的入门指导。

2301_80239908的博客 852

AI大模型应用开发入门全攻略:从小白到大神,一篇就够!

本文介绍了AI大模型应用开发的核心技术与范式,重点解析了LLM的工作原理及关键参数Messages和Tools的作用。通过OpenAI接口示例,说明大模型通过对话记录列表实现"记忆"功能,并分析了提示词的不稳定性问题。详细探讨了RAG(检索增强生成)技术流程,强调知识库检索与回答生成的关键挑战。此外,阐释了Tools参数如何实现工具调用、ReAct模式的推理-行动机制,以及Agent框架如何通过工具组合完成复杂任务。这些技术共同构成了AI大模型应用开发的基础架构,为开发者提供了全面的技术

2401_84495872的博客 1247

多Agent辩论+知识图谱推理全攻略(非常详细),AAAI 2026论文从入门到精通,收藏这一篇就够了!

在传统 KGQA 中,方法往往依赖“图谱里已经包含解题所需的实体与关系路径”。但现实世界的知识图谱建设与维护成本很高,内容更新也滞后,导致缺失事实、缺失实体、缺失关系路径的情况十分常见。此时,单纯依赖 KG 的推理会出现关键证据断裂:模型可能检索不到必要三元组,或者沿着错误路径走偏,从而输出不可靠答案。

Python_cocola的博客 485

Agent Skills 检索全攻略(非常详细),颠覆你对传统 RAG 的认知!

使用 Agent Skills 做知识库检索,是一种什么体验?

m0_59164520的博客 1813
上一篇: GLM-5技术报告深度精读(非常详细),多步任务强化学习从入门到精通,收藏这一篇就够了!
下一篇: 2026,一文读懂什么是AI人工智能(深度长文_通俗易懂)
Python_金钱豹
博客等级 码龄5年 1万+粉丝 2835原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值