You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

4.1 KiB

AI Context - Go 上下文管理

ai-context 是 Go 语言的 AI 上下文管理库,用于管理 AI 对话的上下文和状态。

官方资源

概述

ai-context 提供了一套完整的 AI 上下文管理解决方案,支持对话历史、状态管理和上下文压缩等功能。

核心功能

对话历史管理

  • 存储和管理完整的对话历史
  • 支持多轮对话追踪
  • 消息角色识别(用户、助手、系统)

上下文压缩

  • 智能摘要生成
  • 上下文窗口优化
  • 历史消息归档

状态管理

  • 会话状态持久化
  • 分布式存储支持
  • 状态恢复机制

基本使用

package main

import (
    "context"
    "github.com/zeromicro/ai-context"
)

func main() {
    // 创建上下文管理器
    manager := context.NewManager(context.Config{
        Storage:  "memory", // 或 "redis"
        MaxSize: 100,      // 最大历史消息数
    })

    // 创建会话
    sessionID := "session-123"
    ctx := manager.CreateSession(sessionID)

    // 添加消息
    ctx.AddMessage(context.Message{
        Role:    "user",
        Content: "你好,今天天气怎么样?",
    })

    ctx.AddMessage(context.Message{
        Role:    "assistant",
        Content: "今天天气晴朗,温度适宜。",
    })

    // 获取历史消息
    history := ctx.GetHistory()
    for _, msg := range history {
        fmt.Printf("%s: %s\n", msg.Role, msg.Content)
    }

    // 获取用于 AI 调用的上下文
    aiContext := ctx.GetContextForAI()
    // 使用 aiContext 调用 AI 模型...

    // 保存会话状态
    manager.SaveSession(sessionID)
}

配置选项

type Config struct {
    Storage     string            // 存储类型: memory, redis, database
    MaxSize     int               // 最大消息数量
    TTL         time.Duration     // 会话过期时间
    Compression bool              // 是否启用压缩
    Compressor  Compressor        // 压缩器
    StorageConf StorageConfig     // 存储配置
}

Redis 存储

manager, err := context.NewManager(context.Config{
    Storage: "redis",
    StorageConf: context.StorageConfig{
        Addr:     "localhost:6379",
        Password: "",
        DB:       0,
    },
    MaxSize: 100,
})

上下文压缩

// 启用自动压缩
manager, _ := context.NewManager(context.Config{
    MaxSize:     100,
    Compression: true,
    Compressor:  context.NewSummarizerCompressor(),
})

// 手动压缩
ctx.Compress()

AI 上下文使用

// 获取格式化的上下文用于 AI 模型
ctx := manager.GetSession("session-123")

// 获取完整上下文
prompt := ctx.FormatPrompt(context.FormatOptions{
    IncludeSystem: true,
    MaxTokens:    2000,
})

// 或者获取消息列表
messages := ctx.GetMessages()
// messages 可以直接传递给 OpenAI API 等

中间件支持

// 使用中间件扩展功能
manager.Use(middleware.SessionLogger())
manager.Use(middleware.MetricsCollector())
manager.Use(middleware.RateLimiter(100))

与 go-zero 集成

// 在 handler 中使用
type MyHandler struct {
    ctxManager *context.Manager
}

func (h *MyHandler) ChatHandler(w http.ResponseWriter, r *http.Request) {
    var req types.ChatRequest
    if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
        http.Error(w, err.Error(), 400)
        return
    }

    // 获取或创建会话
    session := h.ctxManager.GetOrCreateSession(req.SessionID)

    // 添加用户消息
    session.AddMessage(context.Message{
        Role:    "user",
        Content: req.Message,
    })

    // 调用 AI 模型
    aiContext := session.GetContextForAI()
    response := callAI(aiContext)

    // 添加助手消息
    session.AddMessage(context.Message{
        Role:    "assistant",
        Content: response,
    })

    // 保存会话
    h.ctxManager.SaveSession(req.SessionID)

    // 返回响应
    json.NewEncoder(w).Encode(types.ChatResponse{
        Response: response,
    })
}