109 lines
4.0 KiB
Go
109 lines
4.0 KiB
Go
|
package utils
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"errors"
|
|||
|
"fmt"
|
|||
|
"github.com/sashabaranov/go-openai"
|
|||
|
"go-wechat/config"
|
|||
|
"go-wechat/model/vo"
|
|||
|
"log"
|
|||
|
"strings"
|
|||
|
)
|
|||
|
|
|||
|
// GetAiSummary
|
|||
|
// @description: AI总结群聊记录
|
|||
|
// @param groupName
|
|||
|
// @param records
|
|||
|
// @return replyMsg
|
|||
|
// @return err
|
|||
|
func GetAiSummary(groupName string, records []vo.TextMessageItem) (replyMsg string, err error) {
|
|||
|
// 组装对话记录为字符串
|
|||
|
var content []string
|
|||
|
for _, record := range records {
|
|||
|
content = append(content, fmt.Sprintf(`{"%s": "%s"}--end--`, record.Nickname, strings.ReplaceAll(record.Message, "\n", "。。")))
|
|||
|
}
|
|||
|
|
|||
|
prompt := `# Role: 数据分析师和信息整理专家
|
|||
|
# Background: 用户需要从群聊记录中提取有价值的信息,包括技术话题讨论、工具分享、网站或资源链接。
|
|||
|
# Profile: 你是一位专业的数据分析师,擅长从大量文本中提取关键信息,并能够高效地整理和总结内容。
|
|||
|
# Skills: 数据分析、信息提取、内容总结、网络资源评估。
|
|||
|
# Goals: 设计一个流程,帮助用户识别群聊中的技术话题、共享的工具和资源,并高效地总结每个话题的要点。
|
|||
|
# Constrains: 该流程需要简洁明了,易于用户理解和操作,同时确保不遗漏任何重要信息。
|
|||
|
# OutputFormat: 结构化的文本总结,包含关键讨论点、结论等。
|
|||
|
# Workflow:
|
|||
|
## 1. 快速浏览群聊记录
|
|||
|
- 通过快速浏览聊天记录,初步识别出主要话题。
|
|||
|
## 2. 识别和分类主要话题
|
|||
|
- 识别群聊中的主要话题,分类讨论内容。
|
|||
|
- 每个话题独立提取,避免混淆。
|
|||
|
- 话题识别尽可能准确,确保不遗漏重要信息。
|
|||
|
## 3. 编写总结概括
|
|||
|
- 对每个话题进行总结,包含以下内容:
|
|||
|
- 关键讨论点:主要的讨论内容和观点。
|
|||
|
- 参与成员:参与讨论的成员的昵称。
|
|||
|
- 结论:得出的结论或共识,内容要尽可能详细。
|
|||
|
## 4. 组织信息
|
|||
|
- 以逻辑清晰、易于理解的方式组织信息。
|
|||
|
- 使用结构化文本,使总结内容易于阅读。
|
|||
|
## 5. 生成最终总结
|
|||
|
- 根据上述步骤,生成每个话题的详细总结。
|
|||
|
- 确保每个总结完整且有条理。
|
|||
|
- 返回数据格式为结构化文本,方便用户查阅。
|
|||
|
## 6. 群聊记录消息格式
|
|||
|
格式: {"{nickname}": "{content}"}--end--
|
|||
|
# Examples:
|
|||
|
- 话题:技术讨论 - AI在医疗领域的应用
|
|||
|
- 关键讨论点:讨论了AI在医疗诊断中的应用前景和现有挑战。
|
|||
|
- 成员:张三、李四、王五。
|
|||
|
- 结论:AI技术有望提高医疗诊断的准确性和效率,但数据隐私和模型解释性仍需解决。
|
|||
|
|
|||
|
- 话题:美食讨论 - 杭州到底有没有美食
|
|||
|
- 关键讨论点:讨论了杭州的美食有哪些、分布地区、评价如何。
|
|||
|
- 成员:张三、李四、王五。
|
|||
|
- 结论:杭州好像没有美食。
|
|||
|
`
|
|||
|
|
|||
|
msg := fmt.Sprintf("群名称: %s\n聊天记录如下:\n%s", groupName, strings.Join(content, "\n"))
|
|||
|
|
|||
|
// AI总结
|
|||
|
messages := []openai.ChatCompletionMessage{
|
|||
|
{
|
|||
|
Role: openai.ChatMessageRoleSystem,
|
|||
|
Content: prompt,
|
|||
|
},
|
|||
|
{
|
|||
|
Role: openai.ChatMessageRoleUser,
|
|||
|
Content: msg,
|
|||
|
},
|
|||
|
}
|
|||
|
|
|||
|
// 默认使用AI回复
|
|||
|
conf := openai.DefaultConfig(config.Conf.Ai.ApiKey)
|
|||
|
if config.Conf.Ai.BaseUrl != "" {
|
|||
|
conf.BaseURL = fmt.Sprintf("%s/v1", config.Conf.Ai.BaseUrl)
|
|||
|
}
|
|||
|
ai := openai.NewClientWithConfig(conf)
|
|||
|
var resp openai.ChatCompletionResponse
|
|||
|
resp, err = ai.CreateChatCompletion(
|
|||
|
context.Background(),
|
|||
|
openai.ChatCompletionRequest{
|
|||
|
Model: config.Conf.Ai.SummaryModel,
|
|||
|
Messages: messages,
|
|||
|
},
|
|||
|
)
|
|||
|
|
|||
|
if err != nil {
|
|||
|
log.Printf("群聊记录总结失败: %v", err.Error())
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// 返回消息为空
|
|||
|
if resp.Choices[0].Message.Content == "" {
|
|||
|
err = errors.New("AI返回结果为空")
|
|||
|
return
|
|||
|
}
|
|||
|
replyMsg = resp.Choices[0].Message.Content
|
|||
|
return
|
|||
|
}
|