llm

package
v2.0.13 Latest Latest
Warning

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

Go to latest
Published: Jul 26, 2026 License: MIT Imports: 14 Imported by: 0

Documentation

Overview

Package llm 提供基于 LLM 的文本增强工具。

设计要点:

  • 与 chunker 包同层,独立开发,最后在集成层使用
  • 所有 LLM 调用统一使用 gochat 客户端
  • 工具包括:
  • Summarizer:为 Chunk 生成更语义化的 Title/Summary
  • Refiller:从预分块文本中提取实体并回填 Nodes/Edges
  • 构造函数返回 error,所有必传参数进行非空检查
  • 日志使用 gorag/logging 接口,Logger 通过构造函数注入

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Config

type Config struct {
	APIKey  string
	BaseURL string
	Model   string
	Timeout time.Duration
}

Config 是 Summarizer / Refiller 等 LLM 工具的通用配置。

设计要点:

  • 与具体 LLM 客户端解耦,仅描述调用参数
  • 调用方负责从环境变量、.rag 配置或 keychain 中读取真实密钥
  • Timeout 为 0 时使用默认 10 分钟

type EntitySchema

type EntitySchema struct {
	Type        string                    // 实体类型名,来自文件名
	Description string                    // 实体说明,直接来自 JSON Schema 的 description 字段
	Properties  map[string]SchemaProperty // 属性定义,来自 JSON Schema 的 properties
	Required    []string                  // 必填属性列表,来自 JSON Schema 的 required
}

EntitySchema 定义 Refiller 要提取的实体类型。

设计要点:

  • 完整解析外部 JSON Schema 文件的结构化信息,不丢弃任何约束定义
  • Description 即 Prompt —— 直接来自 JSON Schema 的 description 字段,不做额外包装
  • Properties 保留所有属性的类型、枚举值、格式等约束,用于生成精确的 LLM 提示词
  • Type 将作为 core.Node.Labels[0]

func LoadEntitySchema

func LoadEntitySchema(path string) (EntitySchema, error)

LoadEntitySchema 从单个 JSON Schema 文件创建 EntitySchema。

规则:

  • Type 使用文件名(去除 .json 扩展名)
  • Description 直接使用文件内的 description 字段,不做任何格式化包装
  • Properties 完整解析为 SchemaProperty 结构(类型、描述、枚举值、格式、数组元素类型)

func LoadEntitySchemasFromDir

func LoadEntitySchemasFromDir(dir string) ([]EntitySchema, error)

LoadEntitySchemasFromDir 扫描目录下所有 .json 文件并加载为 EntitySchema 列表。

规则:

  • 仅加载直接子目录中的 .json 文件,不递归
  • 加载失败单个文件时跳过并继续,最终汇总错误
  • 空目录返回空列表

type Refiller

type Refiller interface {
	Refill(ctx context.Context, result chunker.ChunkResult, schemas []EntitySchema) (chunker.ChunkResult, error)
}

Refiller 将所有 Chunk 序列化为 JSON 数组,结合 Schema 让 LLM 提取实体和关系, 最后将结果以 Node/Edge 形式回填到 ChunkResult 中。

设计要点:

  • 输入为 chunker.ChunkResult,输出为补充了 Nodes/Edges 的 ChunkResult
  • 不删除或修改已有的 Nodes/Edges,仅做追加
  • 提取出的实体 Node 的 SourceChunkIDs 为空(纯图实体)
  • SourceDocIDs 从 result.Chunks 中收集到的 DocID 去重后填充

func NewRefiller

func NewRefiller(cfg Config, logger logging.Logger) (Refiller, error)

NewRefiller 创建基于 gochat 的 Refiller。

必传参数:

  • cfg: LLM 配置(APIKey/BaseURL/Model 必填)
  • logger: 日志实例(禁止为 nil)

type SchemaProperty

type SchemaProperty struct {
	Type        string          `json:"type"`
	Description string          `json:"description"`
	Enum        []string        `json:"enum,omitempty"`
	Format      string          `json:"format,omitempty"`
	Items       *SchemaProperty `json:"items,omitempty"`
}

SchemaProperty 描述实体属性的类型约束。

直接对应 JSON Schema 的 property 定义,保留所有约束信息, 用于生成精确的 LLM 提示词。

type Summarizer

type Summarizer interface {
	Summarize(ctx context.Context, chunks []core.Chunk) ([]core.Chunk, error)
}

Summarizer 对文本型 Chunk 的 Title 和 Summary 进行 LLM 增强。

设计要点:

  • 输入为 []core.Chunk,输出为增强后的 []core.Chunk(原地修改并返回)
  • 每个 Chunk 独立调用 LLM,便于控制上下文和成本
  • 仅当 LLM 返回合法 title/summary 时才覆盖原值
  • 失败时记录日志并保留原 Chunk,不中断整个流程

func NewSummarizer

func NewSummarizer(cfg Config, logger logging.Logger) (Summarizer, error)

NewSummarizer 创建基于 gochat 的 Summarizer。

必传参数:

  • cfg: LLM 配置(APIKey/BaseURL/Model 必填)
  • logger: 日志实例(禁止为 nil)

type UsageRecorder

type UsageRecorder func(ctx context.Context, model string, usage *chat.Usage, label string)

UsageRecorder 记录 LLM 调用 token 用量的回调。 model 为本次调用的模型名,usage 可能为 nil(部分提供商不返回用量信息)。 label 标识调用方(如 "Summarizer(单条)" / "Refiller")。

Jump to

Keyboard shortcuts

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