Skip to content

检索增强生成 (RAG)

PRX 内置 RAG(Retrieval-Augmented Generation)管道,在每次 LLM 调用前自动检索相关上下文并注入提示词。通过结合向量嵌入和记忆系统,Agent 能够利用大规模知识库回答问题,同时保持响应的准确性和时效性。

概述

RAG 解决 LLM 的两个核心限制:

  • 知识截止 -- LLM 训练数据有截止日期,RAG 提供最新信息
  • 上下文窗口 -- 无法将所有知识塞入 prompt,RAG 只检索相关片段

工作流程

用户输入

  ├─ 1. 查询理解
  │     提取关键词、意图、实体

  ├─ 2. 检索阶段
  │     ├─ 向量检索:embedding similarity search (Top-K)
  │     ├─ 关键词检索:FTS5 / pg_trgm 全文搜索
  │     └─ 混合排序:RRF (Reciprocal Rank Fusion) 合并结果

  ├─ 3. 重排序 (可选)
  │     使用 cross-encoder 或 LLM 对候选结果重新打分

  ├─ 4. 上下文组装
  │     将检索到的文本片段格式化为 system prompt 的一部分

  └─ 5. LLM 生成
        带有检索上下文的完整 prompt 发送给 LLM

分块策略

将文档拆分为适合检索的片段(chunk)是 RAG 的关键步骤。

支持的分块方法

方法适用场景配置键
固定大小通用文本fixed_size
段落分割结构化文档paragraph
递归分割Markdown / 代码recursive
语义分割精确度优先semantic

分块配置

toml
[memory.rag.chunking]
# 分块方法: "fixed_size" | "paragraph" | "recursive" | "semantic"
method = "recursive"

# 每个 chunk 的目标 token 数
chunk_size = 512

# chunk 之间的重叠 token 数(保持上下文连续性)
chunk_overlap = 64

# 递归分割的分隔符优先级
separators = ["\n## ", "\n### ", "\n\n", "\n", ". "]

检索管道

向量检索

基于语义相似度的检索,利用 embedding 模型:

toml
[memory.rag.retrieval]
# 主检索方式
method = "hybrid"  # "vector" | "keyword" | "hybrid"

[memory.rag.retrieval.vector]
# 返回的最大结果数
top_k = 10

# 相似度阈值(低于此值的结果被过滤)
similarity_threshold = 0.4

# embedding 提供商配置(复用 memory.embeddings)
# 参见 /zh/prx/memory/embeddings

关键词检索

基于精确关键词匹配的补充检索:

toml
[memory.rag.retrieval.keyword]
# 使用的搜索引擎(跟随 memory backend)
# sqlite -> FTS5, postgres -> pg_trgm + tsvector
enabled = true
top_k = 10

混合检索与排序

toml
[memory.rag.retrieval.hybrid]
# 向量检索权重
vector_weight = 0.7

# 关键词检索权重
keyword_weight = 0.3

# 合并算法: "rrf" (Reciprocal Rank Fusion) | "weighted_sum"
fusion_method = "rrf"

# RRF 参数 k
rrf_k = 60

重排序

对初步检索结果进行精细化排序:

toml
[memory.rag.reranking]
enabled = false

# 重排序方法: "cross_encoder" | "llm" | "cohere"
method = "cross_encoder"

# Cross-encoder 模型
[memory.rag.reranking.cross_encoder]
provider = "ollama"
model = "bge-reranker-v2-m3"

# 重排序后保留的 Top-N
top_n = 5

上下文注入

检索到的内容如何注入 LLM 提示词:

toml
[memory.rag.injection]
# 注入位置: "system" | "user" | "assistant"
position = "system"

# 上下文模板
template = """
以下是与用户问题相关的参考资料,请基于这些资料回答:

{context}

注意:如果参考资料中没有相关信息,请明确说明。
"""

# 最大注入 token 数(防止超出上下文窗口)
max_tokens = 4096

# 是否包含来源引用
include_sources = true

完整配置示例

toml
[memory]
backend = "embeddings"

[memory.embeddings]
provider = "ollama"
model = "nomic-embed-text"
dimension = 768

[memory.rag]
enabled = true

[memory.rag.chunking]
method = "recursive"
chunk_size = 512
chunk_overlap = 64

[memory.rag.retrieval]
method = "hybrid"

[memory.rag.retrieval.vector]
top_k = 10
similarity_threshold = 0.4

[memory.rag.retrieval.keyword]
enabled = true
top_k = 10

[memory.rag.retrieval.hybrid]
vector_weight = 0.7
keyword_weight = 0.3
fusion_method = "rrf"

[memory.rag.reranking]
enabled = false

[memory.rag.injection]
position = "system"
max_tokens = 4096
include_sources = true

使用方法

CLI 命令

bash
# 导入文档到 RAG 知识库
prx rag ingest /path/to/docs/

# 导入单个文件
prx rag ingest README.md

# 查询测试(不经过 LLM,仅检索)
prx rag search "如何配置 webhook"

# 查看知识库统计
prx rag stats

# 清理过期的 chunk
prx rag prune --older-than 30d

对话中使用

RAG 在对话中自动工作,无需手动触发:

用户: PRX 支持哪些消息渠道?

Agent: (自动检索相关文档片段)
根据参考资料,PRX 支持以下消息渠道:
- Telegram Bot
- Matrix
- Slack (webhook)
- Discord
- Email (IMAP/SMTP)
...
[来源: channels/index.md, channels/telegram.md]

参数说明

参数类型默认值说明
rag.enabledboolfalse启用 RAG 管道
rag.chunking.methodstring"recursive"分块方法
rag.chunking.chunk_sizeu32512每 chunk token 数
rag.chunking.chunk_overlapu3264chunk 重叠 token 数
rag.retrieval.methodstring"hybrid"检索方式
rag.retrieval.vector.top_ku3210向量检索返回数
rag.retrieval.vector.similarity_thresholdf640.4相似度阈值
rag.reranking.enabledboolfalse启用重排序
rag.injection.positionstring"system"注入位置
rag.injection.max_tokensu324096最大注入 token 数

安全性

  • 数据隔离 -- 每个工作区的知识库互相隔离,不会交叉检索
  • 权限控制 -- 导入文档和查询统计受角色权限限制
  • 本地处理 -- 使用本地 embedding 模型(如 Ollama)时,文档不离开本机
  • 敏感过滤 -- 可配置正则表达式过滤包含密钥、密码等敏感内容的 chunk

相关文档

Released under the Apache-2.0 License.