memory

package
v0.0.0-...-451c6e3 Latest Latest
Warning

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

Go to latest
Published: May 15, 2026 License: Apache-2.0 Imports: 19 Imported by: 0

Documentation

Overview

ollama_embedder.go

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func SplitText

func SplitText(text string, chunkSize, chunkOverlap int) []string

SplitText 将文本按字符数分块,优先在自然边界(句号、换行等)处断开

Types

type CombinedWeights

type CombinedWeights struct {
	VectorWeight  float64 // 向量相似度权重
	KeywordWeight float64 // 关键词匹配权重
	TimeWeight    float64 // 时间衰减权重
}

CombinedWeights 组合召回的各因子权重,总和应为 1.0

func DefaultCombinedWeights

func DefaultCombinedWeights() *CombinedWeights

DefaultCombinedWeights 默认组合权重

type Controller

type Controller struct {
	// 系统提示词 —— 永久存在于上下文底层
	SystemPrompt []*schema.Message

	// 短期记忆管理器 —— 滑动窗口 / 摘要
	ShortMemory ShortMemoryManager

	// 长期记忆存储器 —— 外部持久化 + 向量检索
	LongStore LongTermStore

	// 召回数量
	TopK int
}

Controller 记忆控制器,管理三类记忆

func NewController

func NewController(systemPrompt []*schema.Message, shortMemory ShortMemoryManager, longStore LongTermStore) *Controller

NewController SystemPrompt 系统提示词, ShortMemory 短期记忆管理器, LongStore 长期记忆存储器

func (*Controller) BuildContext

func (c *Controller) BuildContext(ctx context.Context, sessionID string, currentQuery string) ([]*schema.Message, error)

BuildContext 构建带记忆的上文 返回消息顺序:系统提示词 → 长期记忆召回 → 短期记忆(窗口+摘要)

func (*Controller) Clear

func (c *Controller) Clear(ctx context.Context, sessionID string) error

Clear 清空会话

func (*Controller) Close

func (c *Controller) Close() error

Close 释放资源

func (*Controller) GetHistory

func (c *Controller) GetHistory(ctx context.Context, sessionID string) ([]*schema.Message, error)

GetHistory 获取完整历史

func (*Controller) SaveTurn

func (c *Controller) SaveTurn(ctx context.Context, sessionID string, msgs []*schema.Message) error

SaveTurn 保存一轮对话(user + assistant)

type Embedder

type Embedder interface {
	Embed(ctx context.Context, text string) ([]float32, error)
}

Embedder 文本转向量接口

type EmbeddingChunk

type EmbeddingChunk struct {
	ID         string `gorm:"primaryKey;size:64"`
	MessageID  string `gorm:"index;size:64;not null"`  // 关联 MessageModel.ID
	SessionID  string `gorm:"index;size:128;not null"` // 冗余字段,加速查询
	ChunkIndex int    `gorm:"not null"`                // 块序号
	Content    string `gorm:"type:text;not null"`      // 块文本
	Embedding  string `gorm:"type:text"`               // 嵌入向量 JSON
}

EmbeddingChunk 分块嵌入记录,用于长文本分段存储

func (*EmbeddingChunk) GetEmbedding

func (c *EmbeddingChunk) GetEmbedding() ([]float32, error)

func (*EmbeddingChunk) SetEmbedding

func (c *EmbeddingChunk) SetEmbedding(vec []float32) error

func (EmbeddingChunk) TableName

func (EmbeddingChunk) TableName() string

type EmbeddingFunc

type EmbeddingFunc func(ctx context.Context, text string) ([]float32, error)

EmbeddingFunc 文本嵌入函数签名 将文本转换为向量,用于语义相似度搜索

func EmbedderFunc

func EmbedderFunc(e Embedder) EmbeddingFunc

type GormStore

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

GormStore 基于 GORM 的高级记忆存储 完全兼容 Store 接口,可替代 LocalStore/SqliteStore

func NewGormStore

func NewGormStore(config *GormStoreConfig, embedding EmbeddingFunc) (*GormStore, error)

NewGormStore 创建 GORM 记忆存储

func (*GormStore) ClearSession

func (s *GormStore) ClearSession(ctx context.Context, sessionID string) error

ClearSession 清空会话(硬删除 + 同步清理向量索引)

func (*GormStore) Close

func (s *GormStore) Close() error

Close 关闭存储

func (*GormStore) GetSession

func (s *GormStore) GetSession(ctx context.Context, sessionID string) ([]*schema.Message, error)

GetSession 获取完整会话历史

func (*GormStore) GetSessionStats

func (s *GormStore) GetSessionStats(ctx context.Context, sessionID string) (map[string]any, error)

GetSessionStats 获取会话统计

func (*GormStore) GetSessionWithReasoning

func (s *GormStore) GetSessionWithReasoning(ctx context.Context, sessionID string) ([]*schema.Message, error)

GetSessionWithReasoning 获取完整会话历史(含推理内容) 当前实现与 GetSession 相同,因为 MessageModel.ToSchemaMessage 已包含 ReasoningContent 如需扩展(如返回 ToolCalls),可在此添加额外处理

func (*GormStore) IndexReady

func (s *GormStore) IndexReady() bool

IndexReady 返回向量索引是否就绪

func (*GormStore) Recall

func (s *GormStore) Recall(ctx context.Context, sessionID string, query string, topK int) ([]*schema.Message, error)

Recall 智能召回(多策略混合)

func (*GormStore) Save

func (s *GormStore) Save(ctx context.Context, sessionID string, msgs []*schema.Message) error

Save 保存消息(支持批量 + 嵌入生成) 每条消息使用递增时间戳,确保同一轮对话内的顺序正确

func (*GormStore) SearchByRole

func (s *GormStore) SearchByRole(ctx context.Context, sessionID string, role schema.RoleType, limit int) ([]*schema.Message, error)

SearchByRole 按角色搜索

func (*GormStore) SearchByTimeRange

func (s *GormStore) SearchByTimeRange(ctx context.Context, sessionID string, start, end time.Time) ([]*schema.Message, error)

SearchByTimeRange 按时间范围搜索

type GormStoreConfig

type GormStoreConfig struct {
	// DBPath 数据库路径
	DBPath string
	// MaxOpenConns 最大连接数,默认 10
	MaxOpenConns int
	// MaxIdleConns 最大空闲连接数,默认 5
	MaxIdleConns int
	// ConnMaxLifetime 连接最大生命周期,默认 1 小时
	ConnMaxLifetime time.Duration
	// LogLevel GORM 日志级别,默认 Warn
	LogLevel logger.LogLevel
	// DisableVectorSearch 禁用向量搜索(不使用嵌入时设为 true)
	DisableVectorSearch bool
	// EmbeddingDimension 向量维度,默认 768
	EmbeddingDimension int
	// RecallMode 召回策略模式,默认 RecallModeAuto
	RecallMode RecallMode
	// CombinedWeights 组合模式的权重(仅当 RecallModeCombined 时生效)
	CombinedWeights *CombinedWeights
	// ChunkSize 分块大小(中文字符数),0 或负数表示不分块
	ChunkSize int
	// ChunkOverlap 分块重叠大小(中文字符数)
	ChunkOverlap int
}

GormStoreConfig GORM 存储配置

func DefaultGormStoreConfig

func DefaultGormStoreConfig() *GormStoreConfig

DefaultGormStoreConfig 默认配置

type LongTermStore

type LongTermStore interface {
	// Save 保存消息到记忆
	Save(ctx context.Context, sessionID string, msgs []*schema.Message) error

	// Recall 根据查询召回相关记忆
	// query: 查询文本(如用户最新问题)
	// topK: 召回数量
	Recall(ctx context.Context, sessionID string, query string, topK int) ([]*schema.Message, error)

	// GetSession 获取完整会话历史
	GetSession(ctx context.Context, sessionID string) ([]*schema.Message, error)

	// ClearSession 清空会话
	ClearSession(ctx context.Context, sessionID string) error

	// Close 关闭存储
	Close() error
}

LongTermStore 记忆存储接口

type MemNetAIConfig

type MemNetAIConfig struct {
	// APIKey MemNetAI 平台颁发的 API Key(必填)
	APIKey string

	// BaseURL 服务地址,默认 https://api.memnetai.com
	BaseURL string

	// Namespace 命名空间,用于在同一项目内对记忆体进行逻辑隔离。
	// 记忆体的唯一性由「namespace + memoryAgentName」共同决定。
	// 例如可以用用户ID或智能体ID作为命名空间。
	Namespace string

	// Language 记忆语言,如 "zh"、"en" 等,默认 "zh"
	Language string

	// IsThirdPerson 是否以第三人称视角提取记忆摘要,默认 false(第一人称效果更佳)
	IsThirdPerson bool

	// AsyncMode 记忆是否使用异步模式。同步模式立即执行但上下文容量小;异步模式排队但支持大量上下文。
	AsyncMode bool

	// HTTPClient 自定义 HTTP 客户端,不传则使用默认(超时 200s)
	HTTPClient *http.Client
}

MemNetAIConfig MemNetAI 存储配置

type MemNetAIStore

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

MemNetAIStore 基于 MemNetAI 长记忆服务的 Store 实现。

MemNetAI 是一个 AI 智能体长记忆服务平台,通过「记忆→回忆→思考→做梦」 的完整认知周期,为智能体提供接近人类记忆机制的长期记忆能力。

func NewMemNetAIStore

func NewMemNetAIStore(cfg *MemNetAIConfig) (*MemNetAIStore, error)

NewMemNetAIStore 创建 MemNetAI 记忆存储实例。

示例:

store, err := memory.NewMemNetAIStore(&memory.MemNetAIConfig{
    APIKey:    "your-memnetai-api-key",
    Namespace: "user_123",
})

func (*MemNetAIStore) ClearSession

func (s *MemNetAIStore) ClearSession(ctx context.Context, sessionID string) error

ClearSession MemNetAI 目前未提供公开的清空记忆接口。 该方法返回 nil,如需清理请在 MemNetAI 后台操作。

func (*MemNetAIStore) Close

func (s *MemNetAIStore) Close() error

Close MemNetAI 基于 HTTP 服务,无需额外关闭资源。

func (*MemNetAIStore) GetSession

func (s *MemNetAIStore) GetSession(ctx context.Context, sessionID string) ([]*schema.Message, error)

GetSession MemNetAI 目前未提供获取完整会话历史的独立接口。 该方法返回空列表,如需历史回溯请通过 Recall 实现。

func (*MemNetAIStore) Recall

func (s *MemNetAIStore) Recall(ctx context.Context, sessionID string, query string, topK int) ([]*schema.Message, error)

Recall 根据查询文本从 MemNetAI 召回相关记忆。

MemNetAI 的回忆是一个立体认知重构过程:知识调用、历史回溯、实体关系联想、 时间线索修正、记忆强度衰减(拟合艾宾浩斯曲线)。

返回的 memoryPrompt 已封装为可直接注入 System 提示词的记忆内容。 如果 topK > 0,会对 memorySummaryList 做切片限制。

func (*MemNetAIStore) Save

func (s *MemNetAIStore) Save(ctx context.Context, sessionID string, msgs []*schema.Message) error

Save 将对话上下文提交到 MemNetAI 进行长期记忆。

MemNetAI 会对对话进行多维度深度分析:语义提取、实体关系构建、 历史记忆冲突检测与修正、关系图重组等。该过程较为耗时(同步模式最长 200s)。

最佳实践:推荐以 16 条对话为单位触发记忆,且记忆完成后不要立即从会话中移除上下文, 待若干轮对话后再移除,可获得更自然稳定的交互效果。

type MessageModel

type MessageModel struct {
	ID               string `gorm:"primaryKey;size:64"`
	SessionID        string `gorm:"index:idx_session_time,priority:1;size:128"`
	Role             string `gorm:"size:32;not null"`
	Content          string `gorm:"type:text;not null"`
	ReasoningContent string `gorm:"type:text"`
	Embedding        string `gorm:"type:text"` // JSON 序列化的向量(空字符串表示无嵌入)
	Timestamp        int64  `gorm:"index:idx_session_time,priority:2;not null"`
	Metadata         string `gorm:"type:text"` // JSON 序列化的元数据
	CreatedAt        time.Time
}

MessageModel GORM 消息模型

func (*MessageModel) GetEmbedding

func (m *MessageModel) GetEmbedding() ([]float32, error)

GetEmbedding 获取嵌入向量

func (*MessageModel) SetEmbedding

func (m *MessageModel) SetEmbedding(vec []float32) error

SetEmbedding 设置嵌入向量

func (MessageModel) TableName

func (MessageModel) TableName() string

TableName 指定表名

func (*MessageModel) ToSchemaMessage

func (m *MessageModel) ToSchemaMessage() *schema.Message

ToSchemaMessage 转换为 schema.Message

type MessageRecord

type MessageRecord struct {
	ID        string            `json:"id"`
	SessionID string            `json:"session_id"`
	Role      string            `json:"role"`
	Content   string            `json:"content"`
	Embedding []float32         `json:"embedding,omitempty"` // 向量(可选)
	Timestamp time.Time         `json:"timestamp"`
	Metadata  map[string]string `json:"metadata,omitempty"`
}

MessageRecord 存储的记录结构

type ModelContextWindow

type ModelContextWindow interface {
	ContextWindow() int
}

ModelContextWindow 模型上下文窗口信息接口 各模型实现(如 OpenAI/Gemini/Claude)可实现此接口暴露上下文长度 WindowManager 会通过类型断言自动识别

type OllamaEmbedder

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

func NewOllamaEmbedder

func NewOllamaEmbedder(baseURL, model string) *OllamaEmbedder

func (*OllamaEmbedder) Embed

func (e *OllamaEmbedder) Embed(ctx context.Context, text string) ([]float32, error)

type RecallMode

type RecallMode int

RecallMode 召回策略模式

const (
	RecallModeAuto     RecallMode = iota // 自动:优先向量,失败回退混合(默认行为)
	RecallModeVector                     // 仅向量语义搜索
	RecallModeHybrid                     // 仅关键词 + 时间衰减
	RecallModeCombined                   // 向量 + 关键词 + 时间组合权重
)

type ShortMemoryManager

type ShortMemoryManager interface {
	// GetRecent 返回当前窗口内的完整消息(不进行压缩)
	GetRecent(sessionID string) []*schema.Message

	// GetContextMessages 返回构建上下文所需的短期记忆消息
	// 内部可能整合:窗口内的完整消息 + 超出部分的摘要
	GetContextMessages(sessionID string) []*schema.Message

	// AddTurn 添加一轮对话,触发窗口维护、摘要生成等
	AddTurn(sessionID string, msgs []*schema.Message)

	// Clear 清空会话短期记忆
	Clear(sessionID string)
}

ShortMemoryManager 短期记忆管理器

type SimpleWindowMemory

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

SimpleWindowMemory 纯滑动窗口短期记忆(无摘要)

func NewSimpleWindowMemory

func NewSimpleWindowMemory(wm *WindowManager) *SimpleWindowMemory

NewSimpleWindowMemory 创建纯滑动窗口短期记忆

func (*SimpleWindowMemory) AddTurn

func (sm *SimpleWindowMemory) AddTurn(sessionID string, msgs []*schema.Message)

AddTurn 添加一轮对话

func (*SimpleWindowMemory) Clear

func (sm *SimpleWindowMemory) Clear(sessionID string)

Clear 清空会话

func (*SimpleWindowMemory) GetContextMessages

func (sm *SimpleWindowMemory) GetContextMessages(sessionID string) []*schema.Message

GetContextMessages 返回构建上下文所需的消息

func (*SimpleWindowMemory) GetRecent

func (sm *SimpleWindowMemory) GetRecent(sessionID string) []*schema.Message

GetRecent 返回截断后的最新消息

type SummaryFunc

type SummaryFunc func(messages []*schema.Message, model chatmodel.BaseModel) string

SummaryFunc 摘要生成函数类型

func DefaultSummaryFunc

func DefaultSummaryFunc() SummaryFunc

DefaultSummaryFunc 默认摘要函数

type TokenEstimator

type TokenEstimator interface {
	Estimate(msg *schema.Message) int
}

TokenEstimator Token 估算器 如需精确控制,可接入 tiktoken 等第三方库实现此接口

type WindowConfig

type WindowConfig struct {
	// MaxHistoryMessages 最大保留的历史消息数(不包括 System 消息)
	// 例如设置为 20,则只保留最近的 20 条 user/assistant/tool 消息
	// 0 表示不限制(默认,兼容旧行为)
	MaxHistoryMessages int

	// MaxHistoryTokens 历史消息的最大估算 Token 数(不包括 System 消息)
	// 优先级与 MaxHistoryMessages 同级,两者同时设置时取交集(更严格的)
	// 0 表示不限制(默认)
	MaxHistoryTokens int

	// ReserveTokens 自动模式下为模型输出预留的 Token 数
	// 如果设置了此值且 model 实现了 ModelContextWindow 接口,
	// WindowManager 会自动计算 MaxHistoryTokens = ContextWindow - ReserveTokens
	// 例如:模型 128k 上下文,预留 8k 给输出+缓冲,则历史限制为 120k
	ReserveTokens int
}

WindowConfig 对话窗口配置 提供手动限制和自动计算两种模式,两者可同时启用,取更严格的限制

type WindowManager

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

WindowManager 对话窗口管理器 在每次模型调用前截断消息列表,防止工作记忆无限增长导致 Token 爆炸

func NewWindowManager

func NewWindowManager(config WindowConfig, model chatmodel.BaseModel, estimator TokenEstimator) *WindowManager

NewWindowManager 创建窗口管理器 model 用于自动获取上下文长度(可选,实现 ModelContextWindow 接口即可) estimator 可自定义 Token 计算方式,传 nil 使用默认估算

func (*WindowManager) GetConfig

func (wm *WindowManager) GetConfig() WindowConfig

GetConfig 返回当前生效的配置(便于调试)

func (*WindowManager) Truncate

func (wm *WindowManager) Truncate(msgs []*schema.Message) []*schema.Message

Truncate 截断消息列表,保留 System 消息,丢弃过旧的对话历史 规则:

  1. 始终保留所有 System 消息(置于开头)
  2. 保留最近的历史消息,从旧消息开始丢弃
  3. 如果截断导致 ToolResult 失去对应的 ToolCall,丢弃该孤立的 ToolResult

type WindowShortMemory

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

WindowShortMemory 结合滑动窗口与摘要的短期记忆实现

func NewWindowShortMemory

func NewWindowShortMemory(wm *WindowManager, model chatmodel.BaseModel, summarizer SummaryFunc) *WindowShortMemory

func (*WindowShortMemory) AddTurn

func (ws *WindowShortMemory) AddTurn(sessionID string, msgs []*schema.Message)

func (*WindowShortMemory) Clear

func (ws *WindowShortMemory) Clear(sessionID string)

func (*WindowShortMemory) GetContextMessages

func (ws *WindowShortMemory) GetContextMessages(sessionID string) []*schema.Message

GetContextMessages 返回构建上下文所需的短期记忆 修复:RLock → Lock(因为会修改 sess.messages 和 sess.summary)

func (*WindowShortMemory) GetRecent

func (ws *WindowShortMemory) GetRecent(sessionID string) []*schema.Message

Jump to

Keyboard shortcuts

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