Version: 0.4.1.dev.260304

feat: 💬 新增对话创建与上下文记忆机制

* 新增对话的创建与使用功能,实现会话级上下文隔离
* 实现上下文保存与传递机制,使模型具备持续对话记忆能力
* 引入滑动窗口策略控制上下文规模
* 当前窗口大小限制为 20 条消息,超过后自动丢弃最早消息以控制上下文长度

docs: 📝 更新示例配置文件

* 更新示例配置文件,新增 `agent` 相关配置信息
* 明确 Agent 模块运行所需参数,方便本地部署与环境初始化

undo: ⚠️ Agent 上下文读取性能待优化

* 当前测试中模型响应速度偏慢
* 计划后续将上下文暂存至缓存层,以减少读取与拼接开销并提升响应速度
This commit is contained in:
LoveLosita
2026-03-04 19:56:08 +08:00
parent 1e2d7696d3
commit f9d52e0c5e
9 changed files with 248 additions and 18 deletions

View File

@@ -4,6 +4,7 @@ import (
"context"
"encoding/json"
"io"
"strings"
"github.com/cloudwego/eino-ext/components/model/ark"
"github.com/cloudwego/eino/schema"
@@ -42,35 +43,44 @@ func ToOpenAIStream(chunk *schema.Message) (string, error) {
return string(jsonBytes), nil
}
func StreamChat(ctx context.Context, llm *ark.ChatModel, userInput string, outChan chan<- string) error {
func StreamChat(ctx context.Context, llm *ark.ChatModel, userInput string, chatHistory []*schema.Message, outChan chan<- string) (string, error) {
// 1. 组装消息
messages := []*schema.Message{
schema.SystemMessage("你是一位时间管理大师兼日程安排专家兼个人助理,协助用户高效安排日程,优化时间利用率。"),
schema.UserMessage(userInput),
messages := make([]*schema.Message, 0)
// A. 塞入 System Message (人设)
messages = append(messages, schema.SystemMessage(SystemPrompt))
// B. 塞入历史记录 (上下文)
if len(chatHistory) > 0 {
messages = append(messages, chatHistory...)
}
// C. 塞入用户当前的消息 (当前需求)
messages = append(messages, schema.UserMessage(userInput))
// 2. 调用流式接口
reader, err := llm.Stream(ctx, messages)
if err != nil {
return err
return "", err
}
defer reader.Close() // 记得关闭 Reader
// 3. 循环读取直到结束
var fullText strings.Builder
for {
chunk, err := reader.Recv()
if err == io.EOF {
break // 读取完成
}
if err != nil {
return err
return "", err
}
if chunk.Content == "" {
continue
}
fullText.WriteString(chunk.Content)
// 将内容发送到通道中供前端消费
retChuck, err := ToOpenAIStream(chunk)
if err != nil {
return err
return "", err
}
outChan <- retChuck
}
return nil
return fullText.String(), nil
}

View File

@@ -1 +1,33 @@
package agent
const (
// SystemPrompt 全局系统人设:定义 SmartFlow 的基本调性
SystemPrompt = `你叫 SmartFlow是专为重邮CQUPT学子打造的智能排程专家。
你的回复应当专业、干练,偶尔可以带一点程序员式的冷幽默。`
// SmartAssistantPrompt 合并了分诊与对话能力的超级提示词
SmartAssistantPrompt = `你叫 SmartFlow是专为重邮CQUPT学子打造的智能排程专家。
### 你的双重职责:
1. **直接对话**:如果用户是闲聊、查询简单信息或进行通用问答,请直接以专业且幽默的口吻回复。
2. **决策路由**如果用户提出需要“安排日程”、“解决冲突”或涉及“3D Atomic TimeGrid”的操作请在回复中明确你的计划并准备调用相应的排程工具。
### 核心约束:
- 始终保持对“稳扎稳打Steady模式”的敬畏压缩率不得超过 15%。
- 针对重邮场景(如:红岩网校、南山教学楼)提供有温度的建议。
### 输出格式:
- 如果涉及排程工具调用,请先简要说明你的调整思路,再执行动作。`
// SchedulerPromptTemplate 排程专家 (Scheduler):核心算法 Agent
// 这里注入 3D Grid 和 Steady 模式的约束
SchedulerPromptTemplate = `你是一位精通“三维原子时间网格3D Atomic TimeGrid”的顶级排程架构师。
在处理用户的排程请求时,你必须遵循以下硬性逻辑约束:
1. 稳扎稳打Steady模式任务步长Step的动态分配必须保守压缩率严禁超过原始时长的 15%。
2. 逻辑空间投影Logical Space Mapping当发生时空重叠时优先尝试在逻辑向量维度平移而非直接删除冲突任务。
3. 冲突自愈:若发现网格冲突,请主动提出“缩放任务块”或“重新锚定时间点”的自愈方案。
请以极其严谨的态度处理每一秒钟的分配。`
// DefaultPromptTemplate 通用助手 (Assistant):也就是你之前占位的那个
DefaultPromptTemplate = `你是一位时间管理大师、日程安排专家兼个人助理。
你的目标是协助用户高效安排日程。请确保你的回答简洁明了,直接针对用户的需求进行回复。
如果用户提到重邮CQUPT相关内容南山、红岩网校、卓越工程师班请表现出你的亲切感。`
)