From 99865c2bc475fde82cde88dea77eb771d91e24cb Mon Sep 17 00:00:00 2001 From: fuzhongyun <15339891972@163.com> Date: Wed, 4 Feb 2026 17:27:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/biz/ding_talk_bot.go | 2 +- internal/biz/do/handle.go | 22 ++++++++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/internal/biz/ding_talk_bot.go b/internal/biz/ding_talk_bot.go index a10907f..2c84274 100644 --- a/internal/biz/ding_talk_bot.go +++ b/internal/biz/ding_talk_bot.go @@ -185,7 +185,7 @@ func (d *DingTalkBotBiz) handleSingleChat(ctx context.Context, requireData *enti if err != nil { return err } - log.Debugf("系统&分类结果: %s - %s", resolveResult.Sys.SysName, resolveResult.IssueType.Name) + log.Debugf("系统&分类结果: %s - %s,原因:%s", resolveResult.Sys.SysName, resolveResult.IssueType.Name, resolveResult.Classification.Reason) // 4. 分类处理(后续考虑接各自的工作流/agent) switch resolveResult.IssueType.Code { diff --git a/internal/biz/do/handle.go b/internal/biz/do/handle.go index 844c004..e6f8767 100644 --- a/internal/biz/do/handle.go +++ b/internal/biz/do/handle.go @@ -98,20 +98,19 @@ func (r *Handle) RewriteQuery(ctx context.Context, history []model.AiBotChatHi, return currentQuery, nil } - var histStr strings.Builder + histStr := strings.Builder{} for _, h := range history { - role := "用户" - if h.Role != "user" { - role = "助手" + if h.Role == "user" { + histStr.WriteString(fmt.Sprintf("%s:%s\n", h.CreateAt, h.Content)) } - histStr.WriteString(fmt.Sprintf("%s: %s\n", role, h.Content)) } systemPrompt := `你是一个搜索查询改写专家。请结合用户的历史对话上下文,将用户当前的输入改写为一个独立的、语义完整的、适合知识库检索的中文查询词。 要求: -1. 保持原意,补全指代(如“它”、“刚才那个问题”)。 -2. 只返回改写后的查询词,不要有任何解释。 -3. 如果当前输入已经很完整,直接返回原句。` +1. 当前输入最能反映用户的意图,权重按照时间逆序依次减弱,改写后的查询词应与当前输入的语义相关。 +2. 保持原意,补全指代(如“它”、“刚才那个问题”)。 +3. 只返回改写后的查询词,不要有任何解释。 +4. 如果当前输入已经很完整,直接返回原句。` userPrompt := fmt.Sprintf("### 历史对话:\n%s\n### 当前输入:\n%s\n### 改写后的查询词:", histStr.String(), currentQuery) @@ -141,6 +140,7 @@ func (r *Handle) ClassifyIssueSystem(ctx context.Context, systems []string, user - 当前输入明确提到系统 → 直接覆盖历史系统 - 当前输入未提系统,但历史对话有 → 继承最近历史系统 - 当前输入和历史均未出现 → "全局" + - 询问公司、企业、制度层面的问题 → "全局" 2. 特殊规则: - 如果当前输入仅包含系统名称(如“CRM”),视为系统上下文补充,仅更新 sys_name,不做其他推断 @@ -190,7 +190,7 @@ func (r *Handle) ClassifyIssueSystem(ctx context.Context, systems []string, user // ClassifyIssueType 问题分类分析 func (r *Handle) ClassifyIssueType(ctx context.Context, issueTypes []string, systems []string, userInput string, userHist []model.AiBotChatHi) (*IssueClassification, error) { systemPrompt := fmt.Sprintf(`## 角色 -你是一个业务问题类型分析专家。你的任务是基于多轮对话识别用户讨论的**问题类型(issue_type_name)**,问题类型必须严格来自可用问题类型列表 [%s]。 +你是一个业务问题类型分析专家。你的任务是基于多轮对话识别用户讨论的**问题类型(issue_type_name)**,问题类型必须严格来自“背景数据-可用问题类型列表”。 你不负责系统名称判断。输出必须严格遵守 JSON 格式。 @@ -200,12 +200,14 @@ func (r *Handle) ClassifyIssueType(ctx context.Context, issueTypes []string, sys - 将当前输入与历史对话合并理解为完整问题演进 - 当前输入可能是补充条件、追问、修正或只给模块名/报错片段 - 不要只看当前一句 + - 忽略历史中的系统名称相关 2. 问题类型判定逻辑 - 当前输入明确匹配列表中某个类型 → 使用该类型 - 当前输入未明确,但历史已有 → 继承历史类型 - 当前输入未匹配,历史也没有 → 选择最接近的列表类型(尽量匹配意图) - 除非是闲聊(如“你好”“在吗”),禁止返回空值 + - 除非明确是需求,否则禁止返回“开发需求”类型 3. 特殊规则 - 当前输入只包含系统名/模块名/参数名 → 视为问题补充,继承历史 issue_type_name @@ -220,7 +222,7 @@ func (r *Handle) ClassifyIssueType(ctx context.Context, issueTypes []string, sys "issue_type_name": "问题类型名称", "summary": "15字内问题标题", "reason": "说明问题类型是基于哪句话判断,或说明继承自历史,继承自哪条历史" -}`, strings.Join(issueTypes, ", "), strings.Join(issueTypes, ", "), strings.Join(systems, ", ")) +}`, strings.Join(issueTypes, ", "), strings.Join(systems, ", ")) historyStr := strings.Builder{} historyStr.WriteString("### 历史对话:\n")