This commit is contained in:
renzhiyuan 2026-09-27 02:54:34 +08:00
parent f9b78eefea
commit 26060b7985
1 changed files with 70 additions and 13 deletions

View File

@ -246,6 +246,63 @@ func (a *AdviceChatBiz) ChatWithSession(ctx context.Context, chat *entitys.Advic
return
}
// stripEmpty 递归去除 map/slice 中的空值(空字符串、nil、空数组、空对象),减少 JSON token
func stripEmpty(v interface{}) interface{} {
switch val := v.(type) {
case map[string]interface{}:
out := make(map[string]interface{})
for k, item := range val {
cleaned := stripEmpty(item)
if cleaned != nil {
out[k] = cleaned
}
}
if len(out) == 0 {
return nil
}
return out
case []interface{}:
var out []interface{}
for _, item := range val {
cleaned := stripEmpty(item)
if cleaned != nil {
out = append(out, cleaned)
}
}
if len(out) == 0 {
return nil
}
return out
case string:
if val == "" {
return nil
}
return val
case nil:
return nil
default:
return v
}
}
// compactJSON 先去空值再序列化,比直接 JsonStringIgonErr 更省 token
func compactJSON(v interface{}) string {
data, err := json.Marshal(v)
if err != nil {
return "{}"
}
var raw interface{}
if err = json.Unmarshal(data, &raw); err != nil {
return string(data)
}
cleaned := stripEmpty(raw)
if cleaned == nil {
return "{}"
}
out, _ := json.Marshal(cleaned)
return string(out)
}
func (a *AdviceChatBiz) buildChatPromptResponse(ctx context.Context, chat *entitys.AdvicerChatReq, session *dbmodel.AiAdviceSession, chatList []mongo_model.AdvicerChatHisMongoEntity, chatData *entitys.ChatData) ([]openai.ResponseInputMessage, error) {
const outputFormatHint = "\n[输出格式]请用 json 格式返回你的回复,结构为 {\"result\":\"回复内容\",\"mission_status\":\"in_progress|completed|fail\",\"mission_complete_desc\":\"本轮进展小结\"}。"
var sys strings.Builder
@ -261,31 +318,31 @@ func (a *AdviceChatBiz) buildChatPromptResponse(ctx context.Context, chat *entit
sys.WriteString("\n")
}
sys.WriteString(constants.BasePrompt2)
// 全量结构化数据注入
// 全量结构化数据注入(stripEmpty 去空值省 token)
if chatData != nil {
if chatData.ProjectInfo != nil {
sys.WriteString("\n[项目信息]\n")
sys.WriteString(pkg.JsonStringIgonErr(chatData.ProjectInfo))
sys.WriteString("\n[项目信息]")
sys.WriteString(compactJSON(chatData.ProjectInfo))
}
if chatData.ProjectData != nil && len(chatData.ProjectData) > 0 {
sys.WriteString("\n[项目资料]\n")
sys.WriteString(pkg.JsonStringIgonErr(chatData.ProjectData))
sys.WriteString("\n[项目资料]")
sys.WriteString(compactJSON(chatData.ProjectData))
}
if chatData.AdvicerInfo != nil {
sys.WriteString("\n[销售信息]\n")
sys.WriteString(pkg.JsonStringIgonErr(chatData.AdvicerInfo))
sys.WriteString("\n[销售信息]")
sys.WriteString(compactJSON(chatData.AdvicerInfo))
}
if chatData.AdvicerVersion != nil && len(chatData.AdvicerVersion) > 0 {
sys.WriteString("\n[销售人设风格]\n")
sys.WriteString(pkg.JsonStringIgonErr(chatData.AdvicerVersion))
sys.WriteString("\n[销售人设风格]")
sys.WriteString(compactJSON(chatData.AdvicerVersion))
}
if chatData.ClientInfo != nil {
sys.WriteString("\n[客户信息]\n")
sys.WriteString(pkg.JsonStringIgonErr(chatData.ClientInfo))
sys.WriteString("\n[客户信息]")
sys.WriteString(compactJSON(chatData.ClientInfo))
}
if chatData.TalkSkill != nil {
sys.WriteString("\n[销售技巧]\n")
sys.WriteString(pkg.JsonStringIgonErr(chatData.TalkSkill))
sys.WriteString("\n[销售技巧]")
sys.WriteString(compactJSON(chatData.TalkSkill))
}
}
sys.WriteString(outputFormatHint)