domain

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: 5 Imported by: 0

Documentation

Overview

Package domain содержит интерфейсы и модели domain-слоя.

Index

Constants

This section is empty.

Variables

View Source
var (
	// ErrEmptyDocumentID возвращается при попытке валидировать документ без ID.
	ErrEmptyDocumentID = errors.New("document id is empty")
	// ErrEmptyDocumentContent возвращается при попытке валидировать документ без содержимого.
	ErrEmptyDocumentContent = errors.New("document content is empty")
	// ErrEmptyChunkID возвращается при попытке валидировать чанк без ID.
	ErrEmptyChunkID = errors.New("chunk id is empty")
	// ErrEmptyChunkContent возвращается при попытке валидировать чанк без содержимого.
	ErrEmptyChunkContent = errors.New("chunk content is empty")
	// ErrEmptyChunkParentID возвращается при попытке валидировать чанк без ParentID.
	ErrEmptyChunkParentID = errors.New("chunk parent id is empty")
	// ErrEmptyQueryText возвращается при попытке валидировать запрос без текста.
	ErrEmptyQueryText = errors.New("query text is empty")
	// ErrInvalidQueryTopK возвращается при попытке валидировать TopK <= 0.
	ErrInvalidQueryTopK = errors.New("query topK must be > 0")

	// ErrFilterNotSupported возвращается, если pipeline-метод с MetadataFilter вызван,
	// а underlying VectorStore не реализует VectorStoreWithFilters.
	ErrFilterNotSupported = errors.New("vector store does not support metadata filter")

	// ErrEmbeddingDimensionMismatch возвращается, если размерность embedding-вектора не соответствует ожидаемой.
	//
	// Ошибка предназначена для классификации через errors.Is.
	ErrEmbeddingDimensionMismatch = errors.New("embedding dimension mismatch")

	// ErrInvalidHybridConfig возвращается при невалидной конфигурации гибридного поиска.
	ErrInvalidHybridConfig = errors.New("invalid hybrid config")
)

Functions

func RedactSecret

func RedactSecret(text, secret string) string

RedactSecret заменяет все вхождения секрета в тексте на "<redacted>". Пустой/пробельный secret → no-op.

func RedactSecrets

func RedactSecrets(text string, secrets ...string) string

RedactSecrets последовательно применяет RedactSecret для списка секретов.

func SafeLog

func SafeLog(ctx context.Context, logger Logger, level LogLevel, msg string, fields ...LogField)

SafeLog вызывает logger best-effort: - no-op если logger == nil - защищён recover, чтобы паника логгера не пробивалась наружу

Types

type Chunk

type Chunk struct {
	ID        string
	Content   string
	ParentID  string
	Embedding []float64
	Position  int
	// Metadata хранит произвольные метаданные чанка, унаследованные от родительского документа.
	// nil означает отсутствие метаданных и не влияет на результат Validate.
	Metadata map[string]string
}

Chunk представляет фрагмент документа, полученный в результате чанкинга.

@ds-task T1.2: Добавить поле Metadata в Chunk (DEC-005)

func (Chunk) Validate

func (c Chunk) Validate() error

Validate проверяет инварианты Chunk.

type Chunker

type Chunker interface {
	// Chunk разбивает документ на фрагменты для индексации.
	Chunk(ctx context.Context, doc Document) ([]Chunk, error)
}

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

type CollectionManager

type CollectionManager interface {
	// CreateCollection создаёт коллекцию в хранилище.
	// Idempotent: повторный вызов при уже существующей коллекции возвращает nil.
	CreateCollection(ctx context.Context) error

	// DeleteCollection удаляет коллекцию из хранилища.
	// Idempotent: возвращает nil если коллекция не существует (404).
	DeleteCollection(ctx context.Context) error

	// CollectionExists проверяет существование коллекции.
	// Возвращает (true, nil) если коллекция существует, (false, nil) если нет,
	// (false, error) при сетевой или серверной ошибке.
	CollectionExists(ctx context.Context) (bool, error)
}

CollectionManager — опциональная capability VectorStore для управления жизненным циклом коллекции. Реализации, поддерживающие управление коллекциями, должны реализовывать этот интерфейс дополнительно (без ломки существующего контракта VectorStore).

@ds-task T1.1: Добавить интерфейс CollectionManager в domain (AC-006, DEC-001)

type Document

type Document struct {
	ID        string
	Content   string
	Metadata  map[string]string
	CreatedAt time.Time
	UpdatedAt time.Time
}

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

func (Document) Validate

func (d Document) Validate() error

Validate проверяет инварианты Document.

type DocumentStore

type DocumentStore interface {
	VectorStore
	// DeleteByParentID удаляет все чанки с указанным ParentID.
	DeleteByParentID(ctx context.Context, parentID string) error
}

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

type Embedder

type Embedder interface {
	// Embed преобразует текст в embedding-вектор фиксированной размерности.
	Embed(ctx context.Context, text string) ([]float64, error)
}

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

type Embedding

type Embedding struct {
	Vector    []float64
	Dimension int
	Model     string
}

Embedding представляет векторное представление текста.

type HookStage

type HookStage string

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

const (
	// HookStageChunking — разбиение документа на чанки (только при наличии Chunker).
	HookStageChunking HookStage = "chunking"
	// HookStageEmbed — генерация embedding для текста.
	HookStageEmbed HookStage = "embed"
	// HookStageSearch — поиск в VectorStore.
	HookStageSearch HookStage = "search"
	// HookStageGenerate — генерация ответа LLM.
	HookStageGenerate HookStage = "generate"
)

type Hooks

type Hooks interface {
	StageStart(ctx context.Context, ev StageStartEvent)
	StageEnd(ctx context.Context, ev StageEndEvent)
}

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

В v1 hooks вызываются синхронно: обработчики ДОЛЖНЫ быть лёгкими и быстрыми. При nil hooks pipeline работает как обычно (no-op).

type HybridConfig

type HybridConfig struct {
	// SemanticWeight вес семантического скора (0.0 - 1.0).
	// BM25Weight вычисляется как 1.0 - SemanticWeight.
	// При значении 0.0 используется только BM25, при 1.0 — только семантический.
	// Default: 0.7
	SemanticWeight float64

	// UseRRF если true, используется Reciprocal Rank Fusion вместо weighted score.
	// При UseRRF=true поле SemanticWeight игнорируется.
	// Default: true
	UseRRF bool

	// RRFK константа для RRF-формулы: score = 1/(k + rank).
	// Default: 60
	RRFK int

	// BMFinalK количество результатов, возвращаемых после fusion.
	// Должно быть <= topK.
	// Default: равно topK (0 означает "использовать topK")
	BMFinalK int
}

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

func DefaultHybridConfig

func DefaultHybridConfig() HybridConfig

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

func (HybridConfig) Validate

func (c HybridConfig) Validate() error

Validate проверяет инварианты HybridConfig.

type HybridSearcher

type HybridSearcher interface {
	// SearchHybrid выполняет гибридный поиск: семантический + BM25.
	// Возвращает объединённые результаты с скором от fusion-стратегии.
	SearchHybrid(ctx context.Context, query string, embedding []float64, topK int, config HybridConfig) (RetrievalResult, error)
}

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

type HybridSearcherWithFilters

type HybridSearcherWithFilters interface {
	HybridSearcher

	// SearchHybridWithParentIDFilter выполняет гибридный поиск с фильтрацией по ParentID.
	SearchHybridWithParentIDFilter(ctx context.Context, query string, embedding []float64, topK int, config HybridConfig, filter ParentIDFilter) (RetrievalResult, error)

	// SearchHybridWithMetadataFilter выполняет гибридный поиск с фильтрацией по метаданным.
	SearchHybridWithMetadataFilter(ctx context.Context, query string, embedding []float64, topK int, config HybridConfig, filter MetadataFilter) (RetrievalResult, error)
}

HybridSearcherWithFilters расширяет HybridSearcher фильтрами для гибридного поиска.

type IndexBatchError

type IndexBatchError struct {
	// DocumentID — идентификатор документа, который не удалось проиндексировать.
	DocumentID string
	// Error — оригинальная ошибка (embed, chunking или upsert).
	Error error
}

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

@ds-task T1.1: Добавить тип IndexBatchError для идентификации failed документов (AC-003)

type IndexBatchResult

type IndexBatchResult struct {
	// Successful — документы, успешно проиндексированные (все чанки сохранены).
	Successful []Document
	// Errors — ошибки по документам (partial failure).
	Errors []IndexBatchError
	// ProcessedCount — общее количество обработанных документов (успешных + с ошибками).
	ProcessedCount int
}

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

@ds-task T1.1: Добавить тип IndexBatchResult для возврата результатов batch-индексации (AC-003, AC-004)

type InlineCitation

type InlineCitation struct {
	Number int
	Chunk  RetrievedChunk
}

InlineCitation задаёт детерминированный маппинг номера цитаты (используется как `[n]`) на конкретный retrieval-источник (чанк + score).

Нумерация начинается с 1 и соответствует порядку источников в prompt.

type LLMProvider

type LLMProvider interface {
	// Generate генерирует ответ на основе system и user сообщений.
	Generate(ctx context.Context, systemPrompt, userMessage string) (string, error)
}

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

type LogField

type LogField struct {
	Key   string
	Value any
}

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

type LogLevel

type LogLevel string

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

const (
	LogLevelDebug LogLevel = "debug"
	LogLevelInfo  LogLevel = "info"
	LogLevelWarn  LogLevel = "warn"
	LogLevelError LogLevel = "error"
)

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

type Logger

type Logger interface {
	Log(ctx context.Context, level LogLevel, msg string, fields ...LogField)
}

Logger — минимальный интерфейс структурированного логирования.

Реализация должна быть thread-safe. Любые ошибки/паники логгера не должны ломать основной поток библиотеки: вызывайте логгер через SafeLog.

func NoopLogger

func NoopLogger() Logger

NoopLogger возвращает logger, который игнорирует все события.

type MetadataFilter

type MetadataFilter struct {
	// Fields — карта имён полей метаданных и их ожидаемых строковых значений.
	Fields map[string]string
}

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

@ds-task T1.1: Добавить тип MetadataFilter в domain (RQ-001, DEC-001)

type ParentIDFilter

type ParentIDFilter struct {
	// ParentIDs — список допустимых parent_id. Пустой список означает “без фильтра”.
	ParentIDs []string
}

ParentIDFilter задаёт фильтрацию retrieval по ParentID (например, в пределах одного документа).

type Query

type Query struct {
	Text   string
	TopK   int
	Filter map[string]string
}

Query представляет пользовательский запрос для поиска.

func (Query) Validate

func (q Query) Validate() error

Validate проверяет инварианты Query.

type Reranker

type Reranker interface {
	Rerank(ctx context.Context, query string, chunks []RetrievedChunk) ([]RetrievedChunk, error)
}

Reranker — опциональная capability для переранжирования результатов retrieval. Принимает исходный вопрос и список чанков, возвращает переупорядоченный список. Типичные реализации: cross-encoder, Cohere Rerank, LLM-based scoring.

type RetrievalResult

type RetrievalResult struct {
	Chunks     []RetrievedChunk
	QueryText  string
	TotalFound int
}

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

type RetrievedChunk

type RetrievedChunk struct {
	Chunk Chunk
	Score float64
}

RetrievedChunk представляет чанк с оценкой релевантности в результате поиска.

type StageEndEvent

type StageEndEvent struct {
	Operation string
	Stage     HookStage
	Duration  time.Duration
	Err       error
}

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

type StageStartEvent

type StageStartEvent struct {
	Operation string
	Stage     HookStage
}

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

type StreamingLLMProvider

type StreamingLLMProvider interface {
	LLMProvider

	// GenerateStream генерирует ответ токен за токеном через канал.
	// Возвращает канал для чтения текстовых чанков; канал закрывается при завершении или ошибке.
	GenerateStream(ctx context.Context, systemPrompt, userMessage string) (<-chan string, error)
}

StreamingLLMProvider — опциональная capability интерфейса LLMProvider.

Реализации, которые поддерживают streaming, должны реализовать этот интерфейс дополнительно (без ломки существующего контракта LLMProvider).

@ds-task T1.1: Добавить StreamingLLMProvider интерфейс (DEC-001, AC-004)

type VectorStore

type VectorStore interface {
	// Upsert сохраняет или обновляет чанк в хранилище.
	Upsert(ctx context.Context, chunk Chunk) error

	// Delete удаляет чанк по ID из хранилища.
	Delete(ctx context.Context, id string) error

	// Search выполняет поиск похожих чанков по embedding-вектору.
	// Возвращает результат с релевантными чанками, отсортированными по score (по убыванию).
	Search(ctx context.Context, embedding []float64, topK int) (RetrievalResult, error)
}

VectorStore определяет интерфейс для работы с векторным хранилищем. Реализации должны поддерживать операции upsert, delete и поиска по embedding-вектору.

type VectorStoreWithFilters

type VectorStoreWithFilters interface {
	VectorStore

	// SearchWithFilter выполняет поиск похожих чанков по embedding-вектору с дополнительным фильтром.
	SearchWithFilter(ctx context.Context, embedding []float64, topK int, filter ParentIDFilter) (RetrievalResult, error)

	// SearchWithMetadataFilter выполняет поиск похожих чанков с фильтрацией по полям метаданных.
	// Пустой filter.Fields (nil или len==0) эквивалентно вызову Search без фильтра.
	SearchWithMetadataFilter(ctx context.Context, embedding []float64, topK int, filter MetadataFilter) (RetrievalResult, error)
}

VectorStoreWithFilters — опциональная capability интерфейса VectorStore.

Реализации, которые поддерживают фильтры, должны реализовать этот интерфейс дополнительно (без ломки существующего контракта VectorStore).

@ds-task T1.3: Расширить VectorStoreWithFilters методом SearchWithMetadataFilter (RQ-002, DEC-001)

Jump to

Keyboard shortcuts

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