https://github.com/hildam/eino-history
Chat history management library, providing history management functions for Eino large model framework, supporting multi-round conversations | 聊天历史记录管理库,为Eino大模型框架提供历史记录管理功能,支持多轮对话。
https://github.com/hildam/eino-history
eino eino-example eino-framwork golang llm
Last synced: about 1 month ago
JSON representation
Chat history management library, providing history management functions for Eino large model framework, supporting multi-round conversations | 聊天历史记录管理库,为Eino大模型框架提供历史记录管理功能,支持多轮对话。
- Host: GitHub
- URL: https://github.com/hildam/eino-history
- Owner: HildaM
- License: apache-2.0
- Created: 2025-04-14T13:51:03.000Z (about 2 months ago)
- Default Branch: main
- Last Pushed: 2025-04-15T14:08:26.000Z (about 2 months ago)
- Last Synced: 2025-04-15T15:25:21.899Z (about 2 months ago)
- Topics: eino, eino-example, eino-framwork, golang, llm
- Language: Go
- Homepage:
- Size: 47.9 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Eino-History
聊天历史记录管理库,为Eino大模型框架提供历史记录管理功能,支持多轮对话。
## 项目说明
本项目是对 [wangle201210/chat-history](https://github.com/wangle201210/chat-history) 的优化与扩展,在原项目的基础上增加了以下功能:
- 支持Redis存储后端,除了MySQL以外的选择
- 增强的附件管理功能,支持图片、文件、代码、音频和视频等多种类型## 功能特点
- 支持持久化存储聊天历史记录
- 支持MySQL和Redis两种存储后端
- 支持附件管理功能(图片、文件等)
- 支持对话会话管理
- 简单易用的API接口## 安装
```bash
go get github.com/hildam/eino-history
```## 快速开始
### 初始化
```go
// 方式1:使用MySQL(默认)
ehMySQL := eino.NewDefaultEinoHistory(
"root:password@tcp(127.0.0.1:3306)/chat_history?charset=utf8mb4&parseTime=True&loc=Local",
"debug"
)// 方式2:使用Redis
ehRedis := eino.NewEinoHistoryWithProvider(
"redis://localhost:6379/0",
provider.TypeRedis,
true,
"debug"
)// 确保最后关闭连接
defer func() {
if err := ehMySQL.Close(); err != nil {
log.Printf("关闭 MySQL 连接失败: %v", err)
}
if err := ehRedis.Close(); err != nil {
log.Printf("关闭 Redis 连接失败: %v", err)
}
}()
```### 基本使用
```go
// 创建会话ID
convID := uuid.NewString()// 获取历史记录
chatHistory, err := ehMySQL.GetHistory(convID, 100)
if err != nil {
log.Fatalf("获取历史记录失败: %v", err)
}// 保存用户消息
err = ehMySQL.SaveMessage(&schema.Message{
Role: schema.User,
Content: "用户问题",
}, convID)
if err != nil {
log.Fatalf("保存用户消息失败: %v", err)
}// 保存AI回复
err = ehMySQL.SaveMessage(&schema.Message{
Role: schema.Assistant,
Content: "AI回复内容",
}, convID)
if err != nil {
log.Fatalf("保存AI回复失败: %v", err)
}
```## 集成到Eino框架
以下是将Eino-History集成到现有Eino项目的步骤:
1. 初始化EinoHistory实例:
```go
var eh = eino.NewEinoHistory("root:password@tcp(127.0.0.1:3306)/chat_history")
```2. 在原来获取messages的函数中添加历史记录相关代码:
```go
func createMessagesFromTemplate(ctx context.Context, convID, question string) (messages []*schema.Message, err error) {
template := createTemplate(ctx)
// 获取历史记录
chatHistory, err := eh.GetHistory(convID, 100)
if err != nil {
return
}
// 保存用户消息
err = eh.SaveMessage(&schema.Message{
Role: schema.User,
Content: question,
}, convID)
if err != nil {
return
}
// 使用模板生成消息
messages, err = template.Format(context.Background(), map[string]any{
"role": "程序员鼓励师",
"style": "积极、温暖且专业",
"question": question,
"chat_history": chatHistory,
})
if err != nil {
return
}
return
}
```3. 在处理LLM回复的地方添加保存回复的代码:
```go
messages, err := createMessagesFromTemplate(ctx, convID, userInput)
if err != nil {
log.Fatalf("create messages failed: %v", err)
return
}result := generate(ctx, cm, messages)
// 保存AI回复
err = eh.SaveMessage(result, convID)
if err != nil {
log.Fatalf("save assistant message err: %v", err)
return
}
```## 完整示例
请参考项目中的 [example](./example) 目录,包含完整的使用示例:
- MySQL和Redis两种存储后端的使用
- 多轮对话的处理流程
- 附件功能的使用## 与原项目的对比
相比于原项目 [wangle201210/chat-history](https://github.com/wangle201210/chat-history),本项目主要做了以下改进:
1. **存储后端扩展**:增加了Redis支持,使用户可以根据需求选择合适的存储方式
2. **附件功能增强**:完整支持附件的管理,包括图片、文件、代码、音频和视频等
3. **数据模型优化**:优化数据库表结构,增加了更多的索引和字段
4. **易用性改进**:提供了更简洁的API和更详细的示例代码
5. **文档完善**:更全面的使用说明和接口文档## 附件功能
Eino-History支持管理附件,如图片、文件、代码、音频和视频:
```go
// 获取仓库
attachmentRepo := dbProvider.GetAttachmentStore()
messageAttachmentRepo := dbProvider.GetMessageAttachmentStore()// 创建附件
attachment := &models.Attachment{
AttachID: uuid.NewString(),
AttachmentType: "image",
FileName: "example.jpg",
FileSize: 1024 * 100, // 100KB
StorageType: "path",
StoragePath: "/images/example.jpg",
MimeType: "image/jpeg",
CreatedAt: time.Now().Unix(),
}// 保存附件
if err := attachmentRepo.Create(attachment); err != nil {
log.Fatalf("创建附件失败: %v", err)
}// 关联附件到消息
messageAttachment := &models.MessageAttachment{
MessageID: messageID,
AttachmentID: attachment.AttachID,
}if err := messageAttachmentRepo.Create(messageAttachment); err != nil {
log.Fatalf("关联附件到消息失败: %v", err)
}// 获取消息的所有附件
attachmentList, err := attachmentRepo.ListByMessage(messageID)
if err != nil {
log.Fatalf("获取消息附件详情失败: %v", err)
}
```## 配置
配置放在 main.go 同级目录中
项目使用YAML配置文件,示例配置如下:
```yaml
# DeepSeek API配置
DeekSeek:
# DeepSeek API密钥
api_key: "your-api-key"# 使用的模型ID
model_id: "deepseek-chat"# API基础URL
base_url: "https://api.deepseek.com/v1"# 可以添加更多配置项
# 例如:
# server:
# port: 8080
# timeout: 30s
```## 数据库设计
项目包含以下几个核心表:
1. `conversations` - 会话表
2. `messages` - 消息表
3. `attachments` - 附件表
4. `message_attachments` - 消息与附件的关联表## 贡献
欢迎提交Issue和Pull Request。
## 致谢
特别感谢 [wangle201210/chat-history](https://github.com/wangle201210/chat-history) 项目提供的基础实现,本项目在此基础上进行了功能扩展与优化。
## 许可证
请查看项目中的 [LICENSE](./LICENSE) 文件。