旧版本的WoHuidaAgent

package com.jiaozuo.wohuida.service;

import com.jiaozuo.wohuida.engine.PromptTemplateManager;
import com.jiaozuo.wohuida.model.BillData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;



import com.jiaozuo.wohuida.model.KnowledgeSnippet;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class WoHuidaAgent {

@Autowired
private LargeModelClient largeModelClient;

@Autowired
private BillingService billingService;


@Autowired
private RagService ragService; // 注入 RAG 服务
public String process(String phoneNumber, String question) {

// 1. 意图识别 (保持之前的 Few-Shot 逻辑不变)
String intentPrompt = "你是一个严格的意图分类器。请判断以下用户问题属于哪一类,只返回字母 A 或 B。\n" +
"A. 事实类查询 (必须涉及查询该用户的【个人实时数据】,如:我的话费、我的账单、我的余额、我的流量使用情况等)\n" +
"B. 概念类咨询 (涉及通用的【业务规则、办理流程、资费标准、产品介绍】,不需要查用户个人数据)\n\n" +
"示例:\n" +
"用户问题: 怎么办理拆机?\n回答: B\n" +
"用户问题: 流量超套怎么收费?\n回答: B\n" +
"用户问题: 我这个月话费为什么这么高?\n回答: A\n" +
"用户问题: 帮我查一下上个月的话费账单\n回答: A\n" +
"用户问题: 我的余额还够打多久电话?\n回答: A\n\n" +
"用户问题: " + question + "\n回答: ";

// String rawIntent = largeModelClient.generateResponse(intentPrompt).trim();
// String intentResult = rawIntent.contains("A") ? "A" : "B";
// 1. 调用专门的意图识别方法
String rawIntent = largeModelClient.generateIntent(intentPrompt).trim();

// 2. 只要首字母是 A/a,就认为是 A,否则一律认为是 B(防止大模型输出 "A. 事实类" 导致误判)
String intentResult = rawIntent.toLowerCase().startsWith("a") ? "A" : "B";
// 2. 根据意图进行调度
if ("A".equals(intentResult)) {
// --- 事实类:查数 + 分析 ---
BillData lastMonth = billingService.getBillDetail(phoneNumber, "2023-11");
BillData thisMonth = billingService.getBillDetail(phoneNumber, "2023-12");
String prompt = String.format(PromptTemplateManager.BILL_ANALYSIS_TEMPLATE,
lastMonth.toSummary(), thisMonth.toSummary());
return largeModelClient.generateResponse(prompt);

} else {
// --- 概念类:RAG 知识库检索 + 生成回答 ---
List<KnowledgeSnippet> snippets = ragService.searchKnowledge(question);

if (snippets.isEmpty()) {
return "抱歉,我暂时没有找到相关的业务知识,建议转接人工客服。";
}

// 将检索到的知识拼接成文本
String context = snippets.stream()
.map(s -> "- " + s.getContent() + " (来源:" + s.getSource() + ")")
.collect(Collectors.joining("\n"));

// 构造 RAG 专属 Prompt
String ragPrompt = "你是一个专业的联通客服助手。请严格根据以下提供的【参考资料】来回答用户的问题。\n" +
"如果参考资料中没有相关信息,请如实告知用户。\n\n" +
"【参考资料】:\n" + context + "\n\n" +
"【用户问题】:" + question + "\n\n" +
"【客服回答】:";

return largeModelClient.generateResponse(ragPrompt);
}
}
}
posted @ 2026-08-02 19:05  银杏树设计工作室  阅读(3)  评论(0)    收藏  举报