draftrag

package
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: Apr 16, 2026 License: Apache-2.0 Imports: 23 Imported by: 0

Documentation

Overview

Package draftrag — публичный API для сборки RAG pipeline.

Index

Constants

View Source
const (
	LogLevelDebug = domain.LogLevelDebug
	LogLevelInfo  = domain.LogLevelInfo
	LogLevelWarn  = domain.LogLevelWarn
	LogLevelError = domain.LogLevelError
)

Уровни логирования.

View Source
const (
	// HookStageChunking — разбиение документа на чанки (только при наличии Chunker).
	HookStageChunking = domain.HookStageChunking
	// HookStageEmbed — генерация embedding для текста.
	HookStageEmbed = domain.HookStageEmbed
	// HookStageSearch — поиск в VectorStore.
	HookStageSearch = domain.HookStageSearch
	// HookStageGenerate — генерация ответа LLM.
	HookStageGenerate = domain.HookStageGenerate
)
View Source
const (
	// CircuitClosed — нормальная работа.
	CircuitClosed = resilience.CircuitClosed
	// CircuitOpen — блокировка запросов.
	CircuitOpen = resilience.CircuitOpen
	// CircuitHalfOpen — пробное восстановление.
	CircuitHalfOpen = resilience.CircuitHalfOpen
)

Variables

View Source
var (
	// ErrEmptyDocument возвращается, если документ нельзя проиндексировать из-за пустого содержимого.
	ErrEmptyDocument = errors.New("empty document")
	// ErrEmptyQuery возвращается, если Pipeline.Query* вызывается с пустым вопросом.
	ErrEmptyQuery = errors.New("empty query")
	// ErrInvalidTopK возвращается, если topK <= 0.
	ErrInvalidTopK = errors.New("invalid topK")
	// ErrInvalidEmbedderConfig возвращается при невалидной конфигурации Embedder.
	// Ошибка предназначена для проверок через errors.Is.
	ErrInvalidEmbedderConfig = errors.New("invalid embedder config")
	// ErrInvalidLLMConfig возвращается при невалидной конфигурации LLMProvider.
	// Ошибка предназначена для проверок через errors.Is.
	ErrInvalidLLMConfig = errors.New("invalid llm config")
	// ErrInvalidChunkerConfig возвращается при невалидной конфигурации Chunker.
	// Ошибка предназначена для проверок через errors.Is.
	ErrInvalidChunkerConfig = errors.New("invalid chunker config")

	// ErrEmbeddingDimensionMismatch возвращается, если размерность embedding-вектора не соответствует ожидаемой.
	//
	// Ошибка предназначена для проверок через errors.Is.
	ErrEmbeddingDimensionMismatch = domain.ErrEmbeddingDimensionMismatch

	// ErrFiltersNotSupported возвращается, если pipeline-метод с фильтрами вызван,
	// но используемый VectorStore не поддерживает filters capability.
	ErrFiltersNotSupported = errors.New("filters not supported")

	// ErrInvalidVectorStoreConfig возвращается при невалидной конфигурации VectorStore.
	// Ошибка предназначена для проверок через errors.Is.
	ErrInvalidVectorStoreConfig = errors.New("invalid vector store config")
)
View Source
var DefaultHybridConfig = domain.DefaultHybridConfig

DefaultHybridConfig возвращает конфигурацию гибридного поиска по умолчанию.

View Source
var ErrCircuitOpen = resilience.ErrCircuitOpen

ErrCircuitOpen возвращается, когда circuit breaker в состоянии open.

View Source
var ErrDeleteNotSupported = errors.New("vector store does not support DeleteByParentID")

ErrDeleteNotSupported возвращается, если DeleteDocument вызван, но underlying VectorStore не реализует DocumentStore capability.

View Source
var ErrEmptyDocumentID = errors.New("document ID must not be empty")

ErrEmptyDocumentID возвращается, если передан пустой ID документа.

View Source
var ErrHybridNotSupported = errors.New("vector store does not support hybrid search")

ErrHybridNotSupported возвращается, если метод гибридного поиска вызван, но underlying VectorStore не поддерживает HybridSearcher capability.

View Source
var ErrStreamingNotSupported = errors.New("LLM provider does not support streaming")

ErrStreamingNotSupported возвращается, если streaming-метод вызван, но underlying LLMProvider не поддерживает StreamingLLMProvider capability.

View Source
var IsRetryable = resilience.IsRetryable

IsRetryable проверяет, является ли ошибка retryable. Context cancellation ошибки всегда non-retryable. Ошибки без явного флага считаются retryable (безопасный default для transient errors).

View Source
var WrapNonRetryable = resilience.WrapNonRetryable

WrapNonRetryable помечает ошибку как non-retryable (не будет повторяться).

View Source
var WrapRetryable = resilience.WrapRetryable

WrapRetryable помечает ошибку как retryable.

Functions

func ChromaCollectionExists

func ChromaCollectionExists(ctx context.Context, opts ChromaDBOptions) (bool, error)

ChromaCollectionExists проверяет существование коллекции в ChromaDB.

Использует GET /api/v1/collections/{name}. Возвращает true при статусе 200, false при 404.

func CollectionExists

func CollectionExists(ctx context.Context, opts QdrantOptions) (bool, error)

CollectionExists проверяет существование коллекции в Qdrant.

@ds-task T2.4: Проверка существования коллекции

func CreateChromaCollection

func CreateChromaCollection(ctx context.Context, opts ChromaDBOptions) error

CreateChromaCollection создаёт коллекцию в ChromaDB.

Использует POST /api/v1/collections с указанным именем и размерностью.

func CreateCollection

func CreateCollection(ctx context.Context, opts QdrantOptions) error

CreateCollection создаёт коллекцию в Qdrant с указанной размерностью.

@ds-task T2.4: Миграция CreateCollection (AC-005)

func CreateWeaviateCollection

func CreateWeaviateCollection(ctx context.Context, opts WeaviateOptions) error

CreateWeaviateCollection создаёт коллекцию (Weaviate class) со схемой для хранения чанков. Если коллекция уже существует — не возвращает ошибку (идемпотентно через 422).

@ds-task T3.1: CreateWeaviateCollection → POST /v1/schema (RQ-007)

func DeleteChromaCollection

func DeleteChromaCollection(ctx context.Context, opts ChromaDBOptions) error

DeleteChromaCollection удаляет коллекцию из ChromaDB.

Использует DELETE /api/v1/collections/{name}. 404 считается успехом (идемпотентность).

func DeleteCollection

func DeleteCollection(ctx context.Context, opts QdrantOptions) error

DeleteCollection удаляет коллекцию из Qdrant.

@ds-task T2.4: Миграция DeleteCollection (AC-005)

func DeleteWeaviateCollection

func DeleteWeaviateCollection(ctx context.Context, opts WeaviateOptions) error

DeleteWeaviateCollection удаляет коллекцию из Weaviate. 404 считается успехом (идемпотентность).

@ds-task T3.1: DeleteWeaviateCollection → DELETE /v1/schema/{class}

func MigratePGVector

func MigratePGVector(ctx context.Context, db *sql.DB, opts PGVectorMigrateOptions) error

MigratePGVector применяет версионированные миграции схемы pgvector-хранилища.

Миграции идемпотентны и безопасны при повторном запуске.

Источник истины DDL — SQL-миграции, встроенные в бинарь через `go:embed` (см. `pkg/draftrag/migrations/pgvector/` и `pkg/draftrag/pgvector_migrations.md`).

func SetupPGVector

func SetupPGVector(ctx context.Context, db *sql.DB, opts PGVectorOptions) error

SetupPGVector — backward-compatible alias для MigratePGVector.

Примечание (production): рекомендуется запускать миграции отдельным шагом деплоя (deploy job / init container), т.к. DDL может требовать повышенных прав и занимать заметное время.

Рекомендуемый подход:

  • для production: применять SQL-миграции из `pkg/draftrag/migrations/pgvector/` отдельным шагом деплоя (см. `pkg/draftrag/pgvector_migrations.md`);
  • при необходимости — вызывать SetupPGVector/MigratePGVector явно в deploy job, но не “на старте сервиса”.

Смена IndexMethod или параметров индекса приводит к стратегии drop+create для embedding-индекса (без CONCURRENTLY).

func WeaviateCollectionExists

func WeaviateCollectionExists(ctx context.Context, opts WeaviateOptions) (bool, error)

WeaviateCollectionExists проверяет существование коллекции в Weaviate. Возвращает true при статусе 200, false при 404.

@ds-task T3.1: WeaviateCollectionExists → GET /v1/schema/{class}

Types

type AnthropicLLMOptions

type AnthropicLLMOptions struct {
	// BaseURL — базовый URL Anthropic API (например, "https://api.anthropic.com").
	BaseURL string
	// APIKey — ключ доступа. Передаётся в заголовке X-API-Key.
	APIKey string
	// Model — имя модели. Если пустая строка, используется claude-3-haiku-20240307.
	Model string
	// AnthropicVersion — версия API. Если пустая строка, используется "2023-06-01".
	AnthropicVersion string

	// Temperature — параметр генерации; если nil, параметр не передаётся в запросе.
	Temperature *float64
	// MaxTokens — лимит выходных токенов; если nil, используется дефолт (1024).
	MaxTokens *int

	// HTTPClient — опциональный клиент; если nil, используется http.DefaultClient.
	HTTPClient *http.Client
	// Timeout — опциональный таймаут на один вызов Generate (не применяется к GenerateStream).
	Timeout time.Duration
}

AnthropicLLMOptions задаёт параметры для Anthropic (Claude) LLMProvider.

type BasicChunkerOptions

type BasicChunkerOptions struct {
	// ChunkSize — целевой размер чанка в рунах (обязательно > 0).
	ChunkSize int
	// Overlap — перекрытие между чанками в рунах (обязательно >= 0 и < ChunkSize).
	Overlap int
	// MaxChunks — максимальное количество возвращаемых чанков (>= 0). 0 означает “без лимита”.
	//
	// Если MaxChunks > 0, чанкер возвращает префикс первых MaxChunks чанков (best-effort, без ошибки).
	MaxChunks int
}

BasicChunkerOptions задаёт параметры для базового Chunker.

type CacheOptions

type CacheOptions struct {
	// MaxSize — максимальное количество записей в LRU-кэше.
	// 0 → 1000.
	MaxSize int

	// Redis — опциональный Redis L2 кэш.
	Redis RedisCacheOptions

	// Logger — опциональный структурированный логгер для событий кэша.
	// nil означает no-op.
	Logger Logger
}

CacheOptions задаёт параметры кэширующего embedder'а.

type CachedEmbedder

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

CachedEmbedder оборачивает Embedder двухуровневым LRU-кэшем. Повторные запросы для одного текста не идут в API. Реализует Embedder.

func NewCachedEmbedder

func NewCachedEmbedder(e Embedder, opts CacheOptions) (*CachedEmbedder, error)

NewCachedEmbedder создаёт кэширующий embedder с in-memory LRU.

embedder := draftrag.NewCachedEmbedder(
    draftrag.NewOpenAICompatibleEmbedder(...),
    draftrag.CacheOptions{MaxSize: 5000},
)
pipeline := draftrag.NewPipeline(store, llm, embedder)

func (*CachedEmbedder) Embed

func (c *CachedEmbedder) Embed(ctx context.Context, text string) ([]float64, error)

Embed реализует Embedder.

func (*CachedEmbedder) Stats

func (c *CachedEmbedder) Stats() EmbedCacheStats

Stats возвращает текущую статистику кэша (попадания, промахи, вытеснения).

type ChromaDBOptions

type ChromaDBOptions struct {
	// BaseURL — базовый URL ChromaDB HTTP API. Если пустая строка, используется http://localhost:8000.
	BaseURL string
	// Collection — имя коллекции (обязательно).
	Collection string
	// Dimension — фиксированная размерность embedding-векторов (обязательно > 0).
	Dimension int
	// HTTP таймаут (по умолчанию: 10s)
	Timeout time.Duration
}

ChromaDBOptions задаёт параметры для ChromaDB VectorStore.

func (ChromaDBOptions) Validate

func (o ChromaDBOptions) Validate() error

Validate проверяет корректность опций.

type Chunk

type Chunk = domain.Chunk

Chunk представляет фрагмент документа.

type Chunker

type Chunker = domain.Chunker

Chunker определяет интерфейс для разбиения документа на чанки.

func NewBasicChunker

func NewBasicChunker(opts BasicChunkerOptions) Chunker

NewBasicChunker создаёт базовую реализацию Chunker.

Реализация детерминированно разбивает Document.Content на чанки фиксированного размера по рунам, поддерживает overlap и ограничение MaxChunks, уважает context отмену.

Ошибки конфигурации возвращаются из Chunk и сопоставимы через errors.Is с ErrInvalidChunkerConfig.

type CircuitBreakerStats

type CircuitBreakerStats = resilience.Stats

CircuitBreakerStats — статистика circuit breaker.

type CircuitState

type CircuitState = resilience.CircuitState

CircuitState — состояние circuit breaker.

type Document

type Document = domain.Document

Document представляет документ для индексации в RAG-системе.

type DocumentStore

type DocumentStore = domain.DocumentStore

DocumentStore — опциональная capability VectorStore для удаления по ParentID.

type EmbedCacheStats

type EmbedCacheStats = cache.Stats

EmbedCacheStats — статистика LRU-кэша embedder'а.

type Embedder

type Embedder = domain.Embedder

Embedder определяет интерфейс для преобразования текста в векторное представление.

func NewOllamaEmbedder

func NewOllamaEmbedder(opts OllamaEmbedderOptions) Embedder

NewOllamaEmbedder создаёт Ollama реализацию Embedder.

Ошибки конфигурации возвращаются из Embed и сопоставимы через errors.Is с ErrInvalidEmbedderConfig.

func NewOpenAICompatibleEmbedder

func NewOpenAICompatibleEmbedder(opts OpenAICompatibleEmbedderOptions) Embedder

NewOpenAICompatibleEmbedder создаёт OpenAI-compatible реализацию Embedder.

Ошибки конфигурации возвращаются из Embed и сопоставимы через errors.Is с ErrInvalidEmbedderConfig.

type HookStage

type HookStage = domain.HookStage

HookStage описывает стадию выполнения pipeline, которую можно наблюдать через Hooks.

type Hooks

type Hooks = domain.Hooks

Hooks — опциональные хуки наблюдаемости для стадий pipeline.

type HybridConfig

type HybridConfig = domain.HybridConfig

HybridConfig задаёт параметры гибридного поиска (BM25 + semantic).

type HybridSearcher

type HybridSearcher = domain.HybridSearcher

HybridSearcher — опциональная capability интерфейса VectorStore, поддерживающая гибридный поиск (BM25 + semantic).

type IndexBatchError

type IndexBatchError = domain.IndexBatchError

IndexBatchError представляет ошибку индексации конкретного документа при batch-индексации.

type IndexBatchResult

type IndexBatchResult = domain.IndexBatchResult

IndexBatchResult содержит результат batch-индексации документов.

type InlineCitation

type InlineCitation = domain.InlineCitation

InlineCitation задаёт соответствие номера цитаты `[n]` и retrieval-источника (чанка).

type LLMProvider

type LLMProvider = domain.LLMProvider

LLMProvider определяет интерфейс для генерации текста через LLM.

func NewAnthropicLLM

func NewAnthropicLLM(opts AnthropicLLMOptions) LLMProvider

NewAnthropicLLM создаёт Anthropic (Claude) реализацию LLMProvider.

Возвращаемый тип реализует также StreamingLLMProvider — используйте type assertion для streaming. Ошибки конфигурации возвращаются из Generate/GenerateStream и сопоставимы через errors.Is с ErrInvalidLLMConfig.

func NewOllamaLLM

func NewOllamaLLM(opts OllamaLLMOptions) LLMProvider

NewOllamaLLM создаёт Ollama реализацию LLMProvider.

Ошибки конфигурации возвращаются из Generate и сопоставимы через errors.Is с ErrInvalidLLMConfig.

func NewOpenAICompatibleLLM

func NewOpenAICompatibleLLM(opts OpenAICompatibleLLMOptions) LLMProvider

NewOpenAICompatibleLLM создаёт OpenAI-compatible реализацию LLMProvider (Responses API).

Возвращаемый тип реализует также StreamingLLMProvider — используйте type assertion для streaming. Ошибки конфигурации возвращаются из Generate/GenerateStream и сопоставимы через errors.Is с ErrInvalidLLMConfig.

type LogField

type LogField = domain.LogField

LogField — структурированное поле лог-события.

type LogLevel

type LogLevel = domain.LogLevel

LogLevel — уровень логирования.

type Logger

type Logger = domain.Logger

Logger — опциональный структурированный логгер для инфраструктурных событий (кэш, retry). nil означает no-op.

type MetadataFilter

type MetadataFilter = domain.MetadataFilter

MetadataFilter задаёт условие точного совпадения по полям метаданных документа при поиске. Пустой Fields (nil или len==0) означает «без фильтра». Все условия применяются как AND: все пары ключ-значение из Fields должны совпасть.

@ds-task T3.2: Переэкспортировать MetadataFilter из domain в публичный API (RQ-005, RQ-006, AC-003)

type OllamaEmbedderOptions

type OllamaEmbedderOptions struct {
	// BaseURL — базовый URL Ollama API. Если пустая строка, используется http://localhost:11434.
	BaseURL string
	// Model — имя модели эмбеддингов (обязательно).
	Model string
	// APIKey — опциональный ключ доступа (для кастомных инстансов с авторизацией).
	APIKey string

	// HTTPClient — опциональный клиент; если nil, используется http.DefaultClient.
	HTTPClient *http.Client
	// Timeout — опциональный таймаут на один вызов Embed.
	Timeout time.Duration
}

OllamaEmbedderOptions задаёт параметры для Ollama Embedder.

type OllamaLLMOptions

type OllamaLLMOptions struct {
	// BaseURL — базовый URL Ollama API. Если пустая строка, используется http://localhost:11434.
	BaseURL string
	// Model — имя модели (обязательно).
	Model string
	// APIKey — опциональный ключ доступа (для кастомных инстансов с авторизацией).
	APIKey string

	// Temperature — параметр генерации; если nil, параметр не передаётся в запросе.
	Temperature *float64
	// MaxTokens — лимит выходных токенов; если nil, параметр не передаётся в запросе.
	MaxTokens *int

	// HTTPClient — опциональный клиент; если nil, используется http.DefaultClient.
	HTTPClient *http.Client
	// Timeout — опциональный таймаут на один вызов Generate.
	Timeout time.Duration
}

OllamaLLMOptions задаёт параметры для Ollama LLMProvider.

type OpenAICompatibleEmbedderOptions

type OpenAICompatibleEmbedderOptions struct {
	// BaseURL — базовый URL провайдера (например, "https://api.openai.com").
	BaseURL string
	// APIKey — ключ доступа. Передаётся в заголовке Authorization: Bearer.
	APIKey string
	// Model — имя embeddings модели.
	Model string

	// HTTPClient — опциональный клиент; если nil, используется http.DefaultClient.
	HTTPClient *http.Client
	// Timeout — опциональный таймаут на один вызов Embed.
	Timeout time.Duration
}

OpenAICompatibleEmbedderOptions задаёт параметры для OpenAI-compatible Embedder.

type OpenAICompatibleLLMOptions

type OpenAICompatibleLLMOptions struct {
	// BaseURL — базовый URL провайдера (например, "https://api.openai.com").
	BaseURL string
	// APIKey — ключ доступа. Передаётся в заголовке Authorization: Bearer.
	APIKey string
	// Model — имя модели.
	Model string

	// Temperature — параметр генерации; если nil, параметр не передаётся в запросе.
	Temperature *float64
	// MaxOutputTokens — лимит выходных токенов; если nil, параметр не передаётся в запросе.
	MaxOutputTokens *int

	// HTTPClient — опциональный клиент; если nil, используется http.DefaultClient.
	HTTPClient *http.Client
	// Timeout — опциональный таймаут на один вызов Generate.
	Timeout time.Duration
}

OpenAICompatibleLLMOptions задаёт параметры для OpenAI-compatible LLMProvider (Responses API).

type PGVectorMigrateOptions

type PGVectorMigrateOptions struct {
	PGVectorOptions

	// DDLTimeout — дефолтный таймаут для миграций, если у ctx нет deadline.
	// Если 0 — используется 30s.
	DDLTimeout time.Duration
}

PGVectorMigrateOptions задаёт параметры миграций схемы pgvector-хранилища.

type PGVectorOptions

type PGVectorOptions struct {
	// TableName — имя таблицы для хранения чанков.
	// В v1 поддерживается только простой идентификатор без схемы (например, "draftrag_chunks").
	TableName string

	// EmbeddingDimension — фиксированная размерность embedding-векторов.
	// При несоответствии размерности операции store возвращают ErrEmbeddingDimensionMismatch (errors.Is).
	EmbeddingDimension int

	// CreateExtension включает попытку выполнить `CREATE EXTENSION IF NOT EXISTS vector`.
	// Часто требует повышенных прав; при отсутствии прав будет возвращена ошибка.
	CreateExtension bool

	// IndexMethod — метод индекса: "ivfflat" (по умолчанию) или "hnsw".
	IndexMethod string

	// Lists — параметр ivfflat индекса (WITH (lists = N)).
	Lists int
}

PGVectorOptions задаёт параметры подключения pgvector-backed VectorStore.

type PGVectorRuntimeOptions

type PGVectorRuntimeOptions struct {
	// SearchTimeout — дефолтный таймаут для Search*, если у ctx нет deadline.
	SearchTimeout time.Duration
	// UpsertTimeout — дефолтный таймаут для Upsert, если у ctx нет deadline.
	UpsertTimeout time.Duration
	// DeleteTimeout — дефолтный таймаут для Delete, если у ctx нет deadline.
	DeleteTimeout time.Duration

	// MaxTopK ограничивает topK в Search*. 0 означает “без лимита”.
	MaxTopK int
	// MaxParentIDs ограничивает количество ParentIDs в фильтре. 0 означает “без лимита”.
	MaxParentIDs int
	// MaxContentBytes ограничивает размер chunk.Content в байтах. 0 означает “без лимита”.
	MaxContentBytes int
}

PGVectorRuntimeOptions задаёт лимиты и таймауты выполнения операций VectorStore.

type PGVectorStoreOptions

type PGVectorStoreOptions struct {
	PGVectorOptions
	Runtime PGVectorRuntimeOptions
}

PGVectorStoreOptions — единый контейнер опций для NewPGVectorStore*.

Объединяет параметры подключения/схемы (PGVectorOptions) и runtime ограничения (PGVectorRuntimeOptions), чтобы публичный API следовал единому options pattern.

type ParentIDFilter

type ParentIDFilter = domain.ParentIDFilter

ParentIDFilter задаёт фильтрацию retrieval по ParentID.

type Pipeline

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

Pipeline — публичный API для композиции core-компонентов draftRAG. Валидация входных данных выполняется здесь (см. errors.go).

func NewPipeline

func NewPipeline(store VectorStore, llm LLMProvider, embedder Embedder) *Pipeline

NewPipeline создаёт pipeline из зависимостей: VectorStore, LLMProvider и Embedder.

func NewPipelineWithChunker

func NewPipelineWithChunker(store VectorStore, llm LLMProvider, embedder Embedder, chunker Chunker) *Pipeline

NewPipelineWithChunker создаёт pipeline из зависимостей: VectorStore, LLMProvider, Embedder и Chunker.

При наличии Chunker метод Index будет индексировать чанки (Chunker.Chunk → Embed → Upsert).

func NewPipelineWithOptions

func NewPipelineWithOptions(store VectorStore, llm LLMProvider, embedder Embedder, opts PipelineOptions) *Pipeline

NewPipelineWithOptions создаёт pipeline из зависимостей: VectorStore, LLMProvider и Embedder, применяя конфигурацию из PipelineOptions.

DefaultTopK: - 0: используется значение по умолчанию (5) - <0: panic (ошибка конфигурации)

Chunker: - nil: используется legacy индексирование (1 документ = 1 чанк) - not nil: используется чанкинг (Chunk→Embed→Upsert)

func (*Pipeline) Answer

func (p *Pipeline) Answer(ctx context.Context, question string) (string, error)

Answer генерирует ответ с topK по умолчанию (PipelineOptions.DefaultTopK или 5). Для расширенных параметров используйте Search builder.

func (*Pipeline) DeleteDocument

func (p *Pipeline) DeleteDocument(ctx context.Context, docID string) error

DeleteDocument удаляет документ и все его чанки по ID документа (ParentID). Требует, чтобы VectorStore реализовывал DocumentStore capability. Если store не поддерживает — возвращает ErrDeleteNotSupported.

func (*Pipeline) Index

func (p *Pipeline) Index(ctx context.Context, docs []Document) error

Index индексирует документы.

func (*Pipeline) IndexBatch

func (p *Pipeline) IndexBatch(ctx context.Context, docs []Document, batchSize int) (*IndexBatchResult, error)

IndexBatch индексирует документы параллельно с ограничением concurrency.

В отличие от Index, IndexBatch обрабатывает документы конкурентно (batchSize workers) и возвращает partial results: успешно проиндексированные документы и ошибки отдельно. Ошибка одного документа не прерывает обработку остальных.

batchSize — количество параллельных workers (0 → значение по умолчанию 4). Для управления concurrency и rate limiting используйте PipelineOptions.IndexConcurrency и PipelineOptions.IndexBatchRateLimit при создании Pipeline.

func (*Pipeline) Query

func (p *Pipeline) Query(ctx context.Context, question string) (RetrievalResult, error)

Query выполняет поиск с topK по умолчанию (PipelineOptions.DefaultTopK или 5). Для расширенных параметров используйте Search builder.

func (*Pipeline) Retrieve

func (p *Pipeline) Retrieve(ctx context.Context, question string, topK int) (RetrievalResult, error)

Retrieve выполняет поиск по вопросу с заданным topK и возвращает RetrievalResult. Удобен для прямой передачи в eval.Run (реализует eval.RetrievalRunner). Для цепочки с фильтрами, hybrid и другими параметрами используйте Search builder.

func (*Pipeline) Search

func (p *Pipeline) Search(question string) *SearchBuilder

Search создаёт SearchBuilder для заданного вопроса. По умолчанию TopK берётся из PipelineOptions.DefaultTopK (или 5).

func (*Pipeline) UpdateDocument

func (p *Pipeline) UpdateDocument(ctx context.Context, doc Document) error

UpdateDocument удаляет все чанки документа и переиндексирует его. Атомарности нет: при ошибке переиндексации старые чанки уже удалены. Требует DocumentStore capability.

type PipelineOptions

type PipelineOptions struct {
	// DefaultTopK — значение topK по умолчанию для Query/Answer.
	// Если 0, используется значение по умолчанию (5).
	// Если < 0, это считается ошибкой конфигурации (panic).
	DefaultTopK int
	// SystemPrompt — переопределение system prompt для Answer*. Пустая строка означает дефолт v1.
	SystemPrompt string
	// Chunker — опциональный чанкер; если не nil, Index индексирует чанки (Chunk→Embed→Upsert).
	Chunker Chunker
	// Hooks — опциональные хуки наблюдаемости для стадий pipeline (chunking/embed/search/generate).
	// nil означает no-op.
	Hooks Hooks

	// MaxContextChars — лимит размера секции “Контекст:” в prompt для Answer* (в символах).
	// 0 означает “без лимита”.
	MaxContextChars int
	// MaxContextChunks — лимит количества чанков, попадающих в секцию “Контекст:” в prompt для Answer*.
	// 0 означает “без лимита”.
	MaxContextChunks int

	// DedupSourcesByParentID включает дедупликацию retrieval sources по ParentID.
	// По умолчанию выключено (backward compatibility).
	DedupSourcesByParentID bool

	// MMREnabled включает MMR rerank/selection для retrieval sources (диверсификация контекста).
	// По умолчанию выключено (backward compatibility).
	MMREnabled bool
	// MMRLambda задаёт баланс релевантность/разнообразие в диапазоне [0..1].
	// Если 0 и MMR включён — используется значение по умолчанию (0.5).
	MMRLambda float64
	// MMRCandidatePool задаёт сколько кандидатов запросить у VectorStore до отбора.
	// Если 0 — используется topK запроса.
	MMRCandidatePool int

	// IndexConcurrency задаёт количество workers для параллельной индексации в IndexBatch.
	// Если 0 — используется значение по умолчанию (4).
	IndexConcurrency int
	// IndexBatchRateLimit задаёт максимальное количество вызовов Embed в секунду в IndexBatch.
	// Если 0 — без ограничений.
	IndexBatchRateLimit int

	// Reranker — опциональный reranker, применяется после retrieval.
	// nil означает "без reranking".
	Reranker Reranker
}

PipelineOptions задаёт конфигурацию Pipeline.

type QdrantOptions

type QdrantOptions struct {
	// URL адрес Qdrant сервера (по умолчанию: http://localhost:6333)
	URL string
	// Имя коллекции для хранения чанков
	Collection string
	// Размерность векторов (обязательно)
	Dimension int
	// HTTP таймаут (по умолчанию: 10s)
	Timeout time.Duration
}

QdrantOptions задаёт опции для подключения к Qdrant.

@ds-task T2.4: Опции подключения к Qdrant (RQ-003)

func (QdrantOptions) Validate

func (o QdrantOptions) Validate() error

Validate проверяет корректность опций.

type RedisCacheClient

type RedisCacheClient interface {
	GetBytes(ctx context.Context, key string) ([]byte, error)
	SetBytes(ctx context.Context, key string, value []byte, ttl time.Duration) error
}

RedisCacheClient — адаптер-интерфейс Redis клиента для кэша эмбеддингов.

Контракт: - GetBytes: если ключ отсутствует, должен возвращать (nil, nil). - ttl == 0 означает запись без TTL.

type RedisCacheOptions

type RedisCacheOptions struct {
	// Client — Redis клиент; nil отключает Redis кэш.
	Client RedisCacheClient

	// TTL — время жизни записей в Redis (0 → без TTL).
	TTL time.Duration

	// KeyPrefix — префикс ключей в Redis ("" → дефолт `draftrag:embedder:`).
	KeyPrefix string
}

RedisCacheOptions задаёт параметры Redis second-level cache.

type Reranker

type Reranker = domain.Reranker

Reranker — опциональный интерфейс для переранжирования результатов retrieval.

type RetrievalResult

type RetrievalResult = domain.RetrievalResult

RetrievalResult содержит результаты поиска.

type RetryEmbedder

type RetryEmbedder struct {
	*resilience.RetryEmbedder
}

RetryEmbedder — обёртка для Embedder с retry и circuit breaker. Реализует Embedder. Дополнительно предоставляет CircuitBreakerState() и CircuitBreakerStats().

func NewRetryEmbedder

func NewRetryEmbedder(e Embedder, opts RetryOptions) *RetryEmbedder

NewRetryEmbedder оборачивает embedder с retry и circuit breaker. Нулевые поля RetryOptions используют defaults (MaxRetries=3, CBThreshold=5).

Для использования в Pipeline передайте как Embedder:

re := draftrag.NewRetryEmbedder(embedder, draftrag.RetryOptions{})
pipeline := draftrag.NewPipeline(store, llm, re)

Для доступа к состоянию circuit breaker используйте type assertion:

if re, ok := embedder.(*draftrag.RetryEmbedder); ok {
    fmt.Println(re.CircuitBreakerState())
}

type RetryLLMProvider

type RetryLLMProvider struct {
	*resilience.RetryLLMProvider
}

RetryLLMProvider — обёртка для LLMProvider с retry и circuit breaker. Реализует LLMProvider. Дополнительно предоставляет CircuitBreakerState() и CircuitBreakerStats().

func NewRetryLLMProvider

func NewRetryLLMProvider(l LLMProvider, opts RetryOptions) *RetryLLMProvider

NewRetryLLMProvider оборачивает LLM провайдер с retry и circuit breaker. Нулевые поля RetryOptions используют defaults (MaxRetries=3, CBThreshold=5).

Для использования в Pipeline передайте как LLMProvider:

rl := draftrag.NewRetryLLMProvider(llm, draftrag.RetryOptions{})
pipeline := draftrag.NewPipeline(store, rl, embedder)

type RetryOptions

type RetryOptions struct {
	// MaxRetries — максимальное количество повторных попыток (0 → 3).
	MaxRetries int

	// BaseDelay — начальная задержка перед первым retry (0 → 100ms).
	BaseDelay time.Duration

	// MaxDelay — максимальная задержка (0 → 10s).
	MaxDelay time.Duration

	// Multiplier — множитель exponential backoff (0 → 2.0).
	Multiplier float64

	// JitterFactor — доля случайной составляющей (0 → 0.25).
	JitterFactor float64

	// CBThreshold — порог ошибок для перехода circuit breaker в open (0 → 5).
	CBThreshold int

	// CBTimeout — время восстановления circuit breaker (0 → 30s).
	CBTimeout time.Duration

	// Logger — опциональный структурированный логгер для retry/CB событий.
	// nil означает no-op.
	Logger Logger
}

RetryOptions объединяет настройки retry и circuit breaker. Нулевые значения используют безопасные defaults.

type SearchBuilder

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

SearchBuilder накапливает параметры поиска и позволяет выполнить поисковый или генеративный запрос через цепочку вызовов. Создаётся через Pipeline.Search.

Пример:

// Поиск
result, err := pipeline.Search("вопрос").TopK(5).Retrieve(ctx)

// Ответ с фильтром
answer, err := pipeline.Search("вопрос").TopK(5).Filter(f).Answer(ctx)

// Inline цитаты
answer, sources, cits, err := pipeline.Search("вопрос").TopK(5).InlineCite(ctx)

// Streaming
tokens, err := pipeline.Search("вопрос").TopK(5).Stream(ctx)

func (*SearchBuilder) Answer

func (b *SearchBuilder) Answer(ctx context.Context) (string, error)

Answer выполняет RAG-ответ и возвращает строку.

func (*SearchBuilder) Cite

Cite выполняет RAG-ответ и возвращает ответ + источники (чанки со score). Поддерживает полный routing: HyDE > MultiQuery > Hybrid > ParentIDs > Filter > basic.

func (*SearchBuilder) Filter

Filter задаёт AND-фильтр по полям метаданных документа. Совместим только с хранилищами, реализующими VectorStoreWithFilters.

func (*SearchBuilder) HyDE

func (b *SearchBuilder) HyDE() *SearchBuilder

HyDE включает Hypothetical Document Embeddings. LLM генерирует гипотетический ответ на вопрос, который используется для embedding-поиска. Улучшает recall для сложных вопросов. Не совместим с Hybrid.

func (*SearchBuilder) Hybrid

func (b *SearchBuilder) Hybrid(cfg HybridConfig) *SearchBuilder

Hybrid включает гибридный поиск (BM25 + semantic) с заданной конфигурацией. Совместим только с хранилищами, реализующими HybridSearcher.

func (*SearchBuilder) InlineCite

InlineCite выполняет RAG-ответ с inline-цитатами `[n]`. LLM расставляет ссылки в тексте; citations содержит только использованные источники. Поддерживает полный routing: HyDE > MultiQuery > Hybrid > ParentIDs > Filter > basic.

func (*SearchBuilder) MultiQuery

func (b *SearchBuilder) MultiQuery(n int) *SearchBuilder

MultiQuery включает multi-query retrieval: LLM генерирует n перефразировок вопроса, результаты каждого поиска объединяются через Reciprocal Rank Fusion. n=0 → использует дефолт (3).

func (*SearchBuilder) ParentIDs

func (b *SearchBuilder) ParentIDs(ids ...string) *SearchBuilder

ParentIDs ограничивает поиск чанками из указанных документов.

func (*SearchBuilder) Retrieve

func (b *SearchBuilder) Retrieve(ctx context.Context) (RetrievalResult, error)

Retrieve выполняет поиск и возвращает RetrievalResult.

func (*SearchBuilder) Stream

func (b *SearchBuilder) Stream(ctx context.Context) (<-chan string, error)

Stream выполняет RAG-ответ через streaming (токен за токеном). Если LLM не поддерживает streaming — возвращает ErrStreamingNotSupported. Поддерживает полный routing: HyDE > MultiQuery > Hybrid > ParentIDs > Filter > basic.

func (*SearchBuilder) StreamCite

func (b *SearchBuilder) StreamCite(ctx context.Context) (<-chan string, RetrievalResult, []InlineCitation, error)

StreamCite выполняет RAG-ответ через streaming с inline-цитатами. sources и citations готовы сразу (поиск синхронный); токены — асинхронно. Если LLM не поддерживает streaming — возвращает ErrStreamingNotSupported. Поддерживает полный routing: HyDE > MultiQuery > Hybrid > ParentIDs > Filter > basic.

func (*SearchBuilder) StreamSources

func (b *SearchBuilder) StreamSources(ctx context.Context) (<-chan string, RetrievalResult, error)

StreamSources выполняет RAG-ответ через streaming с синхронно готовым списком источников. sources готов сразу (поиск синхронный); токены — асинхронно через канал. Если LLM не поддерживает streaming — возвращает ErrStreamingNotSupported. Поддерживает полный routing: HyDE > MultiQuery > Hybrid > ParentIDs > Filter > basic.

@ds-task T2.1: потоковый аналог Cite без inline-разметки (AC-001, AC-002, DEC-002)

func (*SearchBuilder) TopK

func (b *SearchBuilder) TopK(n int) *SearchBuilder

TopK задаёт количество возвращаемых чанков.

type StageEndEvent

type StageEndEvent = domain.StageEndEvent

StageEndEvent — событие завершения стадии pipeline.

type StageStartEvent

type StageStartEvent = domain.StageStartEvent

StageStartEvent — событие начала стадии pipeline.

type StreamingLLMProvider

type StreamingLLMProvider = domain.StreamingLLMProvider

StreamingLLMProvider — опциональная capability интерфейса LLMProvider, поддерживающая streaming.

type VectorStore

type VectorStore = domain.VectorStore

VectorStore определяет интерфейс для работы с векторным хранилищем.

func NewChromaDBStore

func NewChromaDBStore(opts ChromaDBOptions) (VectorStore, error)

NewChromaDBStore создаёт ChromaDB-backed реализацию VectorStore.

Коллекция должна быть создана заранее. Для управления коллекциями используйте CreateChromaCollection.

func NewInMemoryStore

func NewInMemoryStore() VectorStore

NewInMemoryStore создаёт in-memory реализацию VectorStore.

Подходит для прототипирования и тестирования — данные хранятся только в памяти и не сохраняются между перезапусками процесса.

func NewPGVectorStore

func NewPGVectorStore(db *sql.DB, opts PGVectorOptions) VectorStore

NewPGVectorStore создаёт pgvector-backed реализацию VectorStore.

Схема БД не создаётся автоматически: перед использованием примените миграции через MigratePGVector (или SetupPGVector как backward-compatible alias).

Если у ctx нет deadline, операции store используют дефолтные таймауты (см. PGVectorRuntimeOptions).

func NewPGVectorStoreWithOptions

func NewPGVectorStoreWithOptions(db *sql.DB, opts PGVectorStoreOptions) VectorStore

NewPGVectorStoreWithOptions создаёт pgvector-backed реализацию VectorStore (канонический options pattern).

Схема БД не создаётся автоматически: перед использованием примените миграции через MigratePGVector (или SetupPGVector как backward-compatible alias).

Если у ctx нет deadline, операции store используют дефолтные таймауты (см. PGVectorRuntimeOptions).

func NewPGVectorStoreWithRuntimeOptions deprecated

func NewPGVectorStoreWithRuntimeOptions(db *sql.DB, opts PGVectorOptions, runtime PGVectorRuntimeOptions) VectorStore

NewPGVectorStoreWithRuntimeOptions создаёт pgvector-backed реализацию VectorStore с runtime ограничениями.

Deprecated: используйте NewPGVectorStoreWithOptions (PGVectorStoreOptions.Runtime).

func NewQdrantStore

func NewQdrantStore(opts QdrantOptions) (VectorStore, error)

NewQdrantStore создаёт новый VectorStore на базе Qdrant.

@ds-task T2.4: Фабрика NewQdrantStore (RQ-003)

func NewWeaviateStore

func NewWeaviateStore(opts WeaviateOptions) (VectorStore, error)

NewWeaviateStore создаёт Weaviate-backed реализацию VectorStore. При пустом opts.Host возвращает ErrInvalidVectorStoreConfig.

@ds-task T3.1: NewWeaviateStore с валидацией и ErrInvalidVectorStoreConfig (AC-005, RQ-001)

type VectorStoreWithFilters

type VectorStoreWithFilters = domain.VectorStoreWithFilters

VectorStoreWithFilters — опциональная capability интерфейса VectorStore, поддерживающая фильтры.

type WeaviateOptions

type WeaviateOptions struct {
	// Host — адрес Weaviate, например "localhost:8080" (обязательно).
	Host string
	// Scheme — протокол: "http" или "https". По умолчанию "http".
	Scheme string
	// Collection — имя коллекции (Weaviate class, обязательно).
	Collection string
	// APIKey — API ключ для Weaviate Cloud (опционально).
	APIKey string
	// Timeout — HTTP таймаут (по умолчанию 10s).
	Timeout time.Duration
}

WeaviateOptions задаёт параметры подключения к Weaviate.

@ds-task T3.1: Публичный API WeaviateOptions (AC-005, RQ-001)

func (WeaviateOptions) Validate

func (o WeaviateOptions) Validate() error

Validate проверяет корректность опций.

Directories

Path Synopsis
Package eval provides a small evaluation harness for measuring retrieval quality (Hit@K, MRR, etc).
Package eval provides a small evaluation harness for measuring retrieval quality (Hit@K, MRR, etc).
Package otel содержит готовые OpenTelemetry-хуки для draftRAG pipeline.
Package otel содержит готовые OpenTelemetry-хуки для draftRAG pipeline.

Jump to

Keyboard shortcuts

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