retriever

package
v0.5.13 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 13, 2026 License: Apache-2.0 Imports: 13 Imported by: 0

Documentation

Overview

Package retriever 提供 RAG 系统的文档检索器

adaptive.go 实现自适应检索 (Adaptive Retrieval):

  • AdaptiveRetriever: 根据查询复杂度自动调整检索策略和参数
  • QueryClassifier: 查询分类器,判断查询类型和复杂度
  • StrategySelector: 策略选择器,根据分类结果选择最优检索方案

对标 LangChain/LlamaIndex 的自适应检索能力。

使用示例:

adaptive := NewAdaptiveRetriever(
    WithBaseRetriever(vectorRetriever),
    WithFallbackRetriever(keywordRetriever),
    WithClassifier(NewRuleClassifier()),
)
docs, err := adaptive.Retrieve(ctx, "复杂的多实体关联查询")

Package retriever 提供 RAG 系统的文档检索器

hyde.go 实现 HyDE (Hypothetical Document Embeddings) 假设文档检索:

  • HyDERetriever: 通过 LLM 生成假设文档,用假设文档的向量检索真实文档
  • VectorMergeStrategy: 多个假设文档向量的合并策略

HyDE 核心思想:

用户查询和相关文档之间存在"语义鸿沟"。HyDE 先让 LLM 生成一个
假设的理想答案文档,然后用该文档的向量去检索真实文档。
因为假设文档与真实文档在语义空间中更接近,检索效果通常更好。

对标 LangChain HypotheticalDocumentEmbedder / LlamaIndex HyDEQueryTransform。

使用示例:

hyde := NewHyDERetriever(
    llmProvider,
    embedder,
    vectorStore,
    WithHyDENumHypothetical(3),
    WithHyDETopK(10),
)
docs, err := hyde.Retrieve(ctx, "Go 语言的并发模型有什么优势?")

Package retriever 提供 RAG 系统的文档检索器

Package retriever 提供 RAG 系统的文档检索器

Retriever 用于从向量存储中检索相关文档:

  • VectorRetriever: 基于向量相似度检索
  • KeywordRetriever: 基于关键词检索
  • HybridRetriever: 混合检索(向量 + 关键词)
  • MultiRetriever: 多源检索聚合

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type AdaptiveOption

type AdaptiveOption func(*AdaptiveRetriever)

AdaptiveOption 自适应检索器选项

func WithBaseRetriever

func WithBaseRetriever(r rag.Retriever) AdaptiveOption

WithBaseRetriever 设置基础检索器

func WithClassifier

func WithClassifier(c QueryClassifier) AdaptiveOption

WithClassifier 设置查询分类器

func WithComplexityStrategy

func WithComplexityStrategy(complexity QueryComplexity, strategy *RetrievalStrategy) AdaptiveOption

WithComplexityStrategy 设置特定复杂度的策略

func WithDefaultMinScore

func WithDefaultMinScore(score float32) AdaptiveOption

WithDefaultMinScore 设置默认最小分数

func WithDefaultTopK

func WithDefaultTopK(k int) AdaptiveOption

WithDefaultTopK 设置默认 TopK

func WithNamedRetriever

func WithNamedRetriever(name string, r rag.Retriever) AdaptiveOption

WithNamedRetriever 添加命名检索器

type AdaptiveRetriever

type AdaptiveRetriever struct {
	// contains filtered or unexported fields
}

AdaptiveRetriever 自适应检索器 根据查询的复杂度和类型,自动调整检索策略

func NewAdaptiveRetriever

func NewAdaptiveRetriever(opts ...AdaptiveOption) *AdaptiveRetriever

NewAdaptiveRetriever 创建自适应检索器

func (*AdaptiveRetriever) Retrieve

func (r *AdaptiveRetriever) Retrieve(ctx context.Context, query string, opts ...rag.RetrieveOption) ([]rag.Document, error)

Retrieve 自适应检索

type DocumentStore

type DocumentStore struct {
	// contains filtered or unexported fields
}

DocumentStore 简单的文档存储 用于存储父文档

func NewDocumentStore

func NewDocumentStore() *DocumentStore

NewDocumentStore 创建文档存储

func (*DocumentStore) Clear

func (s *DocumentStore) Clear()

Clear 清空存储

func (*DocumentStore) Count

func (s *DocumentStore) Count() int

Count 返回文档数量

func (*DocumentStore) Delete

func (s *DocumentStore) Delete(id string)

Delete 删除文档

func (*DocumentStore) Get

func (s *DocumentStore) Get(id string) (rag.Document, bool)

Get 获取文档

func (*DocumentStore) Save

func (s *DocumentStore) Save(doc rag.Document)

Save 保存文档

type HyDEOption

type HyDEOption func(*HyDERetriever)

HyDEOption HyDE 检索器选项

func WithHyDEMergeStrategy

func WithHyDEMergeStrategy(strategy VectorMergeStrategy) HyDEOption

WithHyDEMergeStrategy 设置向量合并策略

func WithHyDEModel

func WithHyDEModel(model string) HyDEOption

WithHyDEModel 设置 LLM 模型名称

func WithHyDENumHypothetical

func WithHyDENumHypothetical(n int) HyDEOption

WithHyDENumHypothetical 设置生成的假设文档数量

func WithHyDEPrompt

func WithHyDEPrompt(prompt string) HyDEOption

WithHyDEPrompt 设置假设文档生成的提示词模板 模板中 %s 会被替换为用户查询

func WithHyDETemperature

func WithHyDETemperature(temp float64) HyDEOption

WithHyDETemperature 设置 LLM 采样温度 较高温度(0.7-1.0)生成更多样化的假设文档

func WithHyDETopK

func WithHyDETopK(k int) HyDEOption

WithHyDETopK 设置返回文档数量

type HyDERetriever

type HyDERetriever struct {
	// contains filtered or unexported fields
}

HyDERetriever HyDE 假设文档检索器 核心流程:

  1. 用户查询 → LLM 生成 N 个假设文档
  2. 假设文档 → 向量化
  3. 假设文档向量 → 检索真实文档
  4. 去重排序 → 返回结果

func NewHyDERetriever

func NewHyDERetriever(llmProvider llm.Provider, embedder vector.Embedder, store vector.Store, opts ...HyDEOption) *HyDERetriever

NewHyDERetriever 创建 HyDE 检索器

参数:

  • llmProvider: LLM 提供者,用于生成假设文档
  • embedder: 向量生成器,将假设文档转为向量
  • store: 向量存储,用于检索真实文档
  • opts: 可选配置

func (*HyDERetriever) Retrieve

func (r *HyDERetriever) Retrieve(ctx context.Context, query string, opts ...rag.RetrieveOption) ([]rag.Document, error)

Retrieve 执行 HyDE 检索 流程:查询 → LLM 生成假设文档 → 向量化 → 检索 → 去重排序

type HybridOption

type HybridOption func(*HybridRetriever)

HybridOption HybridRetriever 选项

func WithHybridTopK

func WithHybridTopK(k int) HybridOption

WithHybridTopK 设置返回数量

func WithKeywordWeight

func WithKeywordWeight(w float32) HybridOption

WithKeywordWeight 设置关键词检索权重

func WithVectorWeight

func WithVectorWeight(w float32) HybridOption

WithVectorWeight 设置向量检索权重

type HybridRetriever

type HybridRetriever struct {
	// contains filtered or unexported fields
}

HybridRetriever 混合检索器 结合向量检索和关键词检索的结果

func NewHybridRetriever

func NewHybridRetriever(vectorRet, keywordRet rag.Retriever, opts ...HybridOption) *HybridRetriever

NewHybridRetriever 创建混合检索器

func (*HybridRetriever) Retrieve

func (r *HybridRetriever) Retrieve(ctx context.Context, query string, opts ...rag.RetrieveOption) ([]rag.Document, error)

Retrieve 混合检索

type IndexNode

type IndexNode struct {
	// ID 节点 ID
	ID string `json:"id"`

	// Type 节点类型
	Type NodeType `json:"type"`

	// Content 节点内容
	Content string `json:"content"`

	// Children 子节点 ID 列表
	Children []string `json:"children,omitempty"`

	// Parent 父节点 ID
	Parent string `json:"parent,omitempty"`

	// Metadata 元数据
	Metadata map[string]any `json:"metadata,omitempty"`

	// Embedding 节点向量(如果有)
	Embedding []float32 `json:"embedding,omitempty"`

	// Score 检索分数(仅在检索结果中有效)
	Score float32 `json:"score,omitempty"`
}

IndexNode 索引节点 用于构建层级文档结构,支持多跳检索

func (*IndexNode) IsLeaf

func (n *IndexNode) IsLeaf() bool

IsLeaf 判断是否为叶子节点

type KeywordOption

type KeywordOption func(*KeywordRetriever)

KeywordOption KeywordRetriever 选项

func WithKeywordTopK

func WithKeywordTopK(k int) KeywordOption

WithKeywordTopK 设置返回数量

type KeywordRetriever

type KeywordRetriever struct {
	// contains filtered or unexported fields
}

KeywordRetriever 关键词检索器

func NewKeywordRetriever

func NewKeywordRetriever(docs []rag.Document, opts ...KeywordOption) *KeywordRetriever

NewKeywordRetriever 创建关键词检索器

func (*KeywordRetriever) AddDocuments

func (r *KeywordRetriever) AddDocuments(docs []rag.Document)

AddDocuments 添加文档

func (*KeywordRetriever) Retrieve

func (r *KeywordRetriever) Retrieve(ctx context.Context, query string, opts ...rag.RetrieveOption) ([]rag.Document, error)

Retrieve 检索相关文档

type MultiOption

type MultiOption func(*MultiRetriever)

MultiOption MultiRetriever 选项

func WithDedupe

func WithDedupe(dedupe bool) MultiOption

WithDedupe 设置是否去重

func WithMultiTopK

func WithMultiTopK(k int) MultiOption

WithMultiTopK 设置返回数量

type MultiRetriever

type MultiRetriever struct {
	// contains filtered or unexported fields
}

MultiRetriever 多源检索器 从多个检索器获取结果并聚合

func NewMultiRetriever

func NewMultiRetriever(retrievers []rag.Retriever, opts ...MultiOption) *MultiRetriever

NewMultiRetriever 创建多源检索器

func (*MultiRetriever) Retrieve

func (r *MultiRetriever) Retrieve(ctx context.Context, query string, opts ...rag.RetrieveOption) ([]rag.Document, error)

Retrieve 多源检索

type NodeIndex

type NodeIndex struct {
	// contains filtered or unexported fields
}

NodeIndex 节点索引存储

func NewNodeIndex

func NewNodeIndex() *NodeIndex

NewNodeIndex 创建节点索引

func (*NodeIndex) Add

func (idx *NodeIndex) Add(node *IndexNode)

Add 添加节点

func (*NodeIndex) AllNodes

func (idx *NodeIndex) AllNodes() []*IndexNode

AllNodes 返回所有节点

func (*NodeIndex) Clear

func (idx *NodeIndex) Clear()

Clear 清空索引

func (*NodeIndex) Count

func (idx *NodeIndex) Count() int

Count 返回节点数量

func (*NodeIndex) Delete

func (idx *NodeIndex) Delete(id string)

Delete 删除节点

func (*NodeIndex) Get

func (idx *NodeIndex) Get(id string) (*IndexNode, bool)

Get 获取节点

func (*NodeIndex) GetChildren

func (idx *NodeIndex) GetChildren(id string) []*IndexNode

GetChildren 获取子节点

func (*NodeIndex) GetLeafNodes

func (idx *NodeIndex) GetLeafNodes() []*IndexNode

GetLeafNodes 获取所有叶子节点

type NodeType

type NodeType string

NodeType 索引节点类型

const (
	// NodeTypeChunk 文本块节点(叶子节点)
	NodeTypeChunk NodeType = "chunk"

	// NodeTypeIndex 索引节点(中间节点,指向其他节点)
	NodeTypeIndex NodeType = "index"

	// NodeTypeSummary 摘要节点(包含子节点内容的摘要)
	NodeTypeSummary NodeType = "summary"

	// NodeTypeTable 表格节点(结构化数据)
	NodeTypeTable NodeType = "table"

	// NodeTypeImage 图片节点
	NodeTypeImage NodeType = "image"
)

type ParentDocOption

type ParentDocOption func(*ParentDocRetriever)

ParentDocOption ParentDocRetriever 配置选项

func WithChildSplitter

func WithChildSplitter(splitter rag.Splitter) ParentDocOption

WithChildSplitter 设置子文档分割器

func WithChildTopK

func WithChildTopK(k int) ParentDocOption

WithChildTopK 设置检索子文档数量 默认值: 10

func WithParentMinScore

func WithParentMinScore(score float32) ParentDocOption

WithParentMinScore 设置最小相关性分数

func WithParentStore

func WithParentStore(store *DocumentStore) ParentDocOption

WithParentStore 设置父文档存储(可用于持久化)

func WithParentTopK

func WithParentTopK(k int) ParentDocOption

WithParentTopK 设置返回父文档数量 默认值: 5

type ParentDocRetriever

type ParentDocRetriever struct {
	// contains filtered or unexported fields
}

ParentDocRetriever 父子文档检索器 子文档用于精确匹配,返回父文档提供完整上下文

工作原理:

  1. 索引时:将原始文档保存为父文档,分割成子块后存入向量存储
  2. 检索时:用子块进行向量检索,找到相关子块后返回对应的父文档
  3. 优势:子块用于精确语义匹配,父文档提供更完整的上下文

参考 LlamaIndex 的 ParentDocumentRetriever 设计

使用示例:

retriever := NewParentDocRetriever(
    vectorStore, embedder,
    WithChildSplitter(splitter.NewRecursiveSplitter(200, 50)),
    WithParentTopK(5),
)
// 索引文档
retriever.Index(ctx, docs)
// 检索
parentDocs, err := retriever.Retrieve(ctx, "query")

func NewParentDocRetriever

func NewParentDocRetriever(childStore vector.Store, embedder vector.Embedder, opts ...ParentDocOption) *ParentDocRetriever

NewParentDocRetriever 创建父子文档检索器

参数:

  • childStore: 子文档向量存储
  • embedder: 向量嵌入器
  • opts: 配置选项

func (*ParentDocRetriever) Clear

func (r *ParentDocRetriever) Clear(ctx context.Context) error

Clear 清空所有文档

func (*ParentDocRetriever) Count

func (r *ParentDocRetriever) Count(ctx context.Context) (int, error)

Count 返回父文档数量

func (*ParentDocRetriever) Delete

func (r *ParentDocRetriever) Delete(ctx context.Context, ids []string) error

Delete 删除文档(包括父文档和所有子块)

func (*ParentDocRetriever) GetParentStore

func (r *ParentDocRetriever) GetParentStore() *DocumentStore

GetParentStore 获取父文档存储(用于序列化/持久化)

func (*ParentDocRetriever) Index

func (r *ParentDocRetriever) Index(ctx context.Context, docs []rag.Document) error

Index 索引文档 将原始文档保存为父文档,分割成子块后存入向量存储。 仅在访问内存状态时短暂持锁,Embed 等耗时操作在锁外执行,避免阻塞 Retrieve。

func (*ParentDocRetriever) Retrieve

func (r *ParentDocRetriever) Retrieve(ctx context.Context, query string, opts ...rag.RetrieveOption) ([]rag.Document, error)

Retrieve 检索相关的父文档 先检索子块,然后返回对应的父文档

type QueryClassification

type QueryClassification struct {
	// Complexity 查询复杂度
	Complexity QueryComplexity

	// Type 查询类型
	Type QueryType

	// Keywords 提取的关键词
	Keywords []string

	// Score 置信度 (0-1)
	Score float64
}

QueryClassification 查询分类结果

type QueryClassifier

type QueryClassifier interface {
	// Classify 对查询进行分类
	Classify(ctx context.Context, query string) (*QueryClassification, error)
}

QueryClassifier 查询分类器接口

type QueryComplexity

type QueryComplexity int

QueryComplexity 查询复杂度

const (
	// ComplexitySimple 简单查询(关键词、短问题)
	ComplexitySimple QueryComplexity = iota
	// ComplexityModerate 中等复杂度(需要一些推理)
	ComplexityModerate
	// ComplexityComplex 复杂查询(多实体、多步推理)
	ComplexityComplex
)

type QueryType

type QueryType int

QueryType 查询类型

const (
	// QueryTypeFactual 事实型查询("X 是什么")
	QueryTypeFactual QueryType = iota
	// QueryTypeAnalytical 分析型查询("为什么"、"怎样")
	QueryTypeAnalytical
	// QueryTypeComparative 比较型查询("A 和 B 的区别")
	QueryTypeComparative
	// QueryTypeAggregation 聚合型查询("列出所有")
	QueryTypeAggregation
)

type RecursiveOption

type RecursiveOption func(*RecursiveRetriever)

RecursiveOption RecursiveRetriever 配置选项

func WithExpandAll

func WithExpandAll(expand bool) RecursiveOption

WithExpandAll 设置是否展开所有子节点 默认: false(选择性展开)

func WithIncludeIntermediateNodes

func WithIncludeIntermediateNodes(include bool) RecursiveOption

WithIncludeIntermediateNodes 设置是否包含中间节点在结果中 默认: false(只返回叶子节点)

func WithMaxDepth

func WithMaxDepth(depth int) RecursiveOption

WithMaxDepth 设置最大检索深度 默认值: 3

func WithRecursiveMinScore

func WithRecursiveMinScore(score float32) RecursiveOption

WithRecursiveMinScore 设置最小相关性分数

func WithRecursiveTopK

func WithRecursiveTopK(k int) RecursiveOption

WithRecursiveTopK 设置每层返回的节点数量 默认值: 5

type RecursiveRetriever

type RecursiveRetriever struct {
	// contains filtered or unexported fields
}

RecursiveRetriever 递归/多跳检索器 支持层级文档结构的递归检索

工作原理:

  1. 从根索引节点开始搜索
  2. 根据查询选择相关的子节点
  3. 递归深入直到到达叶子节点(实际内容)
  4. 可选使用 LLM 判断是否需要继续深入

适用场景:

  • 层级文档(如书籍章节、目录结构)
  • 多步推理检索
  • 复杂问题分解

使用示例:

retriever := NewRecursiveRetriever(
    vectorStore, embedder, nodeIndex,
    WithMaxDepth(3),
    WithRecursiveTopK(5),
)
docs, err := retriever.Retrieve(ctx, "query")

func NewRecursiveRetriever

func NewRecursiveRetriever(store vector.Store, embedder vector.Embedder, nodeIndex *NodeIndex, opts ...RecursiveOption) *RecursiveRetriever

NewRecursiveRetriever 创建递归检索器

参数:

  • store: 向量存储
  • embedder: 向量嵌入器
  • nodeIndex: 节点索引
  • opts: 配置选项

func (*RecursiveRetriever) Clear

func (r *RecursiveRetriever) Clear(ctx context.Context) error

Clear 清空所有数据

func (*RecursiveRetriever) GetNodeIndex

func (r *RecursiveRetriever) GetNodeIndex() *NodeIndex

GetNodeIndex 获取节点索引

func (*RecursiveRetriever) IndexNodes

func (r *RecursiveRetriever) IndexNodes(ctx context.Context, nodes []*IndexNode) error

IndexNodes 索引节点到向量存储

func (*RecursiveRetriever) Retrieve

func (r *RecursiveRetriever) Retrieve(ctx context.Context, query string, opts ...rag.RetrieveOption) ([]rag.Document, error)

Retrieve 递归检索相关文档

type Reranker

type Reranker interface {
	Rerank(ctx context.Context, query string, docs []rag.Document) ([]rag.Document, error)
}

Reranker 重排序器接口

type RerankerOption

type RerankerOption func(*RerankerRetriever)

RerankerOption RerankerRetriever 选项

func WithFetchK

func WithFetchK(k int) RerankerOption

WithFetchK 设置初始获取数量

func WithRerankerTopK

func WithRerankerTopK(k int) RerankerOption

WithRerankerTopK 设置最终返回数量

type RerankerRetriever

type RerankerRetriever struct {
	// contains filtered or unexported fields
}

RerankerRetriever 带重排序的检索器

func NewRerankerRetriever

func NewRerankerRetriever(retriever rag.Retriever, reranker Reranker, opts ...RerankerOption) *RerankerRetriever

NewRerankerRetriever 创建带重排序的检索器

func (*RerankerRetriever) Retrieve

func (r *RerankerRetriever) Retrieve(ctx context.Context, query string, opts ...rag.RetrieveOption) ([]rag.Document, error)

Retrieve 检索并重排序

type RetrievalStrategy

type RetrievalStrategy struct {
	// TopK 返回文档数量
	TopK int

	// MinScore 最低相关性分数
	MinScore float32

	// UseReranker 是否启用重排序
	UseReranker bool

	// MultiQuery 是否启用多查询扩展
	MultiQuery bool

	// RetrieverName 使用的检索器名称
	RetrieverName string
}

RetrievalStrategy 检索策略

type RuleClassifier

type RuleClassifier struct {
	// contains filtered or unexported fields
}

RuleClassifier 基于规则的查询分类器

func NewRuleClassifier

func NewRuleClassifier() *RuleClassifier

NewRuleClassifier 创建基于规则的分类器

func (*RuleClassifier) Classify

func (c *RuleClassifier) Classify(_ context.Context, query string) (*QueryClassification, error)

Classify 使用规则分类查询

type VectorMergeStrategy

type VectorMergeStrategy int

VectorMergeStrategy 假设文档向量合并策略

const (
	// MergeAverage 对所有假设文档的向量取平均值
	// 适用于假设文档质量较均匀的场景
	MergeAverage VectorMergeStrategy = iota

	// MergeSearchAll 分别用每个假设文档向量检索,然后聚合去重
	// 适用于需要更多样化结果的场景
	MergeSearchAll
)

type VectorOption

type VectorOption func(*VectorRetriever)

VectorOption VectorRetriever 选项

func WithMinScore

func WithMinScore(score float32) VectorOption

WithMinScore 设置最小分数

func WithTopK

func WithTopK(k int) VectorOption

WithTopK 设置返回数量

type VectorRetriever

type VectorRetriever struct {
	// contains filtered or unexported fields
}

VectorRetriever 向量检索器

func NewVectorRetriever

func NewVectorRetriever(store vector.Store, embedder vector.Embedder, opts ...VectorOption) *VectorRetriever

NewVectorRetriever 创建向量检索器

func (*VectorRetriever) Retrieve

func (r *VectorRetriever) Retrieve(ctx context.Context, query string, opts ...rag.RetrieveOption) ([]rag.Document, error)

Retrieve 检索相关文档

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL