From bd9920ca2491d25cae94d4ce7468d556c8abe619 Mon Sep 17 00:00:00 2001 From: jiao Date: Mon, 8 Jun 2026 10:01:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=94=BB=E5=83=8F=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增客户画像生成相关实体、Mapper、Service和控制器 2. 扩展CustomerProfile实体字段,增加自动生成标记相关属性 3. 新增画像生成日志表和相关业务逻辑 4. 前端客户列表页面增加画像管理Tab和批量生成功能 5. 补充完整的客户画像自动生成方案文档 --- .../common/target/common-1.0.0-SNAPSHOT.jar | Bin 20315 -> 20315 bytes .../ProfileGenerationController.java | 80 +++ .../artedu/intent/entity/CustomerProfile.java | 3 + .../intent/entity/ProfileGenerationLog.java | 34 ++ .../mapper/ProfileGenerationLogMapper.java | 9 + .../service/ProfileGenerationService.java | 473 ++++++++++++++++ .../intent/IntentServiceApplication.class | Bin 802 -> 802 bytes .../CustomerProfileController.class | Bin 4104 -> 4033 bytes .../intent/controller/IntentController.class | Bin 6333 -> 6297 bytes ...ationController$BatchGenerateRequest.class | Bin 0 -> 3135 bytes .../ProfileGenerationController.class | Bin 0 -> 4766 bytes .../intent/dto/IntentResult$IntentInfo.class | Bin 3450 -> 2898 bytes .../com/artedu/intent/dto/IntentResult.class | Bin 4657 -> 4062 bytes .../intent/entity/CustomerProfile.class | Bin 15138 -> 15764 bytes .../artedu/intent/entity/IntentCategory.class | Bin 7223 -> 6455 bytes .../intent/entity/IntentRecognition.class | Bin 11416 -> 10436 bytes .../intent/entity/ProfileGenerationLog.class | Bin 0 -> 8713 bytes .../intent/mapper/CustomerProfileMapper.class | Bin 418 -> 418 bytes .../intent/mapper/IntentCategoryMapper.class | Bin 415 -> 415 bytes .../mapper/IntentRecognitionMapper.class | Bin 424 -> 424 bytes .../mapper/ProfileGenerationLogMapper.class | Bin 0 -> 433 bytes .../service/CustomerProfileService.class | Bin 6343 -> 6281 bytes .../service/IntentRecognitionService.class | Bin 15051 -> 14739 bytes .../intent/service/LLMIntentClient.class | Bin 9112 -> 8729 bytes .../ProfileGenerationService$FieldValue.class | Bin 0 -> 2584 bytes ...leGenerationService$GenerationResult.class | Bin 0 -> 3767 bytes ...GenerationService$ProfileParseResult.class | Bin 0 -> 9271 bytes .../service/ProfileGenerationService.class | Bin 0 -> 24619 bytes .../target/intent-service-1.0.0-SNAPSHOT.jar | Bin 40371163 -> 40397002 bytes ...intent-service-1.0.0-SNAPSHOT.jar.original | Bin 36881 -> 62320 bytes .../compile/default-compile/createdFiles.lst | 8 + .../compile/default-compile/inputFiles.lst | 4 + .../controller/IntentControllerTest.class | Bin 6701 -> 6695 bytes frontend/admin/src/pages/CustomerList.tsx | 216 +++++++- .../v3-客户画像自动生成方案.md | 506 ++++++++++++++++++ 35 files changed, 1309 insertions(+), 24 deletions(-) create mode 100644 backend/intent-service/src/main/java/com/artedu/intent/controller/ProfileGenerationController.java create mode 100644 backend/intent-service/src/main/java/com/artedu/intent/entity/ProfileGenerationLog.java create mode 100644 backend/intent-service/src/main/java/com/artedu/intent/mapper/ProfileGenerationLogMapper.java create mode 100644 backend/intent-service/src/main/java/com/artedu/intent/service/ProfileGenerationService.java create mode 100644 backend/intent-service/target/classes/com/artedu/intent/controller/ProfileGenerationController$BatchGenerateRequest.class create mode 100644 backend/intent-service/target/classes/com/artedu/intent/controller/ProfileGenerationController.class create mode 100644 backend/intent-service/target/classes/com/artedu/intent/entity/ProfileGenerationLog.class create mode 100644 backend/intent-service/target/classes/com/artedu/intent/mapper/ProfileGenerationLogMapper.class create mode 100644 backend/intent-service/target/classes/com/artedu/intent/service/ProfileGenerationService$FieldValue.class create mode 100644 backend/intent-service/target/classes/com/artedu/intent/service/ProfileGenerationService$GenerationResult.class create mode 100644 backend/intent-service/target/classes/com/artedu/intent/service/ProfileGenerationService$ProfileParseResult.class create mode 100644 backend/intent-service/target/classes/com/artedu/intent/service/ProfileGenerationService.class create mode 100644 product1.0/v3-客户画像自动生成方案.md diff --git a/backend/common/target/common-1.0.0-SNAPSHOT.jar b/backend/common/target/common-1.0.0-SNAPSHOT.jar index e9f0508d9a56863f9d97894a388501325d580218..b2945f2d49261ef16eb3aadc5534ae6654744050 100644 GIT binary patch delta 535 zcmcaTkMZ_AM&1B#W)?061`Y;>gMCLQ@~SX{D3cB_wO<}gJyZixlerjm!E_;`@?-}u zc2u2{3mHwovMU(P!L$^U^5g&yuF3pN98kU~T=xSH&dGI9@lGZqu=qYEEinC>38GG! z*#^YloWvZ)3})b#5oIC!Hh1xW)?6*Kv)DKqAsBVQR642&Iy*PP`(cliBj7S zQ7ofrzy_X+{iX=Om1KR{_;Ux>OTz5!tI Q@4mrc+ShM6gzuLE03LMXmjD0& delta 535 zcmcaTkMZ_AM&1B#W)?061`Y;>vt36f@~SX{D3cE6GeBy;JeYc@2BIc&G3tWpLPq7u z4qog?Izh69j3!{&6^!O!T8c?|a)1ZdWPT%@)Z7W{7hZu!0#~e9bIihJdgLL_}Re1)|1JN}UrdRiS(z zA`+#xAEH=B`yM-3>aUR|*lC+Jt(P%^MK0MK<^Wqh!?gqA2saZj9pz>ZQZRXrn?9I6 z=Vk_`+1+iy^m-5J$w}^-aP~?l`>MM;SWMo-6-rA_Zt~EAs&fI;-#nbac368_foXZ5 zS(7~>fpNgo2dswQD+ElZc}0WiBVJ)(TGl%hOqY5?V$zXc2PZXH`0Hu9> ZA?lX+27txC`v!w)U%%yGyTALT004&F>> listCustomersWithoutProfile( + @NotBlank @RequestParam("corpId") String corpId, + @RequestParam(value = "minMsgCount", defaultValue = "5") @Min(1) @Max(100) int minMsgCount, + @RequestParam(value = "limit", defaultValue = "50") @Min(1) @Max(200) int limit) { + List> list = profileGenerationService.findCustomersWithoutProfile(corpId, limit, minMsgCount); + return Result.success(list); + } + + /** + * 为单个客户生成画像 + */ + @PostMapping("/generate/{customerId}") + public Result generateSingle( + @NotBlank @PathVariable("customerId") String customerId, + @NotBlank @RequestParam("corpId") String corpId) { + log.info("手动生成客户画像: customerId={}, corpId={}", customerId, corpId); + ProfileGenerationService.GenerationResult result = profileGenerationService.generateFullProfile(customerId, corpId); + if (result.isSuccess()) { + return Result.success(result); + } else { + return Result.fail(result.getErrorMsg()); + } + } + + /** + * 批量生成画像(异步) + */ + @PostMapping("/generate/batch") + public Result batchGenerate(@RequestBody @Validated BatchGenerateRequest request) { + log.info("批量生成画像: corpId={}, customerCount={}", request.getCorpId(), request.getCustomerIds().size()); + profileGenerationService.batchGenerate(request.getCorpId(), request.getCustomerIds(), request.getOperator()); + return Result.success("批量画像生成任务已启动,请稍后查看结果"); + } + + // --- DTO --- + + @Data + public static class BatchGenerateRequest { + @NotBlank(message = "corpId不能为空") + private String corpId; + @NotEmpty(message = "customerIds不能为空") + private List customerIds; + private String operator; + } +} diff --git a/backend/intent-service/src/main/java/com/artedu/intent/entity/CustomerProfile.java b/backend/intent-service/src/main/java/com/artedu/intent/entity/CustomerProfile.java index b4f25af..5680ed1 100644 --- a/backend/intent-service/src/main/java/com/artedu/intent/entity/CustomerProfile.java +++ b/backend/intent-service/src/main/java/com/artedu/intent/entity/CustomerProfile.java @@ -35,6 +35,9 @@ public class CustomerProfile { private String slotData; private Integer conversationCount; private LocalDateTime lastConversationTime; + private Integer autoGenerated; + private LocalDateTime lastGeneratedAt; + private String generatedBy; private LocalDateTime createdAt; private LocalDateTime updatedAt; } diff --git a/backend/intent-service/src/main/java/com/artedu/intent/entity/ProfileGenerationLog.java b/backend/intent-service/src/main/java/com/artedu/intent/entity/ProfileGenerationLog.java new file mode 100644 index 0000000..0eaf470 --- /dev/null +++ b/backend/intent-service/src/main/java/com/artedu/intent/entity/ProfileGenerationLog.java @@ -0,0 +1,34 @@ +package com.artedu.intent.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 画像生成日志 + */ +@Data +@TableName("profile_generation_logs") +public class ProfileGenerationLog { + + @TableId(type = IdType.AUTO) + private Long id; + + private String customerId; + private String corpId; + private String generationType; + private Integer sourceMsgCount; + private Integer sourceSessionCount; + private LocalDateTime analyzedAt; + private String llmModel; + private Integer llmPromptLength; + private Integer llmResponseLength; + private Integer durationMs; + private Integer success; + private String errorMsg; + private String changesSnapshot; + private LocalDateTime createdAt; +} diff --git a/backend/intent-service/src/main/java/com/artedu/intent/mapper/ProfileGenerationLogMapper.java b/backend/intent-service/src/main/java/com/artedu/intent/mapper/ProfileGenerationLogMapper.java new file mode 100644 index 0000000..07e1774 --- /dev/null +++ b/backend/intent-service/src/main/java/com/artedu/intent/mapper/ProfileGenerationLogMapper.java @@ -0,0 +1,9 @@ +package com.artedu.intent.mapper; + +import com.artedu.intent.entity.ProfileGenerationLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProfileGenerationLogMapper extends BaseMapper { +} diff --git a/backend/intent-service/src/main/java/com/artedu/intent/service/ProfileGenerationService.java b/backend/intent-service/src/main/java/com/artedu/intent/service/ProfileGenerationService.java new file mode 100644 index 0000000..92f9269 --- /dev/null +++ b/backend/intent-service/src/main/java/com/artedu/intent/service/ProfileGenerationService.java @@ -0,0 +1,473 @@ +package com.artedu.intent.service; + +import com.artedu.common.result.PageResult; +import com.artedu.common.util.JsonUtils; +import com.artedu.intent.entity.CustomerProfile; +import com.artedu.intent.entity.ProfileGenerationLog; +import com.artedu.intent.mapper.CustomerProfileMapper; +import com.artedu.intent.mapper.ProfileGenerationLogMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 客户画像自动生成服务 + */ +@Slf4j +@Service +public class ProfileGenerationService { + + @Value("${generation.service.url:http://generation-service:8086}") + private String generationServiceUrl; + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Autowired + private CustomerProfileMapper customerProfileMapper; + + @Autowired + private ProfileGenerationLogMapper logMapper; + + private final RestTemplate restTemplate = new RestTemplate(); + + private static final String SYSTEM_PROMPT = "你是一位专业的教育培训机构客户分析师。请根据学员与课程顾问的完整对话历史,提取学员画像信息。\n" + + "\n【分析要求】\n" + + "1. 仔细阅读所有对话,从中提取学员的真实情况和需求\n" + + "2. 不要凭空猜测,只提取对话中有明确证据支撑的信息\n" + + "3. 如果某个字段在对话中没有足够证据,请标记为\"未知\"并给出低置信度\n" + + "4. 对于同一字段的多个线索,综合判断取最可靠的结论\n" + + "5. 注意识别\"家长代询\"的情况(对话中出现\"我孩子\"、\"我家\"等表述)\n" + + "\n【输出格式】\n" + + "必须严格返回以下JSON格式,不要包含任何其他文字:\n" + + "{\"studentType\":{\"value\":\"\",\"confidence\":0,\"evidence\":\"\"},\"skillLevel\":{\"value\":\"\",\"confidence\":0,\"evidence\":\"\"},\"intentLevel\":{\"value\":\"\",\"confidence\":0,\"evidence\":\"\"},\"intentScore\":{\"value\":0,\"confidence\":0,\"evidence\":\"\"},\"concernFocus\":{\"value\":\"\",\"confidence\":0,\"evidence\":\"\"},\"decisionStage\":{\"value\":\"\",\"confidence\":0,\"evidence\":\"\"},\"interestedCourses\":{\"value\":[],\"confidence\":0,\"evidence\":\"\"},\"budgetHint\":{\"value\":\"\",\"confidence\":0,\"evidence\":\"\"},\"preferredCity\":{\"value\":\"\",\"confidence\":0,\"evidence\":\"\"},\"age\":{\"value\":null,\"confidence\":0,\"evidence\":\"\"},\"education\":{\"value\":\"\",\"confidence\":0,\"evidence\":\"\"},\"currentOccupation\":{\"value\":\"\",\"confidence\":0,\"evidence\":\"\"},\"summary\":\"\",\"keyQuotes\":[]}\n" + + "\n【字段枚举值】\n" + + "- studentType: 在校大学生/转行人员/在职提升/高中毕业生/家长代询/未知\n" + + "- skillLevel: 零基础/有美术基础/相关专业/有从业经验/未知\n" + + "- intentLevel: 高/中/低\n" + + "- concernFocus: 就业导向型/兴趣导向型/价格敏感型/品质导向型/未知\n" + + "- decisionStage: 初步了解/方案比较/决定报名/已报名/未知\n" + + "- education: 高中/大专/本科/硕士/博士/未知\n" + + "\n【关键字段特别说明】\n" + + "1. intentScore(意向分数0-100):即使没有明确数字评分,也必须根据对话强度推断。高意向=75-95,中意向=40-74,低意向=10-39\n" + + "2. interestedCourses:尽量提取具体课程方向,如\"场景地编\"优于\"模型课程\"\n" + + "\n【置信度评分标准】\n" + + "- 0.90-1.00: 学员明确亲口说过\n" + + "- 0.70-0.89: 有较强暗示或多处线索一致\n" + + "- 0.50-0.69: 有一处间接线索\n" + + "- 0.30-0.49: 只有微弱暗示\n" + + "- 0.00-0.29: 没有任何线索"; + + /** + * 为单个客户生成画像(全量分析) + */ + public GenerationResult generateFullProfile(String customerId, String corpId) { + long startTime = System.currentTimeMillis(); + GenerationResult result = new GenerationResult(); + result.setCustomerId(customerId); + result.setCorpId(corpId); + + // 1. 获取客户对话 + List> messages = selectCustomerMessages(corpId, customerId); + if (messages.isEmpty()) { + result.setSuccess(false); + result.setErrorMsg("该客户没有对话记录"); + return result; + } + + // 2. 格式化对话 + String conversationText = formatConversation(messages); + int msgCount = messages.size(); + int sessionCount = countDistinctSessions(corpId, customerId); + + // 3. 调用 LLM + String llmResponse = callLLM(conversationText); + if (llmResponse == null) { + result.setSuccess(false); + result.setErrorMsg("LLM调用失败"); + saveLog(customerId, corpId, "BATCH_FULL", msgCount, sessionCount, startTime, false, "LLM调用失败", null); + return result; + } + + // 4. 解析结果 + ProfileParseResult parsed = parseProfileResult(llmResponse); + if (!parsed.isValid()) { + result.setSuccess(false); + result.setErrorMsg("LLM返回解析失败: " + parsed.getError()); + saveLog(customerId, corpId, "BATCH_FULL", msgCount, sessionCount, startTime, false, parsed.getError(), null); + return result; + } + + // 5. 保存画像 + CustomerProfile profile = convertToProfile(customerId, corpId, parsed); + CustomerProfile exist = customerProfileMapper.selectOne( + new LambdaQueryWrapper() + .eq(CustomerProfile::getCustomerId, customerId) + .eq(CustomerProfile::getCorpId, corpId) + ); + if (exist == null) { + profile.setCreatedAt(LocalDateTime.now()); + customerProfileMapper.insert(profile); + } else { + profile.setId(exist.getId()); + profile.setCreatedAt(exist.getCreatedAt()); + customerProfileMapper.updateById(profile); + } + + // 6. 记录日志 + long duration = System.currentTimeMillis() - startTime; + saveLog(customerId, corpId, "BATCH_FULL", msgCount, sessionCount, startTime, true, null, llmResponse); + + result.setSuccess(true); + result.setProfile(profile); + result.setDurationMs((int) duration); + return result; + } + + /** + * 批量生成画像(异步) + */ + @Async + public void batchGenerate(String corpId, List customerIds, String operator) { + log.info("开始批量画像生成: corpId={}, customerCount={}", corpId, customerIds.size()); + int success = 0; + int fail = 0; + + for (int i = 0; i < customerIds.size(); i++) { + String customerId = customerIds.get(i); + try { + GenerationResult result = generateFullProfile(customerId, corpId); + if (result.isSuccess()) { + success++; + } else { + fail++; + log.warn("画像生成失败: customerId={}, reason={}", customerId, result.getErrorMsg()); + } + } catch (Exception e) { + fail++; + log.error("画像生成异常: customerId={}", customerId, e); + } + + // 每处理10个休眠1秒,避免LLM限流 + if ((i + 1) % 10 == 0) { + try { Thread.sleep(1000); } catch (InterruptedException ignored) {} + } + } + + log.info("批量画像生成完成: corpId={}, success={}, fail={}", corpId, success, fail); + } + + /** + * 查询需要生成画像的客户列表 + */ + public List> findCustomersWithoutProfile(String corpId, int limit, Integer minMsgCount) { + String sql = "SELECT c.customer_id, COUNT(m.id) as msg_count " + + "FROM customers c " + + "LEFT JOIN customer_profiles p ON c.customer_id = p.customer_id AND c.corp_id = p.corp_id " + + "LEFT JOIN archive_messages m ON c.customer_id = m.from_user AND c.corp_id = m.corp_id " + + " AND m.from_role = 'EXTERNAL' AND m.msgtype = 'text' AND m.decrypt_status = 1 " + + "WHERE c.corp_id = ? AND (p.id IS NULL OR p.auto_generated = 0) " + + "GROUP BY c.customer_id " + + "HAVING COUNT(m.id) >= ? " + + "ORDER BY COUNT(m.id) DESC " + + "LIMIT ?"; + return jdbcTemplate.queryForList(sql, corpId, minMsgCount != null ? minMsgCount : 5, limit); + } + + // --- 内部方法 --- + + private List> selectCustomerMessages(String corpId, String customerId) { + String sql = "SELECT from_role, content, msgtime, session_id " + + "FROM archive_messages " + + "WHERE corp_id = ? AND session_id IN (" + + " SELECT DISTINCT session_id FROM archive_messages " + + " WHERE corp_id = ? AND from_user = ? AND from_role = 'EXTERNAL'" + + ") AND msgtype = 'text' AND decrypt_status = 1 AND content IS NOT NULL " + + "ORDER BY msgtime ASC " + + "LIMIT 100"; + return jdbcTemplate.queryForList(sql, corpId, corpId, customerId); + } + + private int countDistinctSessions(String corpId, String customerId) { + String sql = "SELECT COUNT(DISTINCT session_id) FROM archive_messages " + + "WHERE corp_id = ? AND from_user = ? AND from_role = 'EXTERNAL'"; + Integer count = jdbcTemplate.queryForObject(sql, Integer.class, corpId, customerId); + return count != null ? count : 0; + } + + private String formatConversation(List> messages) { + StringBuilder sb = new StringBuilder(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd HH:mm"); + + for (Map msg : messages) { + String fromRole = (String) msg.get("from_role"); + String content = (String) msg.get("content"); + Long msgtime = ((Number) msg.get("msgtime")).longValue(); + + if (content == null || content.trim().isEmpty()) continue; + // 过滤引用消息和系统消息 + if (content.startsWith("这是一条引用")) continue; + if (content.startsWith("- - - - -")) continue; + + String role = "EXTERNAL".equals(fromRole) ? "【学员】" : "【员工】"; + String time = LocalDateTime.ofInstant(Instant.ofEpochMilli(msgtime), ZoneId.of("Asia/Shanghai")) + .format(formatter); + + sb.append(role).append(" ").append(time).append("\n"); + // 截断过长消息 + String text = content.length() > 300 ? content.substring(0, 300) + "..." : content; + sb.append(text).append("\n\n"); + } + return sb.toString(); + } + + private String callLLM(String conversationText) { + try { + String prompt = "【对话历史】\n" + conversationText + "\n\n【请输出画像JSON】"; + + Map requestBody = new HashMap<>(); + requestBody.put("system", SYSTEM_PROMPT); + requestBody.put("prompt", prompt); + requestBody.put("maxTokens", 2500); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> request = new HttpEntity<>(requestBody, headers); + ResponseEntity response = restTemplate.postForEntity( + generationServiceUrl + "/api/v1/generation/generate", request, String.class); + + if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) { + Map result = JsonUtils.fromJsonMap(response.getBody()); + if (result != null && result.get("data") != null) { + Map data = (Map) result.get("data"); + return (String) data.get("content"); + } + } + log.warn("LLM调用失败: status={}, body={}", response.getStatusCode(), response.getBody()); + return null; + } catch (Exception e) { + log.error("LLM调用异常: {}", e.getMessage(), e); + return null; + } + } + + @SuppressWarnings("unchecked") + private ProfileParseResult parseProfileResult(String response) { + ProfileParseResult result = new ProfileParseResult(); + try { + // 清理 markdown + String json = response.trim(); + if (json.startsWith("```json")) json = json.substring(7); + if (json.startsWith("```")) json = json.substring(3); + if (json.endsWith("```")) json = json.substring(0, json.length() - 3); + json = json.trim(); + + Map map = JsonUtils.fromJsonMap(json); + if (map == null) { + result.setError("JSON解析为空"); + return result; + } + + result.setStudentType(extractField(map, "studentType")); + result.setSkillLevel(extractField(map, "skillLevel")); + result.setIntentLevel(extractField(map, "intentLevel")); + result.setIntentScore(extractField(map, "intentScore")); + result.setConcernFocus(extractField(map, "concernFocus")); + result.setDecisionStage(extractField(map, "decisionStage")); + result.setInterestedCourses(extractField(map, "interestedCourses")); + result.setBudgetHint(extractField(map, "budgetHint")); + result.setPreferredCity(extractField(map, "preferredCity")); + result.setAge(extractField(map, "age")); + result.setEducation(extractField(map, "education")); + result.setCurrentOccupation(extractField(map, "currentOccupation")); + result.setSummary(getString(map, "summary")); + result.setKeyQuotes(getStringList(map, "keyQuotes")); + result.setValid(true); + } catch (Exception e) { + result.setError("解析异常: " + e.getMessage()); + log.warn("解析LLM画像结果失败: {}", e.getMessage()); + } + return result; + } + + @SuppressWarnings("unchecked") + private FieldValue extractField(Map map, String key) { + FieldValue fv = new FieldValue(); + Object val = map.get(key); + if (val instanceof Map) { + Map m = (Map) val; + fv.setValue(m.get("value")); + Object conf = m.get("confidence"); + fv.setConfidence(conf instanceof Number ? ((Number) conf).doubleValue() : 0); + fv.setEvidence(getString(m, "evidence")); + } + return fv; + } + + private CustomerProfile convertToProfile(String customerId, String corpId, ProfileParseResult parsed) { + CustomerProfile p = new CustomerProfile(); + p.setCustomerId(customerId); + p.setCorpId(corpId); + + p.setStudentType(getFieldValue(parsed.getStudentType())); + p.setStudentTypeConfidence(getFieldConfidence(parsed.getStudentType())); + p.setSkillLevel(getFieldValue(parsed.getSkillLevel())); + p.setSkillLevelConfidence(getFieldConfidence(parsed.getSkillLevel())); + p.setIntentLevel(getFieldValue(parsed.getIntentLevel())); + p.setIntentScore(getFieldDouble(parsed.getIntentScore())); + p.setConcernFocus(getFieldValue(parsed.getConcernFocus())); + p.setConcernFocusConfidence(getFieldConfidence(parsed.getConcernFocus())); + p.setDecisionStage(getFieldValue(parsed.getDecisionStage())); + p.setDecisionStageConfidence(getFieldConfidence(parsed.getDecisionStage())); + p.setInterestedCourses(toJson(getFieldList(parsed.getInterestedCourses()))); + p.setBudgetHint(getFieldValue(parsed.getBudgetHint())); + p.setPreferredCity(getFieldValue(parsed.getPreferredCity())); + p.setAge(getFieldInt(parsed.getAge())); + p.setEducation(getFieldValue(parsed.getEducation())); + p.setCurrentOccupation(getFieldValue(parsed.getCurrentOccupation())); + p.setAutoGenerated(1); + p.setLastGeneratedAt(LocalDateTime.now()); + p.setGeneratedBy("AI_BATCH"); + p.setUpdatedAt(LocalDateTime.now()); + return p; + } + + private void saveLog(String customerId, String corpId, String type, int msgCount, int sessionCount, + long startTime, boolean success, String error, String response) { + try { + ProfileGenerationLog log = new ProfileGenerationLog(); + log.setCustomerId(customerId); + log.setCorpId(corpId); + log.setGenerationType(type); + log.setSourceMsgCount(msgCount); + log.setSourceSessionCount(sessionCount); + log.setAnalyzedAt(LocalDateTime.now()); + log.setDurationMs((int) (System.currentTimeMillis() - startTime)); + log.setSuccess(success ? 1 : 0); + log.setErrorMsg(error); + if (response != null) { + log.setLlmResponseLength(response.length()); + } + logMapper.insert(log); + } catch (Exception e) { + // 日志保存失败不影响主流程 + log.warn("保存画像生成日志失败: {}", e.getMessage()); + } + } + + // --- 工具方法 --- + + private String getString(Map map, String key) { + Object val = map.get(key); + return val != null ? val.toString() : null; + } + + @SuppressWarnings("unchecked") + private List getStringList(Map map, String key) { + Object val = map.get(key); + if (val instanceof List) { + return ((List) val).stream().map(Object::toString).collect(Collectors.toList()); + } + return Collections.emptyList(); + } + + private String getFieldValue(FieldValue fv) { + if (fv == null || fv.getValue() == null) return null; + String v = fv.getValue().toString(); + return "未知".equals(v) || v.isEmpty() ? null : v; + } + + private Double getFieldConfidence(FieldValue fv) { + return fv != null ? fv.getConfidence() : 0; + } + + private Double getFieldDouble(FieldValue fv) { + if (fv == null || fv.getValue() == null) return 0.0; + try { + return Double.parseDouble(fv.getValue().toString()); + } catch (Exception e) { + return 0.0; + } + } + + private Integer getFieldInt(FieldValue fv) { + if (fv == null || fv.getValue() == null) return null; + try { + return Integer.parseInt(fv.getValue().toString()); + } catch (Exception e) { + return null; + } + } + + @SuppressWarnings("unchecked") + private List getFieldList(FieldValue fv) { + if (fv == null || fv.getValue() == null) return Collections.emptyList(); + Object v = fv.getValue(); + if (v instanceof List) { + return ((List) v).stream().map(Object::toString).collect(Collectors.toList()); + } + return Collections.emptyList(); + } + + private String toJson(List list) { + if (list == null || list.isEmpty()) return null; + try { + return JsonUtils.toJson(list); + } catch (Exception e) { + return null; + } + } + + // --- 内部DTO --- + + @lombok.Data + public static class GenerationResult { + private boolean success; + private String customerId; + private String corpId; + private CustomerProfile profile; + private String errorMsg; + private int durationMs; + } + + @lombok.Data + public static class ProfileParseResult { + private boolean valid; + private String error; + private FieldValue studentType; + private FieldValue skillLevel; + private FieldValue intentLevel; + private FieldValue intentScore; + private FieldValue concernFocus; + private FieldValue decisionStage; + private FieldValue interestedCourses; + private FieldValue budgetHint; + private FieldValue preferredCity; + private FieldValue age; + private FieldValue education; + private FieldValue currentOccupation; + private String summary; + private List keyQuotes; + } + + @lombok.Data + public static class FieldValue { + private Object value; + private double confidence; + private String evidence; + } +} diff --git a/backend/intent-service/target/classes/com/artedu/intent/IntentServiceApplication.class b/backend/intent-service/target/classes/com/artedu/intent/IntentServiceApplication.class index e708257c7ad5e2d90eab0a201edce537546e4054..dc8dca70296957baead2cce5d9daad7140db19a0 100644 GIT binary patch delta 225 zcmZ3)wunvq)W2Q(7#J8#805Jam>8JZ8CZB2SQ*$R+A0Cr920qU1-KZv7`WLPcz76i z8Tc3(v?l*yloSjuD9X%BcPuE#$xKcx$;{82tj?In;+&t7IPG)jqNoIZ?4}%DU=)}c&lczF1s%Hdh z1_34pMvw_Wk{!s?2hxl{npJB%1II?NG#8KrNi#5TF>nJ(9*6=U%?splGVn3*14TfZ j&A^5+FmMPlYVBYU2uJAW0?IG|)w2UtL(G``jY$Up8Iv9U diff --git a/backend/intent-service/target/classes/com/artedu/intent/controller/CustomerProfileController.class b/backend/intent-service/target/classes/com/artedu/intent/controller/CustomerProfileController.class index 79b4b33648c088a3ef7d28e50718217043d2a6af..984040273570cd4b678810478ddc58dbfcdc2bc5 100644 GIT binary patch delta 1494 zcmbu8&u<$=6vw}_YiHN%jnkOcB~FQxrlIkV#xx0mv`L@|O>0_`ltQ6NNOA3raq7ga z?F4bM;KT_j8mZ#W0f_@D6omj%B~D1Fe?$2fdTS3A;yb&}${;wg(r9Mh&U^Fyy!Ynw z{$CTh-~asi0f2GrSkRyw2-pasL*URxekY%;@SPvrftff$qp* z95E2HaTL!BB;==BLOu)3##M~Cjb0oRuu9H>tH2UHM`gn3v(%A38wvEwZ_Rm2sX1(6FLH%yHY>ENN4t%=v+9p zkLT{urn_-e8-k^`aLkRB^3Jzn(GzcB!HwUAMXofS3}Oja=>Il7)!m-uDlPBOqTyW^ zC&EA1INn=rN*+*N zK{mN|x!Wi|LYX;N)mrAPs?q0GYY#7ckAdh=dJiW#PW^ zrCrdN7s2Q3gJKe`$}~58s9Q=_t29cqq1vp%h2RrA=${)@r0(cx^$#YMr0I0#zr>6p zgfSf9!&Z&i?>YNodYU-MdXL*zT1(faFKf$}^?!5CKz~oQiRu;qSq<>F`a)52AFtiV efO=Y@?P*1r$lJ7OxZ{e8k)_6coulE4-2MxDJ=zlh literal 4104 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 literal 6333 zcmc&(YjhOl8Ga@t*{}={7gz*Qg9ZrKAqa{l!GY=5Rgi% zmD<*VZLOs@Y;9|iRDPJdo+d%ndqzbNQXAP&@vHMKR2steun^Q-n9b{G4nzBq< zZ4JHBv~Y`p>JB??#4!UiV@N8PInqb#d>vI>idhOKW(?2woq~ByT_sm{Si0-BEFA6P ziJ+5J)SyKQVg7EtHU zJoNf~&!0at{Fmdy3a-6i**6)x3x?}Sfyg)+Mq6jPoMXH+LFA@vCqHsUtv^VSTu<-o z8#x^dMiopEs5SO_J%wymcLo`k4uueTV*;};M9^HX@)3`t1#L03Dp+yxsZGVzV4xrT zUtw)5D8=z6tc{^v!IcpuDn*Hk4%|fFx`kAV?j-`FvitRfS>_G6(20rBfvup{k4OcL zQ4V8Ct>E%<#BLtUmzSq0mg#yydN&P9dv()=$hPB+SGD@$7d+F_x_C&Xh-EQ0y}=PR zgJCNIcjX0xf4vcj+euo=uRYX8U~r>~$(Rzu9SYio&3kn_Yo_gjmL2S6aJqS`;4(fP zLj-AB)?!yDk`2eutp%a%6RjqZQK%HI;l-PjhxRt1-oicu$Hi|vJq?RYc6B$Ls`K1Oy^=fVgsf@S2< zjkl_J8+ItDGIlFiT>*5FeMK0SP7H=(=vA=%f-MyoW)jlqi-DP}Lc29iXP_d3olLT> zVX@5;Fi~(*lZ5uzri?f$IG*t&6)A#^_^B4iW-m8-CfQ|2D>g$SsM!)Y8{Ml@P7`etZ(zfsfnmrBNgiz!Lny0N341UY!(Ii;BFQjFWdUYJh~{^VD)wPNdl4Tr8*@b6x_=)tkv6|22CCRJ zTACnFjgW?M85l{yq6+D_@-9MiT4UN^Pj9k8*k|}zrcuFlQAeA(0lVMOcrEZ(rTt|g z(4#`faUb3l!~F{8mZEu#{VE>7Ato9^wKJQyZa2K0c6tMw7zNXr!b};IbRZ<&#Q=t;3yS{pVCXA=b|uZ+)@3uETK!^DCJt z;-bKEg8K;-Ul80?auxhds9YURJ=Mor{D@+mqmlzV96@mP>KlIGRHB5 zv*PCTl@WLefGO^MlZmlZKXXEmzT-W1!ATkGc)jGNK)>S6ewh$#touNuSC8C;xA+~r zya`vnL|3{;@UrA}6pv-NU(8n7#)~xP-$JHndfwCqnu9MF48ygy?YX>5|J1RFYZ%jz*bqh)F>zEO|kar^+U#PF1g!#Fjy2H#iE=I8hF&p1JTEeCR? z3|WsKi93lRdEbMdt9S&5$oOXp){MhAOhiFZugv+?fa$MQJSv&KR*zR1iJduq?vZh5 zxH0^JkzWdoGDDSHIEFtlHpXAdRO-6}b6HG+*=PT5`AqqF7Jku7!MxpNR?O45pvL>}U8=g*p5y4g(imE=Oo&@wFq^rtv9e zYZjfxl_R&zlv`AP0X4ab3wixOBQ=>Pna!7y3uzbdw`n^Rmy#^voLo?-^0uNOyM(EvA#ax& z?&rBent9Z4!&!81J&jGn=pmxc;I1LOFtG8WErTYVK?{DO_e<>!1@ry z64q>{PEJuLkJgb2bq}KeED4nxsKPnivtenOLub?UKr7j_QK~hVi5rQ`R=TlW>bS^1 zpy=Rc=~m(3X6e={uB^e^aW7pUTsRw55f^F^7dF?&aS-pIP83}^#`Scgl3Fx`cXm~^ zQQ~)>;C{hl!V%@g!+dJf?>@Sn&o=G+Uti~Q?&8Gzhj8R5=1ypP0&^B8J|y3!Rr77i z;>3sLTTM;d9KndZh35q9#7`rCh152G1q_CH?nmlt9>Z%SK9>085FR^0=T=CpjWn9U&32x}S8&YA@-Kl|}l=#Ithy4$@C2 zzAWj@!=T@atZwF1$m)91A*-dNLsoN1hpc9h4p~ihjV;?k-uLPu#}PY628v& q`JDSM*MAQ`#Eycn;4CWHwBHCgQb!a3}_km`M!} z>v%zWPBRsw>`D7R9WUY~fj!bb&No|iQfDmj13F%o@!E-Bs*z6MsE$Dlk@TkFZO%CB zW>AVb6(a%%nq``t11kJHJFqxUeWO?jx#G`d)u^Gm$A57 zQTn?TiAWSRj5GbwzF4&aw{J+dZ#H?WYQIb0y0?=QXSAhk!(o!>wI;qilqzkT&k;BaG*^S8Gf17%jM4cqW5E*%VnnbnFuu`AQ! z6eIpKx7n?2|2B~aV!AfcN`-B*ciyti#md&2>7F;Jf!tS4$tbTHt|h;t$&|loQIw_m z|8+N$;E`R8{x>;iy!sYv*pSs0TV)?fOne*di+ZspXmNFY& zs%}6wnA3P1MSUuuIR2*T5-#N%sGeMUFkAcV3>V|PyCOtxrJG>o8#_uO|Mes@u}9r>I1Rf;1M=Z_tduHRNRtznkTbB-?L5!dA11X zb2iWKnX=(|rl-QrL|}ib6Nks7#v>F+^2vLJ&$sy14uQA%f6Bu&W;oFSu@CjB zguDxA^A491n625I4sFiFY-&>pc_~D`dEpWHF2C}83%-@%`w-s*?&kQE%OK!AKJ^fQ zvzX_XkT(OLjmFF%r->&x7!EV>Azky=Q>Y?N z@-6#Dk@89Q@wShbTdA>E$XT)%^7l;WMjWGEn${OOixa8IK=MPK#Z3yXb&lMHI<|u& zSLA$eAte`bsc1!$WeAu03reuW3Is-4P6?I{wH9?M3>eW$vim;871B}I%?3vav~g{X zRFmk(amp%1onq$e94UcppCSE}6Di6j1f_xyPYJJoC*(volq#T#Ni|MIuyhPoM>fwA zOq%?i6KY2yj7#mtzsK;!`xwnqth|(vuk35#xOWGyXHSIVemP&@V+Rw>$3*;;8;_(( Tzzpho6&rlFF_wl+TtntBMhu>u literal 0 HcmV?d00001 diff --git a/backend/intent-service/target/classes/com/artedu/intent/controller/ProfileGenerationController.class b/backend/intent-service/target/classes/com/artedu/intent/controller/ProfileGenerationController.class new file mode 100644 index 0000000000000000000000000000000000000000..47ecba9594f6a9c6e357084b1a1204a626407e42 GIT binary patch literal 4766 zcmcgvZF3vd6@IQPN3y+n!6XVHqzP##j+3x~*dd8bN~|WXs2!U)m;!xUODlQp)vnlG z*(8vbmI8T!#6X~>P0PScXZTboWt^nx^mC`b1KaSaf1uOpb9YzL+E$3dWU86f-o5vp zbI*OwbI!Tpi)s;OB;b$EPI&v^o?`V7nP4hyt& z?Hp@E5^V{zE9ihCa3E)wRL$}9d_^@ZPq#cZXIq|Qo2KrlBaU4#OnpGNbVu_H+sf3& z1nwy>A05@5X(Oi#^bD?4>jr}>b%s*ucC5kL1lB3I3!MUY)i;u*VMW~$NK9*HMISB* zq`I;@2UpCXj`i4(KuWS;iR0j>$qiOeIa{~7%*n)2fY>k-4X34fxM|Ufxr=IX%+^k#4<#g8- z=#8!!c$NBZp&%_iy-mUW*iO%zc2S^n&~}QdYZiJY)j_*RNYhE|AWRGAF3g|*c=7TF z3ukBN|NPOy*{h3}Z_K}P>Cm=Zh(k92*o$X&Z_C+E*>85>J9sdGE(JT$P1Y?}ED$%W zf-P_`YI}%R1g>y5D|>d1Nnh?(um=wb++7SPs2{7CX3ZBnHT*E4s_9)yDm2{MF?`M-?2yfWR8rTjL~Sqq7Q3 zJ<>Xm#S;nqK*1n}DB`Dy+AyJVjnhn01UxHM4=Wg{0zO=piOzN;_f9An#YutH<5Bwr z9=$2+YHOq;e6BiSEQv9OLltBhUIEl!+_*7+{=@mJpUuyH!YKUr-{1K1ldFp#zd1j9 zap8kMEnc~>c;lUgKVE6a5AjR_&nkEhKN8ruJmQXNIU0T{04|7bfd`_tW=zd>nK+h9 zrUf>gpihmGK4!SaxTznpEZg%FJ`p|;2$W^2D>zz7pRt`ObzIjhS1kmKs#;AzJyP-P z8N<=@R2$FOc_O`b(6IF5mD0HGoYbh^&qO)R9Mc>_eutfLZ^GbuhoYG+jIHLF#1%K2 z%(Yd5tVrICT$g1biBPv;e6WTFnNM0?uR5V?8LK73Vwn1oAt15>t)@{j$l|!Phxsv( zsuP42Y|xHEaH?E|VPM(ZzR35GRt`V?3LhE}F)7Tahtr1%M%$=Sv^1~c5b>9zObF$g z*m`tvS;nH@w_}Vnr>7y2X7q7&oE109p#j~a^0KV0gwiki#890HYVn@%;32SODQ!;@ z#3j^y&`0J4l^Tq^&u4kMaXm*PuUz%G?e!DKDK4`8>t_xbR=SnvE%_6-o~^x5o1L$U z{gYx#%^lHXG=`h2&@^D%z_xA)9B21m_olqtST!rp1vPT0QD%xhWDM%nujujNN^A#5_sp-lknO zV!IJWr_}0kMt!l4;2DADeLtdk6V>!dOPsC-n`$m;HY~qQ94~o5b*i;`_ztfw@Y?@< zLk;q(^zqudul#es?RY&5(0)6A>ZWXoq^3v_Wem%NYv!^345cel?`?J;p&AlOxG;! zO4ed3^3NeUKiAbwuU>lAH#!XR4wK|97kutzd%NG_^%Vj?W_uOiKjFKTZ{C6V|5JXc zd<)szeHG#_Y{c+0{>x!tGc^871yXDrIlcw*(D@~W&mhhgu%Y{NBzA4N?;2Lm;qF86 zP4R2k^eG2gd}Z?P4Rm2GZ$VOFPaqU3q&NyF`ipG91Pp)n228TmLYY;Vg2{zSl$53f zJr;Xx_QX*3cejQk&+~DfgK*)(Dt)K0%|0VpK zawl7;ox=EqobA%c7B*wDIf0j5{IVuml{;OZF)3&KYQ>C~sOlB`I>c|5n}~CP?$5Bb z^V_?2U&jM+_*m|q!>;3d=AgchKG-~<2Afad(U$HB*cHPJ;7^L0O`3Jr03<fN;NbB&JlXkFNU4CI zYiK!eghcP>)i>ksIu)p`?Rpn zAtLdykygCRz8K!~wWs(kmHdX!ZzU8ya_{4J{O;tey+r-@Xv5=N<_g;W E2gu-?0RR91 literal 0 HcmV?d00001 diff --git a/backend/intent-service/target/classes/com/artedu/intent/dto/IntentResult$IntentInfo.class b/backend/intent-service/target/classes/com/artedu/intent/dto/IntentResult$IntentInfo.class index c3f7d59a809787e98868581982033a9b8628cd6f..ea10301ea0b2c61239e195049eebcf901e27bfcb 100644 GIT binary patch literal 2898 zcmb7GTW=dx5dMz6>s>qR#&w&vrY(dtggBSFlv1eOl+d)Lh9oUb3AEh0u{ViZXB~Xu ziD$$U5>H4-yiy7E0V+r(kPy5SiQhyi-|Sh(7a38cXwRIPZ|2O*H|IEi{{8c>08Zgf z0ue+l7!FLt6jHa{PuyJ9^*3@?)^2;Hrb6s&#jiBaDMTl;t8v(fTSzz~)Y9MXX%gax1>5_B$BC0fj`V=C4=Eo?q&VccIo=t9pe5v4$$u@ME<%({~!L;b&biWW(EbPoWIF1~v*mN743qk+LMA5V-0f}8FO$^n9)&4)_du({lL|KS zEO=&AIGeL^mg&!oYQDJT*d%90J6r`P&dZ6f^&QkEqpR8d2Q4V5tfYL=!6j*w-K=R0 zXGV8sc(LMp%dM?7uYTR-9LTKIN^W)4tyg3pDvjo5rJ;~p{9p51V4)3}4q>)ulGjBZ^cW}eLKRgD44b8rdL-OmdwXH4ds;$EIq1t2$DP# zZL@5&L8#g_=*>{zp=ncav`>4RTxq(cJ4^0%*gf;=wc^r6CR^mx)Pq~DFw~QQ$(i7ejN?K8+emDCHI}* zUgsZSeNSTq9q05wXTAUfoRj^|`vyAmsTkm#>UZ8h(3wx&0Ox)E&Labz7qJvN=UJpQ zIyN=^6Rg1E zQWA$h3p$Sal(i2r-u>yRZ($nurhkY1HO%O}>EB>4%}nj!V6dfdczK4OyfOO+hBC%O z?7a(THe>AInKoi9ZxS+=k7Z23#2zAj7s-s7iFJV{@)ki8c{^hX$PPhP#_j@T^KpW* z`9vlzphO6YXA*6YagSL?y9QWK|F*7Xm&^OOh85O2f^Tr0HzLCO@CDwcE{Z99j#Wwq zJ9-E2P%_Drhj%H(P~{7LgOY_h=5dpfjW5}`_bA2j6%ONlN(p?xJWgZSvj4&!3-%)% zun^&&tsdc!7UTaS@?`$}YbJ1pt4yjX6i9L1w^J9V2i4py&SXhaoRZ&P9Y%ddKa1Ym zslr)fE}-p5s<27Y?9}vKShG8rxh49sydj2+5n61aQky37W?&+Vfs>sv+oo(j7MNnY zCUQ%!BZKL~4tdai!Xijij zQY9zzzu?4;2RNC2aR)C61zgf+v^*hlLCaZ@=d^ry2d}2jQ{KUa{>QKT!JiL%9N_@V R?5tyhYl7$6*klIre*nU70M!5h literal 3450 zcmb7G-*XdH6#j0qo86>a8<0{0h=>8&rX`jtYD)Q4el*$?Y!T##$~M_HOOxH0Y&ye? z&yG*d_@v{EuQKECpp2r!gQG7vcXu}=A%WJJZ0@<|eD~aYzH{!`{p;U{zX6y< zO+!RrvglT`X5F(&&8+Qsmg8kho}114;*!;9R=jjD$vdmA21Ouw+uSg-71LSEUR=3t z6+Ho^=$0&j?F((wvRAjAwHewRvr1d6cCMavmxbuWZw2cHw{V6b7-#$mO293}|xCI0HND z(;&5b4Cqoj=!e_pq&w)46}jML192qCPou@p@MteRV^;!%+?-ny8*Isq{B`Y(x>kq# z$kj3Hlcrf=)Lnoe*E3_+6Fkb8fpHub(2J&XPNJo9!oXg?B?se8@901PP| zHLx>~UN?|}At2oDk_mSZP+hNV)tMtne!8<>lD?%&6%RqO023{d^?+w5Eg0o>^Qkn6U}VobouJM3|D6|>Q>8XC$1 z2R3h1OhJ1u4eJ62duZ)Pl!mInzUM=E69QJ*8y2mGH}5t)yu#}rWlbuG$mUBaA{(MV zvIY7hI~&JABH1r!ALJ~?*$W(p_+%*yj_UYNNd7<}0$Jt~0wnPw|BV2E9T?_J$ab@d zqmivSVz=7F(eAA|Vtd@g(Y~!Y+D}e~O1&iQ3=knnl0cae$?bv7 zeU5C^r_8SO`Re9AcW>3FtQ6@pjf0Hg>H6r3ecx7n%Bqt-`L^oyDL$ocfGpn6jDH7J zxtI9^;v1;Zdzs%M3KQcGFzQb!WELm*ms2MH#6U`Ugl%_WOs13vm~0`kIhBxXE|yXy zCiV#1?_w~ereYnSshmd8R8CK65~PP9Ev0vWrgL$ErgMo@T!IoID4t5RK*~LyI@)tV zYC$wla(^Fh;25JH#T}A%Gdknc$<=f3s^^vl8OQ>%utG!)*Xa;D5=>dDMqXp;{xcT4KC zIYk;$N@&q#iUZSBPW4U9uD?i6sV&oVF6NtJPfW}?SMBYerupD3;pwBO;vDJbM+6gb zfl`FTu40}MMR~yr$Wu~C{ZYI_NyRmc;9W{FoMKGhLw`(#Li&XuncETTDQ`hy; GYySaj;D99n diff --git a/backend/intent-service/target/classes/com/artedu/intent/dto/IntentResult.class b/backend/intent-service/target/classes/com/artedu/intent/dto/IntentResult.class index 736fabbcecb5151cff1778f0d1e38e0f89662aac..a7ba6705324956447e89fcd212cbfe3b068ee48f 100644 GIT binary patch literal 4062 zcmbVO+in|G6kW&mc*f4;<~C_f3#28G#JQM;Yn`;TO)mtTwj?Fca_hvNCeu20>I+cr zMF=5yfhQzBfW8z71f&umRCp*7KhO_=&!CibX2$l+bfhLoqceNXS$m(o_u6Nl`SahO zeg*I-K1?ElsEU{l1#y9%^Tz8&wq%r-vnQ6$n}xbSeA+5o_5A|T;gQ7zG$d3cb#y=% z*j=csW{qmyEH<)Mxo(#0*rF5>6)}LtYbvl=%UbD?m;`%ICfG+us_A{35UKQt&T4y1K=(Qt zjMdGwjP(f}Phu}Kxnk5-W-3L}$NHO9F(t6AU8Ii2p@vl|n$;w7h-zS|?(kONu&@61 zNz?%y2XTm*G}hM4a#3L1%aZGcmj&NGQ_{p?Y2rvgv&pZAKfk7iV@%xGK(LJWX_#dt zj14fIZoP8qS>{V(-LmA&9I5uqw3+7G2>~%8U3*T)yv(&$uQLw-|l3rzGCsD4sKv0+Mc=eOrpB&zR1K!RvvS=T5o~&S%Z*l9TmBcBD?e_a9KYif?MW4Qf@d zcZ0Np4qZ#xYQ8f|7954ZY@fRW9r5*`{-*ihLYLnq2GT^fI)CRv-6&j`GuGVNRZh;& z&heZJp3ivIz0x{-fo>fP4Ww%@;BGH*L64GcUEWp;l}5E-9<}62>h<=p3EA>U>}7G|FClLvj(+7Ipnl862-?cYP-Wge zLCPi5svPYWo9+3DM;9a*{3jv4MxdZTt^?xL#C2w_lkwdg z&3p|dc6IbOXkS5zULCy-ZEh^Hj-B==g@NN^9CESoKhTkm-9YaZ=;P_wItH7Fp`1d< zP%fTUBqn|XsVnGAE9tlgl*y?CWpY|tl_1RpscFpvn#d&xn#d*72?!a1j`4ThVH11#w!5LEQO53VMBZbdv|?8nv5Z~Fe^tkf z_?vnfwLj~bnvU(Wso&W%wL;>xp3y5%$Jg=rSvfzHi^+v_%w5rBIXFw1oMJC2ttF+o zG?9zjOYznc>%-BS%&GPgOT*rZMPe`Q3@38lanlVZice5SgFz_x7_U=`F!h)51_O+; zVXfdzN-^vwftM&LqQHoP<8{Vd*+O+(ItMpyG$9IxGyiZCm GBk>=ue^u}R literal 4657 zcmbVOYjYD-7=BK(n@!U#ltK$pL@uTFLXF@BO}Uj&pxOeqhzj1e>C!GucWZW2#rp*v zN5AMN9e;p)!5JMD9ma9c4?5!?@CWG6@b;YDO|qLrnmW^F-}9d5Jm z1;*;853F&|L*z?y&x_WaX%|S?9T5749dpXFMN{tR(ht@Wf8u}{uVmTt1Z=DV@)54C zdDA-+_sQOY!8M*x;P&aVzx#x}V!0MiG-lh5XLy!l(?Q*nMQ3T&SP;2?XyD|6T{=3T3+Vn?t5J;O!#GO(T{=3kj*g4s zYdcBEkdF0|lG$1x-hBftcrKdrgXjF@Y2wC>1NB~%*kkqDwYyQ$^u~jKdAX7RowTWD ztw2w>U(~IVKqqddb}3@8(3}1~QCO5WX+B>zicGcG%Ak^r4xUfb%@66wVZT7CVA$gl zEtLm!Y{!l?5;&ye0qmE$BRU48PT;7HE^Ls}F&(#KtCWuG=)-OS;l%H5xR-$HcnfBU zS48H1Um<#b{h63*iw|mg+cN>W>0GzJtgb$83>MUBd%_)fkXRw?tt8R zwQ*fvoh2KHt3PbIww96goFG@yD8SS(7i%lQl#Yv-7tmIWV%a=>QJ_DXk(Gpr6zwqk zy4lk#9ha~uuzAT?H1m#KFucbtkA~Z>XV@OI&yJFXD;v4~pC+t={>=%g>Cyw1ZFz@$ zzn_zScXSl7#3nT3luHHkxFu`zhG@IJTNYD#=BVR%u2(Xar%Z3bnRC5@H&r%lrszYC+ z=L-sL*vwxE0m--UR}TQl;5Lr<9>G=~BiQneTM}+-jgS?6m6PpkjfjPQ6{7yuh}ch7 zAsTFrXc&8%5apYrk$|*06 z5w2j1W~Ghlxs~>=1O34H64G$37n*hdhin_SQy&) z%K8cqQ66a}_ig$5=QX50^CZ3|P3GBiGo~ESW5QF**C6(xXc$QL<&yvk}j*{kw>vyF8 zp+aG}gkXsH`G>!?ahp{1K&=2O7$vR>VaW)rhOF0yU@Z==;hRi^OHvI>YO9*haUtDg zG;KX+=or~Z`x)S|?=Z_xKKP6VpK%#^iZ|#{+^VJYhk+6Dx!9Ozkv{${?B;bY-p3Uz o`w9L$uOa+L#EU%YWxUK$H#c~Nqt|#LUuV?c=H^$ZSEzgCU)(*~G5`Po diff --git a/backend/intent-service/target/classes/com/artedu/intent/entity/CustomerProfile.class b/backend/intent-service/target/classes/com/artedu/intent/entity/CustomerProfile.class index 8bd743c367e084b85f64f929bea02495e0f10233..8b8d4e8954246c36ac26edbfdf92971ccac078b5 100644 GIT binary patch literal 15764 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 R*WwQUfdWhF>%>N~{uh>!oF@PP diff --git a/backend/intent-service/target/classes/com/artedu/intent/entity/IntentCategory.class b/backend/intent-service/target/classes/com/artedu/intent/entity/IntentCategory.class index 87534f81ef520dad383a356332d3fad351290ff6..cb882c3e29598ee0124c6314669c06fbf9f7feee 100644 GIT binary patch literal 6455 zcmcgw+kYEZ5uPLKvXWM|EZed-NsCKV;%f!vnspp-?KC*G6B9d0Q=qMEE%qj|IvLVzq2LsFY4U5>?EtTTJWIDb0#-zOw;Z$zWAH zZ&g;x_D0n%N&R-6cCcRCDBGnno{qsc>hwBRcHthYt5*3A>-7Dla=ya0n{;|T+qx^c z^^JnH?}3f7RjI(6v}Sa=ncjdqSE{*ctsp5yRtTb$TPc3D3WhEAG3mmMaMA8}i&!MQURB zE(X6@M_At~D70!-XR+t0p4j&C+2Bgoo!>om*SPS!Sp$fi4V znqyNOrUfUCtUsvJA=am$Uuq5|o8P0;VK(=|yx1B|1}y1xgpLZ*0hn&YX}h}^pGYz7 zPMwasv?GmR1?asxy^r3HV6EjUYieVVII|JDM^Jy`_^a)?t!5YURyjs@Q-?;&SVeQ* z4B7cfHs*D*=mUsWZeznLBC6xw_&ZzejdPRx33jo@F6vp?oA6o*peu{x zitdU8J&0KXq|x#<3rxoO78O| zqt)>t-_S}<`;yTJ`H%-&$^E`$w1z(9ovq{nUotu@AM&nNvf)ccpXEayZ6$B>C4Y$? zcE~2qV*sZzJTiKTBL0Uvtq{)P=7X;iQP7v^D}H_w?fT)Y<=i^s@29(6Kb-aK=d1pH zdfWBGRfGL}&EHRdyMDOpu%EO3ezvvihpQI*`MSTK8`|~5Rge8V;_qj$T|Znk+0Uc& z4P3drHJzWG?fT)W%YME|=luNaYS#}}ZT9mme?Oz``r)e2e(>WDSFEe!PMmpzNL(5n zd4fX0i=!`+c8)?F7e`+pZGLQIlWvhy2)7;_!^I4azf5r>c!jzzkUnk%H|cFIVz(Ir zWVabMLW~Jtq0|LR7$GC<0Zp0_fF@1Nh%iWVKoLXpfTqkSKvQPSh%zYVfTBjs1DY}8 z0L_@X5oeI@fFOB5`^^ME`^`=x!JtkDlrTCypaW(XKnKjE(Z!&o1L`u89?-nm4bZ%q zGP)U*azNci$^%+3djMK6dyO6j^*W#)qt^pkH2VNrG}A^OgVGMD&q#Yf$IO0!j+p~S zKZ6DwP`@$Yf`S)uFgrZ2S@n*7MFrF?W8xBhn;t{B`^4jP9`Ee{WyBf!4s;#(+VBuP z4k<|cMUlP>DMa&PjlKsdOa(DZ--i^TvY4hHK+@=p$j}cVMd?v-BRv5rMw@h%E96z?NS$aMF40dRb%`+jf-XWzikp$DKZDdQMp43l4k;xL z&`H=IqaLwJ=q?F?b46pQzzQ_De`PM8eL|dG95ruqq@t!?K5l2lJ=S@whm#c_ z6qK9bBj9x+S;vzTdxDcPC3hqz){u}|a`Xa4#y9D%ds)BR46?xpIu?!7RGB8tkTfAf zB}p?vu4&2)OH;URLf$IYj2V$8q^!e=xTgK4CQVx1ghW=X17=j3ki!lu>YC=wm^8)e zCSLQ*@dxNBN8b!pP;Cfzk1GZWH;EO%H5Y1-kRBoC{Nbdsb)jNlNX>!pww zqF+M_P)zKk-yj4Xv{S_B8Aw6eOaG#0A%*BT4)t@8!c+z7w~!*}63)}}kTe|k2kCc^ zqVy82(F>4b^beY+7a_&zKXfbo9+EE7)K7nal;C3D*Py{2S34x^G z8urHBuZ3` !MO*uII4fvn{COmdl|$SD;_x&xu02XgEjO z;6t0LQAhxsTU5BS&(ht;FVnrL+$ODXsoJE~)Cna|Vn`K~JjHTR$ulf(D0x52WhEbA zxvJ!OmQN{pf#nC3yqo=hP|1rde^|-KSpF#FP5OB2j|T5=+Otk62+$v8eSS&){*GfU LSMdLGh5qzELdLtf literal 7223 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 K>38&d(*Fwy*)1#p diff --git a/backend/intent-service/target/classes/com/artedu/intent/entity/IntentRecognition.class b/backend/intent-service/target/classes/com/artedu/intent/entity/IntentRecognition.class index 655a1f6803c8282038452e7973f059214929965e..68e3cde13aa326ced49549f1f9fa6c04e354f472 100644 GIT binary patch literal 10436 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 literal 11416 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 diff --git a/backend/intent-service/target/classes/com/artedu/intent/entity/ProfileGenerationLog.class b/backend/intent-service/target/classes/com/artedu/intent/entity/ProfileGenerationLog.class new file mode 100644 index 0000000000000000000000000000000000000000..402e3dccacdb1ab1f9d8284888347f98b469b9f6 GIT binary patch literal 8713 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 delta 27 jcmZ3%yn>nI)W2Q(7#J9ACvvn-=4I5G*xNAKk})3ujq3@a diff --git a/backend/intent-service/target/classes/com/artedu/intent/mapper/ProfileGenerationLogMapper.class b/backend/intent-service/target/classes/com/artedu/intent/mapper/ProfileGenerationLogMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..cad832a06e2a86bbfdb46201bb1516e15a840bc9 GIT binary patch literal 433 zcmb7>u};G<5QcvjXlMb6m5Gg!8(<4Uf&rEw5S7?3=@DEdcI4PdeKiIifQLd{Qy~O` zfx$jYzweX3^V|E&D}Yn%Wf&QpRK6t+QRa!Pi{c`++;tM@F8D{=$h9~L9IbbSuWyDZ z!=}Ohf}fchb~W9W3#np;u>q}cCHvOSeWG?*YG>aysn;OLC;F0mS)&XlGg~{3DTqNV zenRu&pTM)B;k%GZ*|_{wC_m2)rZb;HC0A-|aQL_P@#=L32lq*VtvuM?mW^CE=i@M- v-r%V4p(gIQdJ?jOJ@MBCT3hEjDT57NTly8yQ>Oa}+n5Y>iXE+E&3Azha#M;T literal 0 HcmV?d00001 diff --git a/backend/intent-service/target/classes/com/artedu/intent/service/CustomerProfileService.class b/backend/intent-service/target/classes/com/artedu/intent/service/CustomerProfileService.class index 829ca212477c2791e7c537e6995dab11e7a09c7a..f24fb55e58d97189ce830675942a97b2be69e635 100644 GIT binary patch literal 6281 zcmds5d3Y3O9e%&fv72QAVFL-2qfpY43l@-axPcM^*tOwk0||$=PIiYdWOinmoeiW_ z>)EQUwzeLn9<3)@JgU}Eg0@sGRjfzrU9I<3tMxDc@Ui;%esd&~(-if2e9V)X@AqB5 z`GnNqC#&qZ)G+T!eW7 zQN6G=mv<-`wYNV3fdvW{;$o^*&1AGZ^}906rH{hLT6A&&_ zSVFX_nH|P4!G$oBo>@}~+I^bT*kuZqqF!K{WoI>ebN?2tkP)~n%#?p+94r-RL{k*a z3YKBHzzS(P)poROF{zu5X3|WW-KS@?WLvS|SY&>eZ5`ANt;1Uun4KB9vEB6#qH^6} zB(9vhHyV|9BQ*^xuri8O3SNZO0?Ws;GTC*3ctJDh@9lblHrZ1DFT611mnj8|k4y@)Ucrlz5~%PP+i7Y7+b*21P)w(y*dS0pRzozH?(~mVa2zeT zLct~(3Y9&Y6PPlcl{=diw8@RNbT(6V>dn5J6C+C64_H4&Y@Jmr9W0 zCIVhvt-JC{jMpl-PGXD~T{@fl(^#y+TKv^GO66k>R_z}gEeAhHx%lG1AxyiQVD zG(M$aWyPS#^KVpelRSUvWam5d9#eISwiZLZy!2)TZ;_XzBBTj?{x`_Iw<>s>+^g~T zJc=O1@Dm+w$#vj=`B&bPr>_f4@<6Pk1mLQj0nuV zrpVNi(>nEn-fd{DrfE4YP5Q{XcFXQb7V@&N9<=F#M=iTI*{!MUA81&|Vh5oPT}ZYT z9qXuWYgwkoQqMVOwCkp}qnPW~?AXN(**aMLVNyW24G?6ZAX2`dCF}u2?SPmtEAj*{i^!q*)HbOcq^v zoPJTY*|MC1!@&0Pd0|F5z81%Md_9WC6?_BV9FfX>t$0f34b@ME0@GE)8L@CvSRMX7 zkH(e!JTSCEUAtxV7W3h+pFnHFX=ud7-Q+!WAY`PV-w7@G7urppw2XmGlDzKg5stostWy;_?5IOmES2S zxE)H`G&S4pPqac5e_*3CfzyoiwkZC{o@4T(%m|)qVlkzQ(B5n$Jq+)q`}rWhFN^irYtpR<_`dCFwbSC(IeEO9B^TCiz|I)MdE{zAaqX~% z#s`1Sn282*-^lk;tfD2>(4$iHsm=79G(WhyxOyFbCpgGoz>aWtSXz5XS{o1IG-X?b zO&BEP*}DRf=g}2K%Uo`q!54htkNLtkjw3vkKFR>E@R|11Uqi4qC zA*LFKm}(p{L8E7asyO}mA&-laC#eRyK}lcZ0J80o4OF#$lDMzsQ+mr4wRdscdb@b! zHjW+7o`Nz}AnZ#g9t}$; zPH`u|bdqp@=^nxXraK7-m~JKgH)NhKU$+Cwx&H)mkuL`T literal 6343 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 delta 4443 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 literal 0 HcmV?d00001 diff --git a/backend/intent-service/target/classes/com/artedu/intent/service/ProfileGenerationService$GenerationResult.class b/backend/intent-service/target/classes/com/artedu/intent/service/ProfileGenerationService$GenerationResult.class new file mode 100644 index 0000000000000000000000000000000000000000..6da8b686bde8b21b83cd9440312dbad3d6fee519 GIT binary patch literal 3767 zcmb7GTXz#x6#h;!lbNJbXd|}>C~CErv_z{YO)0lhpxPFsh=8aJ>Cgs3QYHzC_xok( z;#qz1O&;Vy){<7i<>f(K%f(L;@!K<#CQS#eYqdH1oW1vV_SxS)`^=wzU;i1v6ZklR z2%-iw3p!#7ZD;HYcBWt#r!xmmopEv%h1j-yF<;rP5bf$d5{HSnfrNz?SPH|r(z%T7 zR-CD7CSR;L#Y(2^xEJy{Cv(s(oz54WeNNGF?Ml8>ob(kP^_4?Txmw^3M!A~HIpwl~ zIxZWmu&@$s3W;2`Tq&J%+|en8mVP7jK0(!xDr8_Sj4+0iLkT5Vws))IEs z4?&@4Y-yZ~HD9@y84k7x!u2py7VZ^H({bIBJ6@g^)D0Fk;ywm7RrSv^F7b{gsM=)V z0X#_ioLw9_U$qMgtGgP)^)orxeO!z?EIf=y6yo{vWbN3@tf%X;(2X92)@i4*r(qlF zy^VS;^kK8FuLUl-S=H6uuw9THVfIlAk4a=PN5U%0{*POvofvWMG3@0`R-d%+6t?no zTn$p8&`a25Cr(hZ76t{og(xFI?j(#M3)|&f=8RpQ87@sZ26if}Z6 zniwM&y_@P~I%HykspXQFSxyf!r@fnkO7x;TB+!#hLDfoR35~U&OgzWD_HL?`B%z=8 zHm{eXhki`Zk4xaA{}%WO)^4{P^d$=~3uR`d}}_K)zCTx%@%MVG5aC+*^5=Oy09 zStw-kzwA1e4O<9Qt6zWn#@nbdwKP(t#Z4)oP(d$MW*nCZl+1M0i-XsjJ8sVgT=069!?rlfQ8_ax=I^Y<{WaG}w8KGd15JH)y5yC&x!LY>*OL!8^2 zoqr5UJ;Zrkv-6EmXFg{k&g+{K_EV^{gVTX?mg)5E+j3r-Vh>;l>87Z^DXdoM>(Lgqlii=SqFp8%VH6u-GHoBxk z%=+hCsJdGyVU}4~jd`4B*NE`T=Mr45MX?8;piD_4%2`w>>8wo$RZ1~@#E1I=B?F&h zCtjgs;#)SmS1HAD73*=4QUb3rj;&}n%)hY0fN5E`vBp4zf2O*Pb-ozCi^#qCsp_+Y z0giI3bfKsDO8O1Zzf}6d@pK+aj;G{<&WBOI5X2zNrMAIs+R%o!!5N|TOPFm3E<!|0pCHgCN@tBE3|1sYSR_ElT5x~C$`o|Bovk9KE)f9BIsh%d6Q?1Vi(5o79|ZQ(2ut%>7->X-k}up zX!sq8J7hX)z*NkMy2FeFlZebVLi1GQ#M4F_=AOZ7=rx0yjkb6xFpD*q)h(M>17l;c zaos*dK^F$iPe7kcyeFZO%%eB3KjQxY3$5cR literal 0 HcmV?d00001 diff --git a/backend/intent-service/target/classes/com/artedu/intent/service/ProfileGenerationService$ProfileParseResult.class b/backend/intent-service/target/classes/com/artedu/intent/service/ProfileGenerationService$ProfileParseResult.class new file mode 100644 index 0000000000000000000000000000000000000000..280fc2f1305f988e58303eb1ba315b0d9b530f8b GIT binary patch literal 9271 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 PiaOz=df~^2|M>G?@ibCR literal 0 HcmV?d00001 diff --git a/backend/intent-service/target/classes/com/artedu/intent/service/ProfileGenerationService.class b/backend/intent-service/target/classes/com/artedu/intent/service/ProfileGenerationService.class new file mode 100644 index 0000000000000000000000000000000000000000..c6cd81b8795a6f29bd621228a02a6fd2b904bf97 GIT binary patch literal 24619 zcmcJ131C!JmiD>#C8dkM=tDI^8|f(@wXkO6Zv$r}u7K<^RsTuU=J=Le%zmNxl2t zz2}~L&bep1=e=)#dh|^qy3{!8B1wjWvP{aR96BIo3Hw4T{B=IhoKSGFKj6F0*XRp* zBmQ7xjea1=45dI7R9g83kSKT2SybSlLX!s4ptM!itPDqd4T8?9YYv5gNv*%ZSLF`` z{9(1=Sq>T^XzCY7cw}-3AV+f`;-bN1@SmY3okPO}<%fNdsmD8Egh~aufL~2> zT^%qGlr{S1G4q_{5p+&(>;BlGXXESI;;-$E?_M8k?dWZNs`t?0*s<+A{34Ss=H=yK z`1DXH7^(^{;RRl5(q%MJP{HD0sKJYsH?Hu7!b&OxjkFeLBUV19@7j1NSD17ql>wiy z|8Aecxq^XTWzr;qP!FmLHaAA5Vd4J9x=0OBhtL823qK$66s&7ZnnKrtGIicSpt7<` z&;=PrXTZ-%(**U$h~C2w^*r`MY~QQBNA^2u21t4Bl-j8?7tXk`vXZf#X;KBv!VF>W z3SVV#i6C!=8Tt~S@12T@SvU8++xHGjULIANR7KTbL6bKW_F0=#%d?F4pxzg9Q7suxx(Pj) zHOC)|J^6I+f#>2+Z_x}YE8-qEn{*4^3iar1YVtK=|CVMX$7$wJ3;dc%3+Z-2&Lx)M z3mP~&gP8Dii%hCheIr4w8<;&llNJ+%VL+YQ8d$&u#iR@gnveml2KDSzaC$_!gP_5uu#7D71{?hK!Ddgx z%0{#>{;II3$652dK(tidvDBQAT24SD z8@B^cbmid6XG4z!gMnp!*sq*?Wqhx>rR8G!Im5Py)k$v zOip4O_3Z+Nw9tB!9;Qd&RIo)2`7pYE3S6CG7Hcw$8Z(b+xY49dv>BV;-w2NdBhrj^ zf^{$oEwt67M`;^m2%DSDdqDyvI<8&G-oaqnW70FUSKDM;DL_SiUV>Y$$8#p_qy5@hnbxdb zvMOcWE5^*@y?nr=7wARMJ-}9}Kzn6@#h2az#w=Ol3za+RWkHw4x>{lf9*M8-II(tf z&tsjjhwyh#eBG9^B5Y1LG?VVRx1=bc4yLk6#vKkgsYf= zwP*6G`#7l($-(r`CVhjAZmvIUd2>#BM^H&B-x8KE!7_`3*h=AGqhj4)`ldu6S>ATE}tUJA-MhE>X)}7?+^tP3)`A;?U+l1r1MP z!V(k;H8(*wq#*S^6nI}Tjvd-?sxXJOBdi2_vDY84aQzhv;;*6kGBEX)Ow#3~ZXw>Q znO-@4YHd;7_{8ED`s+)Irp~^xx^{HKcz^wvB5$~;A-rUva%YQX%$;3j(iki~eQ>v$N4{TM;tDjoeNx+i)IYrklIE73zr_8IUzAlXolP48j4LH-L&*ko^44O8*W@=Go zMO8&@(bcRu<0kb`FEsic^^58f;WD;a#=w^QXg_9FN^fk}gY+Ad{+k0FCqijBx6KH- ze@p-Cpbt&@Kl+`Zv6%wp%lD4l_w%1{qZ1t_h$dZgy=#>MUuoh*C7g7LV4kzu_XP)q`%VNkOxRehPGycW@V6#6a_Xl;0=e%GpV$cPL^eK(%)ews;Wxs z>x*X2ENf_R(I@n&gHD=)gb-A$w6gNbbS}V?aQGmpNDV+y!(0Uy&rz3+r})^mfjl!5 zPJRf(6j>shHx%G{BSF9(oN(Thh*wzm%kzXoI2|I_6fQQH1!{t{F7Qy6dc)OFPTbct zMZV|CBMr&a&@1 zD|K$m$L$iMOmP7_0$Ff)z}halz$utqy~lUPceHl5x5S^?8|&JR3&CN33l>?zph{b6w&pG07n&o8oG5O~NBpa#_&`Ytsm( zn!&}>n}T&qRT7aUCqa|cZsksad{O?Cu;1&cS&D4yQm@}7ritkeF~bzsiJ1wWs6jUe z8+{xb$RPaOG>#`Ip|?~@XIO@Z#4J->FDli}u+h85+O=ue^c`;TQT0lTuoU2GQ_L1~ zKvumQllx8eKiw8hivlgoonkJwc#%`o;>X1-n`esoY|e55zQ!eyrF?6FDQ*_GU>)J+ zMPcPMD|bK5$F||!1}A*{`0-A$5Cn6%oWcviWY(&zV{Fr!*yh)mola4QIML<8qu$oG z-Z!_!)*jW~=B%38)#%|62q$&Sp|egYn%*<4>>BdC=IpHJnXqU-v=FgP1)2OhXDQd9@dfFY4}mtfzC$i5;tZTRY?HTkJ$Epmld{>TW-n26NY{p51$5hn|i< zv^uutjo70bPV8<0EZ4;V)V>jbV`~rgym+){!|wPSj{rn$^GnuvMP~-LdwqPzrk=fr zdRrgB^5T!R#vk2^^=L$0my9opJ^x_*>D}=?Te{m{iXD6+e&~(Z?ichzdAv#%_eNij z?c1Y4U>ZfOwa6WJw;wHz?|!Lg&;H_AN3^GNC)n40Y*Wv%Lx3MU`n>B>z;Es7KDsHk zWdl@FkPaSr=QkFaG#JP&B@~CAPWs#8c0pXHVz0-a|)S zmyIuqzy3me)#l#THL-Os7sn1oPi#Nl-T7Q^>$An^rYZDc*E$<>mZVLGi{tCI#tyz1 zJGiCzgO&$W>rk|~=ivI@y)X10Km1|WdM$iP^5V~Q#kw{#r((xfpV-^k-M$~Ubndac zbANaHBP^A=7c)$=V8iOzmY2IbJG+l099oe4%0RJ~7*u9aqCS zx|I2V)@Nghr**zieP8}x$R5{ zFKVtw96S?1zR;viA>U$zp_mid)GstLeR++@D4YpJoX6Fv5GpJ zH#anRLs%JeZkcc84b8y_Q}&kI?$wG+>4o^y*tBoPTDo|Lloq9kc3Ba0M*Nw*v3&=i z4Utsx^d5VqckhPoqeo%MJ$TsrfYO#5*LqI8yo2>h>vq=8=$X2cJzAMCa9jS%icUNk zjqN$wv$qA0*Y~`+DZabaYWFPsnA_Lotsa*v>^#AWm5py%R4-n-vc#; zX;K9ki#Yr$kczcJ8EuU{{fH;F`bcl|xn#S$6IP-tzI}6i)gJYH+XKBvpeqyoZS2#; z8*tY>6+gJY`{)`RV0hw>cf|Lui?=@3`{qNQ*qYa4hjzsu-XGht(GzQX&APGy*}|X@ zXS_jTtQU)WrRTs_PtV@%vFBd)#5V5YA8Qy}Q;_AvW3Xnd&wJK)KxOu}9)TsW%#bFD z+V9YrP^-LR*u(9ICzK-Gfm($6ifw$o``B@90kjdpbAaq^U4_1^06X?*MQPbiZQQ$# zLi5Kry#QSfLkN0n@RKgTtn|vul-fLK-MMr^>E)O5onxD9GJ4=7%cqG*4XaDJzb9%cX#c8?J17Guovvoor{$~+ZIZ% zCH~CX*xEH(tS5}W5;Pb;VFLK398taW?xU~8HpAK+={>#{f-_YQZI^~B}p_st0;xTxmm=d`p zvDy@C1WpGAT6rtBZ@O^e#!!IM@+zKGp_=U|uZR2V@izHAD=zXRhb1n#a6>#|iVb2T z0+ps_Qn_HUt|zN(5#h$$ldWHn5lSI4!_! z2m_GJz!)o()3O7Jaf*Ei#c@{Tb&BUPB|BP)cs`-| zo_NU=FLQM7!WyjN6F$91jC2SKyZ!dt?*Mij#vSG`4(B+hoQ~K6`8u=*x^vezOcCWA zfD6z?Tat4O-=PVob~ud>zL z_eZAqae80%$SM8}giZBlxbx3U@pJCnU#n8vS$7JY#pI{CDct=(P4P?aJ^&^J`Olz+(nt4C9{WoI6DfbV+*MJfO!Ey*z;Fa;@!;JH>BsE6vg7&i`YI z-zG4clj?;##fOkoxYyk4cc%C~_sRjtDNB4#@kf|D+jrs~e>TNmxCfs#PfvK*PVqOa zs*mf;{r_%?kGVguYN{?uOZwJM@hLWy%$`%97F_bV=T-YnRh#jw`KIhA`)dkap9le< za8kjk&U_R;N1kQM0xmb>9gjWcuXoCU*jrYKj-{KNam0Fj8xjtQvrBb& zD9^@eq;#LL;46_^o#&89m`+Mj%z8t4zQC?^$)Qk>aySkkRaB0)EHdQ?S!^$=*>{>; zW zG*eEOGX$LtnNG0~sZ*z=uC1YZL(DW~1+zl!M_b)9*y~{kcvUU3%9PbS!4RIn?vsSi zES+P@8xkx{u?0N524;c*&5<{na$b5T%Rc1En@qWYDaRtAD5tUH@wdQq$QeBTHdB6$ z$M;7kOmEu-?sYqChDLXhDeD+rH!H!EUg-$?Ou3k04FIe(qrt$I!lGzkcbIY+0~-op zY2DJHHJGxIp}~pnYfe})noPM|;xveBaMb#=+PmQ^63JAhm?tBqZ073MoJf$}J6_S9 zuy>jXD@}Pfqskml8Zz#K2&Px}xzCjMCy0|~zqs22FmAfrL#ABC-Esg528`Fa#*}O2 zI;fMxIw1^#YQLgoswjlTi>reemxp0OC5o{ITlzk&gO>1(rrg9xGUaU>%44^{xaxI0 zYRYZgg}K+qY;xD_u&dm)MLuE59XuiX8dGrEf1OozgTkp6xyzJKa%orr9#(q85&Pkk zh*LfVT{)#+Gz%qW4!IwNqJ6caPZvvC zB|jD<1aYXLa>;#Az4$Yf{|v_;`I0GL=2_25&WgSqsPfZ;raZ)}b!b?<1 z6+b;}%2)a6Ap2>JK7qG;yl%=Pj5s?`7dlx~;P(w;( zq1vtbt_L0z9+nr7l;1_^sQeyWkF*ox#a1<_$1V%alkdszJLC^c`9t}mL_uR;n6Tnl zRPumL_2>&NHO5QF$t8ax|IHzPYRaFD|R+uSTU;bA9uS23z z=CJ%f=!2wBtSuM&VAE0&Pgrb>`@JduAmQxisnYml|Gw@8yf8W_|7^;?$iD(b)n94U zG>Z-yQg3`zAO|2ng7TMtKjpAD;ez&^!6iSDpE~48(;$w-Mpz8Y`wAnrD#X&8L?>O|4PQcjmRjcgrTOjTu?P6NS!qM==b zhq;Yh6V4%qr31a*-&oI2P1DF{w9dhl3HkR1*aCzWd+U5EH{>+n|6k5K`t%jtr>(KZ zZWWjCOa-P<$TJmXo+-IjCoSjxgH2-y_aF6H{cHS78j%nQA+{UDgNB;MIXsAM5mQj( zPY>|3;ihpOKO1a4(=#R^(CrQbPQI>Z(RL1-XNfm3CA6fu0ahScX=uRBA70Uj00E^@ z0adGBRPRHSp%|$ST3p5m;{twhYnaOzZH#dkV@+e60Z)I3%5SAqxz0e!BN$q#S*Z(i zvFcQNt21;~W-Mi7Ief6WD91&y);ye>A-b5-*ce2HNbk){Gp4#0`MfBz2XlE+kJldH zQF{|0uNZmH68jae@mAq^E1qv zU$da5c6!yqIjD}DQ;Rk<0g_!-*&G5QognOA>2LJuI+$877R>omE;66z1?|zcZe~T6 z@=IcuW-wzG%BOvs4Y;@xg`8a2k;9dhe31)uLXlck$u97|PYzNVNcZ9em@hF)-|Aj$ z>_l}Yw4K%?NkxiVbt&&y)v6jLC+dWhYk>NU3JASbRcGDG3nZ;QuvMxJ%ed~#U~3uu z)VF|OU2uxPF9f2DF#}A?ZJKH+BMSnko9(+x)h{~ht(tXg$#fpVS+e+e-6?dqDy0pl z!)m7H&QlbyrIRO@Pge33@zyQF7z=VfUO}l_n(zxVS5u};rmR^C?1V*_2hxK8gHj&Z zY67zgKa5aPnjn(SARH`RxQ0|w;(a_WLgu58q?P3fGc1pnl56WMLD#412@9#u10@CD zl%-shasP(vmLh2ufCWrd7gNG38|#40Ig4RR5?ogK;9zsa;&#$EN@Y<+%H)YyBh^V# zw1%7n{0)9=ue=6-W5P@3On1_NCI-V13oj2ij74~yp{P+%Fawo74;Eiu+!`{>n1XqN z=K7Ys&A(J02E>bx9Oj~)*VZA5@~YeqN|Y;o@xvB_f0Pz6phXb!r=Wse0>;WP z=;`i*wDlq$%b_kNgR5YR?q}DSA^Vv=O9lZ?na|$8$=4bGVM?Vsj206hVIhO)R=cp0~YI-2CODC;m3lyF!8&Un0JotJ@6FdpgzP0(kYcqM{0d)Td?jgjv6 z<)vuS>A|O?l7VronX>pe30e=aSQgCH;`Gx^i=Wu7$XG+Z7OxO=bq33ECJQ|>nRCRP z2D~sq>#Y5z1myEuh7@VDw`AYY^@|}S5E6PaEXy*8mTFAPBQWVA>VO=laQ3^qU%^_E zy3!W*gl77xpr5)WQ#C!y1gZqc_Z6k5&NNq6KzSC4w>Uq$dq!1II5O$S`*b`8Uq9_t zi_?T{X%)1#sORYDfRA#Myf_^MsD-QWnFjqu2bazd%}@^3xqYOjMwbwbXQ+5%DdWaP zIb6sWWWnMflfU5rehj!a7>tB*(AuN}pm6^jW2ej5WjyIHcALgi#?xsrkcF!z1x9$S z$N_mZZvbb?DL2-n+B|EVo@1uBu|D7nqtqj~thp)mjao}A`w~YFZ3N|EpWf1=1|lIwI2H4{>apT;9a>eQ8=O4t6`@|^*k z_%JIP@dXeSl=7!61|(G(jD(7a3M@*d#0!Y3l4{#wL}4oXY=}(4;xO9N-uz3$*^(EwRgzxfx z$z^2;H&%mXWhqj*%_u$X&K}%vU6h{1TET@Z#i{3M46dueso9i|3YtQ?f!z4?!w9;O z#?d^wi00E3bQ6`+tu&Qxqe}W3o_f(*guivPgzBl0d~`oP3h^MM>|w~+qxky34r-ty zc=Amw`#Th-pHPJ2w1R$*rT>*8LgJGG4!T?Pr+e_m&%I(a-6t-_X96bU6_V++O3b4* z;#RzSUPtT1GFq>sXcMFpl43~_UtPgcs_tEhD@j@64x`K{hkWJ>uW^+z2~s;kR2h?v zt0BEp#W>>{^m9<9C^n`T*OHTJ#ZY4^u5$5NjRIpDp1QDxZezMJ1Csd@+G$*8%p?=| z28;?^2RQhAnx20LifNt!_}2jw}a3;$U+aV4<$ zE~1ZVri12uLUSF|g8$CLrl>Y%lfm0ed|0#-E(vIk}JZwLLCL9c=tm(lGIkniE_ehsasUswWH4G|;Sif>Ifv<)5FlK!*sv-)V$?uHSZN(GYH`m1ZciCE zVnh}&+-1zeRkqD=-G4rm9W(rVa(+tZ;+4TqXuRU{;E$;AS_gfv0BrrmM;(t2 zZ6W5l|NIsmEX#6dy+e6!=uM`#@d^fL3iktef;=1a9u24Or%<`nMyb?BsnkYktVRiA z`WrsbTT?lo&v$;-iO5HvzqCu%Cm+pta(;xX8=JXHlBwbRGd<2r;C#Q1fH95#f1 zu$2%wAa66)6WK>+ZlX4E6 zJm7W|iqTOqR<(9=YkZ>hNTHbE&WVbPp-T$I!~>L5D6S~Wg&GlM?V`L;OlcQW+eJlb zR8*C@O5C|HlZE02HkvMV2?8&e&(qy_mMGar#n$TF4g>9|xJh-o6@Ot|p={iavOL&P zb@yvL^uS3cY^FD9yJp}6YeYZBM*j&c!%y)&u%AKu{+wpv+Y1Y!a6rx7%o zAX02S2IGz%x!f8#*{FoHvRau>xu3EPsddmN4&gY7FF)m~Ejh}*=Meps0ChP;5mA2r z0BD`APv~ZSa|(V=f<&-7us_x)2(wm2Axw=Ai0Q2%YcM@*jmWi_QYdZ*$zedi!bSKC zx>t3I`UP!badl~-SW+nb9b%b5^U-K5u`ip>%KZj3lWup45c)@0U|$o>QE^YFxPL*Z zJF87RP?n9|@3Q6^dqk{K6Tvs(iQw3E8Q7Om@i2RRQL*VY@!0e5WpKIc9lBcm!p60W zr{MEB-l0;K)8~|Qze7dI2JZ`)zm$z|7?!J0>{mb)7-j#&;VO0i0Hp9mSW_53aTw$w z$j_g#;oqk}sbB3eX#@5lzNhy)=(XR|1o{Ic=Z|zf`qa{2;2Hf5#_A*5g4fBPqfhY} znUnN&*q9$cTHY5~^hc3Re-=6P7rdK|H@TJcu>t!5WMdyB$cYgin6dz*?;LzXBnbJE znCVAG821d!@vIRsnxP|>(k5etaVJ=}g%%rk87m>Vf1v_p{D8g4wdF8Z`8`6(92*8b z*K&KV<(Ny)upBdJxOdxd@3B0a@oX60Cxkh?_@-`rM>W2u8{b!rAL_^@nDt$ca z6O=4Zh7{(DJma4rw+7s}Z^<7*ZnMNN8mlA|MpVqSC3B{67y7Y=yaqBq0~RphRqK(< zEpvGx<$OZJ;VeV!`Vab;&W7xrq+|RUQSDsMQ8G6caWQJ{wILN%5IP68vA0tWUC<_n zRl|v93&~>hw&=f;D%@Ghc$UIG%5&ATs63Aw=j)C+rS6=!#n7G9&zaP)>8jRkTn{R+O3vmj`WTD-_7_V;Bt0znB2A=rQU=#vvGT0`=QMp1ty-RhyM>p*v0cNU9-c3~IM*${VxmtrdQ z7t`=*iy2fbuEQ5fXVO)o0vmD`%@fyCov5TH$m_kLnjRLj@o}~}^n$p7-Vk$PJZk7Y zQA@uNH^O0=N52>I=_7FyoWTXcC2m%tq`ZBRpAZ{dB|_tT<&m;E$X7wF0bH_-)d*#? zz({=H(_&;dL=a9VZR?c#z{ux04+2IWaOZ)MFSzqS#24LpD%6Y0S8&C_UR1Wa^Ar_c z;bA0R6?KjZDxsx1O>_V$MZSFj{gtEi!dWQz!+68T{9vmHeL>_bJb;!3>s$)=D zp3-&Sfa_-|yH}wfi0*|i2j^P_JIeDDw__<@kaZErT1V&L8wsO?52Rg;EYK2s&~z!? zB>dQIcThcY2+Q%V;JsowwTMP~P&Cn_BBV%nH8WE9ceZA z&qxolv|_amGvzzr8T_9_hDhb|#GTM+cPV=5C~S~Tn?bgQ8f0sze5IGPkE?Tk+$*7t zOp+f{AvDi5K+)1F>wy~H@32sN-a_qS8@0D-)J`fceTznQ$ae)DmER%ikpC)?@Az?t z{CAFeMjdXKzf9s?z>5?20`L1EBlklCKahg|#WwyI+xTB><3F|!{@g2pzmrhZi%?%$ zxIYZs@!o*mNVFEXbD&r<4pBRHQ1`od;qowFMCChGg|Y`;=Eb|ng&zc64kTr=V9nEl zOtBgkbPc3>t-`oS!?Q6iQTiXn88pOrgl&S7qyChg2fWT^nlfR5)D&s?_b|iYIwl!l zA;qC>zjm3DKR{9fI!|n~SB)%0!keX$Haa6y&~cKHmsO>_O|Boe zFuD(mVT^_+F-r2FUH%D*=WrEd9Pt~{JM2Sgy`pj10qXC9K6w)L&bw_~hJntUR$|f& zw{aPM3NFIJ1vUGYEbq3cGdYQig9Vj|Q&pnny5w`owZ?I<@}r-HOg~2h#XjJf z%2^CFCLN&uXzCP3cGjd}JP7|B#sADy{%08eXJfN$Y}9Z%pP`-j%_}teMU4SFX#*N( z6&eFo<9;*-6&h!&MhFdep)pJ~d}y3oXcVc&O)A%a7`GVQEd1KwCZS=2n}CK5?tC*9KfHzz0p8n z2e#@S;~C>QW54md)jD9cUc&P|MyqkyV5r4V%!4VXB?qi;|-(D I=pgt11MkW}ivR!s literal 0 HcmV?d00001 diff --git a/backend/intent-service/target/intent-service-1.0.0-SNAPSHOT.jar b/backend/intent-service/target/intent-service-1.0.0-SNAPSHOT.jar index d71dce4d34d500156d0423275a5c8865d2ba0a45..633179fe2e5d5080458805deb89017fd40abfc79 100644 GIT binary patch delta 35609 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 delta 10205 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 diff --git a/backend/intent-service/target/intent-service-1.0.0-SNAPSHOT.jar.original b/backend/intent-service/target/intent-service-1.0.0-SNAPSHOT.jar.original index 7a9837830bedbebc54fca6cf77d2be12e34f2641..54a346022eb87468f7da31e92f45e74349efeaf3 100644 GIT binary patch delta 30179 zcmafab8w|kw{9ky*tW4_+qP|EVtXf<*tTt(6Kld9YhpVSXOcU=?>lwR{qDV0=b!a7 z-tMmIdTXtIdi9f70Df}>fv7A80SN~N1_K5*95<4PND2PevPb@7`$_(>yVQSeGTax& ze}MN3&p+V)h4mlU`9hv7%<}dBm}2N(tsMV!VuN%314`g@|A61WYc1g75Cd@|&2Qkm z;D4K&xuE8t{y|vy1z6O$5&cmNK(7`Q7?=JZGHDbsP}#-N(#Fn0%EH0I#l+3V z(Lv17!Og|d&d$PxLe#{~%=*82EL1I=-7Q?*7|rZVTwQB5?Oo9|FajK!vbWeb7Rp*s zpeozuT4eAg)UDUyYN5zZqZ!mi#M>qo=UCpqHgUrsI$0OuUR1*RR8?>9+T&gZ@4|Nr}45r;&DW}}*r@~W91|Whyt%;`UP*$;~Rf?vg^{&p$W4$Mu z)o{Zw@yer)i5MjlOUT&qQb80TQHy#*!@f_HR`K z%n6KPt~2olyE`etS~mbOKQ-552*Wp!S$C#0A~Ky^9`Qy59i5*Eo4x+=BI_Q@=*sNfKUp&;hW&Mb!%4qdLeiWr%& zWM6fYCN<2307Of#2rkT?(EXHD-CA3!L!rd&+z$r{a5QgRYMMV6%5tqe4cB)K*P%sA zt-r|EY0;?p)R|6VV)!BO_ff4de!5%&%~$TQSxPj&l~p_1oOcyF;;iF>TJ)KKRX-}) zC$=^Tm*%GO5}#`K*8%R0$$CwjJY-JMgK~OV`xV(G-U};-Yx{3NznA^yF{OadBiNzc zM+L_1>NZCVBM_IuQtcXsF@^f?(=FARBcrg5LCvLJsc{H~t~L3!oKRx>M+=eQ6%!A`q=zzd8OUkZ5ExJ~Xn5WQeF&`

HCUc;ajs>`5Xr=NZ_luP02M}>@`Ra9HIR5 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 Y|10h+o&bXZiUEoa9SVy7=O5Sq0Uy$ig#Z8m delta 5068 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 F{|9qAZKD7H diff --git a/backend/intent-service/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/backend/intent-service/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 4a91ffb..7c8dc3f 100644 --- a/backend/intent-service/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/backend/intent-service/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,14 +1,22 @@ com\artedu\intent\IntentServiceApplication.class com\artedu\intent\controller\CustomerProfileController.class com\artedu\intent\dto\IntentResult$IntentInfo.class +com\artedu\intent\service\ProfileGenerationService.class com\artedu\intent\service\LLMIntentClient.class com\artedu\intent\mapper\IntentCategoryMapper.class com\artedu\intent\dto\IntentResult.class com\artedu\intent\entity\CustomerProfile.class +com\artedu\intent\mapper\ProfileGenerationLogMapper.class +com\artedu\intent\controller\ProfileGenerationController.class com\artedu\intent\mapper\CustomerProfileMapper.class com\artedu\intent\mapper\IntentRecognitionMapper.class com\artedu\intent\service\CustomerProfileService.class +com\artedu\intent\service\ProfileGenerationService$ProfileParseResult.class com\artedu\intent\controller\IntentController.class com\artedu\intent\entity\IntentRecognition.class com\artedu\intent\entity\IntentCategory.class +com\artedu\intent\service\ProfileGenerationService$FieldValue.class +com\artedu\intent\service\ProfileGenerationService$GenerationResult.class com\artedu\intent\service\IntentRecognitionService.class +com\artedu\intent\entity\ProfileGenerationLog.class +com\artedu\intent\controller\ProfileGenerationController$BatchGenerateRequest.class diff --git a/backend/intent-service/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/backend/intent-service/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index a49299b..1318056 100644 --- a/backend/intent-service/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/backend/intent-service/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,13 +1,17 @@ D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\controller\CustomerProfileController.java D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\controller\IntentController.java +D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\controller\ProfileGenerationController.java D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\dto\IntentResult.java D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\entity\CustomerProfile.java D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\entity\IntentCategory.java D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\entity\IntentRecognition.java +D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\entity\ProfileGenerationLog.java D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\IntentServiceApplication.java D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\mapper\CustomerProfileMapper.java D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\mapper\IntentCategoryMapper.java D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\mapper\IntentRecognitionMapper.java +D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\mapper\ProfileGenerationLogMapper.java D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\service\CustomerProfileService.java D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\service\IntentRecognitionService.java D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\service\LLMIntentClient.java +D:\www\agent_9art\backend\intent-service\src\main\java\com\artedu\intent\service\ProfileGenerationService.java diff --git a/backend/intent-service/target/test-classes/com/artedu/intent/controller/IntentControllerTest.class b/backend/intent-service/target/test-classes/com/artedu/intent/controller/IntentControllerTest.class index d11ce72a2519e574f90e90a8256dcd338bcd4522..512b5c713a1c58106346e5c6941bb7842b6b27eb 100644 GIT binary patch literal 6695 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 bUZV1UfW#bD*i-m#F6B`=tKc+oDkl98^9Ab5 literal 6701 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 cuLZ)3t|5NS=aCs<#RAf0=wE([]) const [loading, setLoading] = useState(false) const [modalVisible, setModalVisible] = useState(false) @@ -12,6 +14,13 @@ export default function CustomerList() { const [form] = Form.useForm() const [searchKeyword, setSearchKeyword] = useState('') + // 批量生成相关 + const [pendingData, setPendingData] = useState([]) + const [pendingLoading, setPendingLoading] = useState(false) + const [selectedCustomers, setSelectedCustomers] = useState([]) + const [generateLoading, setGenerateLoading] = useState(false) + const [singleGenerateLoading, setSingleGenerateLoading] = useState(null) + const loadData = async (keyword = '') => { setLoading(true) try { @@ -24,14 +33,32 @@ export default function CustomerList() { } } + const loadPending = async () => { + setPendingLoading(true) + try { + const res: any = await request.get('/v1/intent/profiles/without-profile', { + params: { corpId: CORP_ID, minMsgCount: 5, limit: 100 } + }) + setPendingData(res.data || []) + } catch (e) { + message.error('加载无画像客户失败') + } finally { + setPendingLoading(false) + } + } + useEffect(() => { - loadData() - }, []) + if (activeTab === 'existing') { + loadData() + } else { + loadPending() + } + }, [activeTab]) const handleSave = async () => { const values = await form.validateFields() try { - const payload = { ...values, corpId: CORP_ID } + const payload = { ...values, corpId: CORP_ID, manualOverride: true } await request.post('/v1/intent/profiles', payload) message.success(editing ? '更新成功' : '创建成功') setModalVisible(false) @@ -79,6 +106,51 @@ export default function CustomerList() { setModalVisible(true) } + // 单个生成 + const handleGenerateSingle = async (customerId: string) => { + setSingleGenerateLoading(customerId) + try { + const res: any = await request.post(`/v1/intent/profiles/generate/${customerId}?corpId=${CORP_ID}`) + if (res.code === 0) { + message.success('画像生成成功') + loadPending() + // 也刷新已有画像列表 + if (activeTab === 'existing') loadData() + } else { + message.error(res.message || '生成失败') + } + } catch (e: any) { + message.error(e.response?.data?.message || '生成失败') + } finally { + setSingleGenerateLoading(null) + } + } + + // 批量生成 + const handleBatchGenerate = async () => { + if (selectedCustomers.length === 0) { + message.warning('请先选择客户') + return + } + setGenerateLoading(true) + try { + const adminInfo = JSON.parse(localStorage.getItem('admin_info') || '{}') + await request.post('/v1/intent/profiles/generate/batch', { + corpId: CORP_ID, + customerIds: selectedCustomers, + operator: adminInfo.username || 'admin' + }) + message.success(`批量生成任务已启动,共 ${selectedCustomers.length} 个客户`) + setSelectedCustomers([]) + // 3秒后刷新 + setTimeout(() => loadPending(), 3000) + } catch (e: any) { + message.error(e.response?.data?.message || '批量生成失败') + } finally { + setGenerateLoading(false) + } + } + const getIntentColor = (level?: string) => { switch (level) { case '高': return 'green' @@ -88,17 +160,25 @@ export default function CustomerList() { } } - const columns = [ + const getSourceTag = (record: any) => { + if (record.autoGenerated === 1) { + return }>AI生成 + } + return 人工录入 + } + + const existingColumns = [ { title: '客户ID', dataIndex: 'customerId', ellipsis: true, width: 180 }, + { title: '来源', width: 100, render: (_: any, record: any) => getSourceTag(record) }, { title: '职业/名称', dataIndex: 'currentOccupation', width: 120 }, { title: '学员类型', dataIndex: 'studentType', width: 110 }, { title: '基础水平', dataIndex: 'skillLevel', width: 110 }, { title: '意向度', dataIndex: 'intentLevel', - width: 90, + width: 100, render: (level: string, record: any) => ( - {level} {record.intentScore != null ? `(${record.intentScore})` : ''} + {level} {record.intentScore != null ? `(${Math.round(record.intentScore)})` : ''} ) }, { title: '关注重点', dataIndex: 'concernFocus', width: 120 }, @@ -117,29 +197,117 @@ export default function CustomerList() { } ] + const pendingColumns = [ + { title: '客户ID', dataIndex: 'customer_id', ellipsis: true, width: 200 }, + { + title: '消息数', + dataIndex: 'msg_count', + width: 100, + render: (v: number) => = 20 ? '#52c41a' : v >= 10 ? '#faad14' : '#d9d9d9' }} /> + }, + { + title: '操作', + width: 140, + render: (_: any, record: any) => ( + + ) + } + ] + + const rowSelection = { + selectedRowKeys: selectedCustomers, + onChange: (keys: React.Key[]) => setSelectedCustomers(keys as string[]), + } + return (

客户画像管理

- - setSearchKeyword(e.target.value)} - onSearch={handleSearch} - style={{ width: 260 }} - allowClear - /> - - + {activeTab === 'existing' && ( + + setSearchKeyword(e.target.value)} + onSearch={handleSearch} + style={{ width: 260 }} + allowClear + /> + + + )}
- + 已有画像 + {data.length} + + ), + children: ( +
+ ), + }, + { + key: 'pending', + label: ( + + 待生成画像 + {pendingData.length} + + ), + children: ( +
+ + 批量生成 ({selectedCustomers.length}) + + } + /> +
+ + ), + }, + ]} /> + 版本:v3.0 +> 日期:2026-06-05 +> 状态:设计稿,待评审 + +--- + +## 一、背景与痛点 + +### 1.1 当前画像体系 + +| 组件 | 现状 | +|------|------| +| `customer_profiles` 表 | 已有完整字段,但主要靠销售顾问在 sidebar 手动录入 | +| `archive_messages` 表 | 沉淀了大量学员对话,尚未用于画像挖掘 | +| `ProfileCard.tsx` | 录入表单只有基础字段(职业、学员类型、基础水平、意向度),其余字段为空 | +| LLM 自动分析 | **未实现**,代码里留了 TODO:"录入基础信息后,系统将通过会话存档自动完善画像" | + +### 1.2 核心痛点 + +1. **老客户画像缺失**:系统上线前已有大量客户,他们从未被人工录入画像,但 archive_messages 中有丰富对话 +2. **画像不够丰满**:人工录入只覆盖 4-5 个字段,大量高价值字段(关注点、决策阶段、兴趣课程、预算暗示)为空 +3. **画像更新滞后**:客户状态会变化(如从"初步了解"到"方案比较"),人工不会每次手动更新 +4. **顾问负担重**:每个客户都要手动填表单,效率低且标准不统一 + +--- + +## 二、目标 + +1. **批量自动生成**:为所有有对话记录的老客户自动生成初始画像 +2. **持续自动丰满**:每次新会话后,自动分析增量信息并更新画像 +3. **可解释性**:每个画像字段标注来源(哪条对话、什么时间点)和置信度 +4. **人工可干预**:顾问可修正自动生成的画像,修正后优先级高于 AI 结果 + +--- + +## 三、数据模型 + +### 3.1 现有表 `customer_profiles`(已有) + +```sql +CREATE TABLE customer_profiles ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + customer_id VARCHAR(64) NOT NULL COMMENT '客户ID(企微external_userid)', + corp_id VARCHAR(64) NOT NULL, + + -- 基础画像(当前已有) + student_type VARCHAR(50) COMMENT '学员类型: 在校大学生/转行人员/在职提升/高中毕业生/家长代询', + student_type_confidence DOUBLE DEFAULT 0 COMMENT '置信度 0-1', + skill_level VARCHAR(50) COMMENT '基础水平: 零基础/有美术基础/相关专业/有从业经验', + skill_level_confidence DOUBLE DEFAULT 0, + intent_level VARCHAR(20) COMMENT '意向度: 高/中/低', + intent_score DOUBLE DEFAULT 0 COMMENT '意向分数 0-100', + concern_focus VARCHAR(50) COMMENT '关注点: 就业导向型/兴趣导向型/价格敏感型/品质导向型', + concern_focus_confidence DOUBLE DEFAULT 0, + decision_stage VARCHAR(50) COMMENT '决策阶段: 初步了解/方案比较/决定报名/已报名', + decision_stage_confidence DOUBLE DEFAULT 0, + interested_courses TEXT COMMENT '兴趣课程 JSON数组', + budget_hint VARCHAR(200) COMMENT '预算暗示', + preferred_city VARCHAR(50) COMMENT '意向城市', + age INT COMMENT '年龄', + education VARCHAR(50) COMMENT '学历', + current_occupation VARCHAR(100) COMMENT '当前职业/名称', + + -- 元数据(当前已有) + slot_data TEXT COMMENT '槽位数据 JSON', + conversation_count INT DEFAULT 0 COMMENT '会话次数', + last_conversation_time TIMESTAMP NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + + UNIQUE KEY uk_customer_corp (customer_id, corp_id), + INDEX idx_corp_id (corp_id), + INDEX idx_updated_at (updated_at) +) ENGINE=InnoDB COMMENT='客户画像表'; +``` + +### 3.2 新增表 `profile_generation_logs`(建议新增) + +记录每次画像生成的来源和变更,用于审计和可解释性。 + +```sql +CREATE TABLE profile_generation_logs ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + customer_id VARCHAR(64) NOT NULL, + corp_id VARCHAR(64) NOT NULL, + generation_type VARCHAR(20) NOT NULL COMMENT '生成类型: BATCH_FULL/INCREMENTAL/MANUAL', + source_msg_count INT DEFAULT 0 COMMENT '分析的消息条数', + source_session_count INT DEFAULT 0 COMMENT '分析的会话数', + analyzed_at TIMESTAMP NOT NULL COMMENT '分析时间', + llm_model VARCHAR(50) COMMENT '使用的模型', + llm_prompt_length INT COMMENT 'Prompt长度', + llm_response_length INT COMMENT 'Response长度', + duration_ms INT COMMENT '耗时毫秒', + success TINYINT DEFAULT 1 COMMENT '是否成功', + error_msg TEXT COMMENT '错误信息', + -- 变更快照(JSON):记录哪些字段发生了变化 + changes_snapshot TEXT COMMENT '{"studentType":{"old":"未知","new":"在校大学生","confidence":0.85}}', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + + INDEX idx_customer (customer_id, corp_id), + INDEX idx_analyzed_at (analyzed_at) +) ENGINE=InnoDB COMMENT='画像生成日志'; +``` + +### 3.3 字段置信度规则 + +| 置信度区间 | 含义 | 前端展示 | +|-----------|------|---------| +| 0.85 ~ 1.0 | 高置信 | 绿色标签,不提示 | +| 0.60 ~ 0.84 | 中置信 | 橙色标签,hover 提示"AI推测,建议确认" | +| 0.30 ~ 0.59 | 低置信 | 灰色标签,hover 提示"信息不足,建议补充" | +| 0 ~ 0.29 | 未知 | 显示"未知",引导录入 | + +--- + +## 四、LLM Prompt 设计 + +### 4.1 全量画像生成 Prompt + +**适用场景**:首次为老客户生成画像,输入该客户全部历史对话 + +``` +你是一位专业的教育培训机构客户分析师。请根据以下学员与课程顾问的完整对话历史,提取学员画像信息。 + +【分析要求】 +1. 仔细阅读所有对话,从中提取学员的真实情况和需求 +2. 不要凭空猜测,只提取对话中有明确证据支撑的信息 +3. 如果某个字段在对话中没有足够证据,请标记为"未知"并给出低置信度 +4. 对于同一字段的多个线索,综合判断取最可靠的结论 +5. 注意识别"家长代询"的情况(对话中出现"我孩子"、"我家"等表述) + +【对话历史】 +{conversation_text} + +【输出格式】 +必须严格返回以下JSON格式,不要包含任何其他文字: +{ + "studentType": {"value": "", "confidence": 0, "evidence": ""}, + "skillLevel": {"value": "", "confidence": 0, "evidence": ""}, + "intentLevel": {"value": "", "confidence": 0, "evidence": ""}, + "intentScore": {"value": 0, "confidence": 0, "evidence": ""}, + "concernFocus": {"value": "", "confidence": 0, "evidence": ""}, + "decisionStage": {"value": "", "confidence": 0, "evidence": ""}, + "interestedCourses": {"value": [], "confidence": 0, "evidence": ""}, + "budgetHint": {"value": "", "confidence": 0, "evidence": ""}, + "preferredCity": {"value": "", "confidence": 0, "evidence": ""}, + "age": {"value": null, "confidence": 0, "evidence": ""}, + "education": {"value": "", "confidence": 0, "evidence": ""}, + "currentOccupation": {"value": "", "confidence": 0, "evidence": ""}, + "summary": "", // 用一句话总结这个学员 + "keyQuotes": [] // 提取3-5条最能代表学员需求的原话 +} + +【字段枚举值】 +- studentType: 在校大学生/转行人员/在职提升/高中毕业生/家长代询/未知 +- skillLevel: 零基础/有美术基础/相关专业/有从业经验/未知 +- intentLevel: 高/中/低 +- concernFocus: 就业导向型/兴趣导向型/价格敏感型/品质导向型/未知 +- decisionStage: 初步了解/方案比较/决定报名/已报名/未知 +- interestedCourses: 从对话中提取的课程名称数组,如["3D场景UE地编","次世代角色模型"] +- education: 高中/大专/本科/硕士/博士/未知 + +【置信度评分标准】 +- 0.90-1.00: 学员明确亲口说过(如"我是大学生") +- 0.70-0.89: 有较强暗示或多处线索一致 +- 0.50-0.69: 有一处间接线索 +- 0.30-0.49: 只有微弱暗示 +- 0.00-0.29: 没有任何线索 +``` + +### 4.2 增量画像更新 Prompt + +**适用场景**:客户已有画像,分析新增对话后生成更新建议 + +``` +你是一位客户画像更新分析师。请根据学员的【现有画像】和【新增对话】,判断哪些字段需要更新。 + +【现有画像】 +{current_profile_json} + +【新增对话】 +{new_conversation_text} + +【分析要求】 +1. 对比新增对话与现有画像,识别变化 +2. 如果新增对话推翻了现有画像的某个结论,建议更新 +3. 如果新增对话补充了空白字段,建议填充 +4. 如果现有画像已高置信且新增对话无冲突,保持不动 +5. 特别关注决策阶段的变化(这是最重要的更新信号) + +【输出格式】 +{ + "updates": [ + { + "field": "decisionStage", + "oldValue": "初步了解", + "newValue": "方案比较", + "confidence": 0.85, + "reason": "学员主动询问课程安排和就业情况,表明已进入比较阶段", + "shouldUpdate": true + } + ], + "newInsights": [ + { + "field": "budgetHint", + "value": "预算约2万", + "confidence": 0.72, + "evidence": "学员提到\"两万左右的课程\"" + } + ], + "intentChange": { + "oldScore": 55, + "newScore": 72, + "reason": "学员开始询问具体报名流程" + } +} +``` + +### 4.3 对话格式化(输入预处理) + +将 `archive_messages` 按时间排序,格式化为 LLM 可读的对话文本: + +``` +【会话 1】2025-05-20 14:30 +员工(小王): 您好,请问有什么可以帮您? +学员(张三): 我想了解一下你们的美术课程 +... + +【会话 2】2025-05-21 10:15 +员工(小王): 张同学,昨天说的课程资料发给您了 +学员(张三): 看到了,我想问一下学费多少 +... +``` + +**截断策略**: +- 单客户对话总长度超过 8000 字时,优先保留最近 6 个月的对话 +- 若仍超限,保留最近 10 次会话的完整内容 +- 若仍超限,对每条消息截取前 200 字 + +--- + +## 五、系统架构 + +### 5.1 整体架构图 + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ Admin 后台 │ +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │ +│ │ 画像生成任务 │ │ 画像列表/搜索 │ │ 单客户画像详情+编辑 │ │ +│ │ (批量触发) │ │ │ │ (含变更历史) │ │ +│ └──────┬───────┘ └──────┬───────┘ └──────────┬───────────┘ │ +└─────────┼─────────────────┼─────────────────────┼──────────────┘ + │ │ │ + ▼ ▼ ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ intent-service (画像服务) │ +│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────┐ │ +│ │ ProfileGeneration │ │ ProfileMerge │ │ ProfileQuery │ │ +│ │ Service │ │ Service │ │ Service │ │ +│ │ (LLM调用+解析) │ │ (置信度合并) │ │ (CRUD) │ │ +│ └────────┬─────────┘ └────────┬─────────┘ └──────┬───────┘ │ +│ │ │ │ │ +│ ▼ ▼ ▼ │ +│ ┌─────────────────────────────────────────────────────────┐ │ +│ │ 定时任务: DailyProfileUpdateJob │ │ +│ │ (每天凌晨扫描昨日有新增对话的客户,触发增量分析) │ │ +│ └─────────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────┘ + │ │ │ + ▼ ▼ ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ generation-service (LLM) │ +│ ┌────────────┐ ┌────────────┐ │ +│ │ 全量生成 │ │ 增量更新 │ │ +│ │ /generate │ │ /generate │ │ +│ └────────────┘ └────────────┘ │ +└─────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ 数据库 │ +│ ┌────────────────────┐ ┌────────────────────┐ ┌──────────┐ │ +│ │ customer_profiles │ │ profile_generation │ │ customers│ │ +│ │ (画像主表) │ │ _logs (生成日志) │ │ (客户基础)│ │ +│ └────────────────────┘ └────────────────────┘ └──────────┘ │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ archive_messages (会话存档,通过 JDBC 查询,非本服务表) │ │ +│ └──────────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────┘ +``` + +### 5.2 核心服务类设计 + +```java +@Service +public class ProfileGenerationService { + + // 全量生成:为指定客户从历史对话生成完整画像 + public GenerationResult generateFullProfile(String customerId, String corpId); + + // 增量更新:分析新增对话,生成更新建议 + public IncrementalResult generateIncrementalUpdate(String customerId, String corpId, + LocalDateTime since); + + // 批量生成:为多个客户批量生成画像(带进度追踪) + @Async + public void batchGenerate(String corpId, List customerIds, + LocalDateTime msgSince); + + // 合并更新建议到现有画像 + public void applyUpdates(String customerId, String corpId, + List updates); +} +``` + +--- + +## 六、画像合并策略 + +### 6.1 置信度加权合并 + +``` +现有值: V_old, 置信度 C_old +新值: V_new, 置信度 C_new + +如果 V_new == V_old: + 合并后置信度 = 1 - (1 - C_old) * (1 - C_new * 0.5) + // 相同值时置信度提升,但边际递减 + +如果 V_new != V_old: + if C_new > C_old + 0.15: + 采用新值,置信度 = C_new + else if C_new > C_old: + 保持旧值,置信度 = C_old + (C_new - C_old) * 0.3 + else: + 保持旧值 +``` + +### 6.2 特殊字段规则 + +| 字段 | 合并规则 | +|------|---------| +| `intentScore` | 新对话可能推高或拉低,直接采用增量分析的评分,但限制单次变化不超过 ±20 分 | +| `intentLevel` | 基于 intentScore 映射:≥70→高, 40-69→中, <40→低 | +| `decisionStage` | 只能正向推进(初步了解→方案比较→决定报名→已报名),不能回退 | +| `interestedCourses` | 合并数组,去重,新课程追加到末尾 | +| `age` | 数值型,取最新高置信度值 | +| `conversationCount` | 直接累加 | +| `lastConversationTime` | 取最新时间 | + +--- + +## 七、接口设计 + +### 7.1 Admin 后台接口(新增) + +``` +POST /api/v1/admin/profiles/generate/batch +请求: { corpId, customerIds?: string[], timeRange?: [start, end], + onlyMissing?: boolean } +响应: { taskId, message } + +GET /api/v1/admin/profiles/generate/tasks/{taskId}/progress +响应: { taskId, status, total, completed, successCount, failCount } + +GET /api/v1/admin/profiles +请求: { corpId, keyword?, hasProfile?, page, size } +响应: PageResult + +GET /api/v1/admin/profiles/{customerId}/logs +响应: List +``` + +### 7.2 Sidebar 接口(复用+扩展) + +``` +GET /api/v1/intent/profiles/{customerId} (已有) +响应增加字段: + - autoGenerated: boolean (是否AI生成) + - lastGeneratedAt: timestamp + - fieldSources: { "studentType": "AI分析(置信度0.85)", "age": "人工录入" } + +POST /api/v1/intent/profiles (已有,人工修正) +请求增加字段: + - manualOverride: boolean (标记为人工修正,置信度设为1.0) +``` + +--- + +## 八、前端设计 + +### 8.1 Admin 后台新增「客户画像」页面 + +**页面结构:** + +``` +┌─────────────────────────────────────────┐ +│ 客户画像管理 │ +├─────────────────────────────────────────┤ +│ [搜索框] [筛选: 已生成/未生成/全部] [批量生成] │ +├─────────────────────────────────────────┤ +│ 客户列表 │ +│ ┌────┬────────┬──────────┬────────────┐ │ +│ │姓名│学员类型│意向度 │画像来源 │ │ +│ │ │(AI) │高(85分) │AI生成 ✓ │ │ +│ │ │(人工) │中(60分) │人工录入 │ │ +│ │ │(未生成)│- │点击生成 │ │ +│ └────┴────────┴──────────┴────────────┘ │ +├─────────────────────────────────────────┤ +│ 点击行 → 弹出画像详情 + 编辑 │ +│ - 每个字段显示: 值 + 置信度条 + 来源 │ +│ - AI生成的字段可人工覆盖 │ +│ - 显示变更历史时间线 │ +└─────────────────────────────────────────┘ +``` + +### 8.2 Sidebar ProfileCard 增强 + +``` +┌─────────────────────────────────┐ +│ 张同学 (AI生成 · 3小时前更新) │ +├─────────────────────────────────┤ +│ 意向度: 高(82分) ▓▓▓▓▓▓▓▓░░ │ +│ 学员类型: 在校大学生 ✓ │ +│ 基础水平: 有美术基础 ~ │ +│ 关注点: 就业导向型 ✓ │ +│ 决策阶段: 方案比较 → │ +│ 兴趣课程: UE地编, 角色模型 │ +│ 预算: 2-3万 ~ │ +│ 意向城市: 上海 ✓ │ +├─────────────────────────────────┤ +│ [编辑] [查看分析来源] │ +└─────────────────────────────────┘ + +图例: ✓ 高置信 ~ 中置信 ? 低置信/未知 +``` + +--- + +## 九、实施计划 + +### Phase A:基础设施(1-2 天) + +- [ ] 新增 `profile_generation_logs` 表 +- [ ] 在 intent-service 新增 `ProfileGenerationService` 骨架 +- [ ] 新增 `CustomerProfile` 字段:`autoGenerated`, `lastGeneratedAt`, `generatedBy` +- [ ] 新增 `ProfileGenerationController`(Admin 后台接口) + +### Phase B:全量生成(2-3 天) + +- [ ] 实现 `generateFullProfile()`:对话聚合 → Prompt 构建 → LLM 调用 → 结果解析 +- [ ] 实现 `batchGenerate()`:异步批量任务,带进度追踪 +- [ ] Admin 后台「批量生成」页面 +- [ ] 为小范围客户(如 10-20 个)试运行,人工校验 LLM 输出质量 +- [ ] 根据校验结果优化 Prompt + +### Phase C:增量更新(2 天) + +- [ ] 实现 `generateIncrementalUpdate()`:增量对话分析 +- [ ] 实现合并策略(置信度加权 + 特殊字段规则) +- [ ] 新增定时任务 `DailyProfileUpdateJob`(每天凌晨执行) +- [ ] 画像变更时发送通知(可选:推送到 sidebar 提醒顾问) + +### Phase D:前端增强(2 天) + +- [ ] Admin 后台「客户画像」完整页面(列表 + 详情 + 编辑 + 变更历史) +- [ ] Sidebar ProfileCard 增强(置信度可视化、来源标注、变更提示) +- [ ] 画像生成任务进度页面 + +--- + +## 十、风险与应对 + +| 风险 | 影响 | 应对策略 | +|------|------|---------| +| LLM 调用成本高 | 每月可能产生数百元 API 费用 | 首次全量控制范围(先活跃客户);增量只分析有变化的用户;使用本地缓存避免重复分析 | +| LLM 输出不稳定 | 画像质量参差不齐 | Prompt 加 Few-shot 示例;输出后做枚举值校验;低置信度字段不展示 | +| 隐私合规 | 对话内容含敏感信息 | LLM 调用时不传输客户真实姓名/手机号;分析结果脱敏存储;保留审计日志 | +| 顾问不信任 AI 结果 | 不愿使用 | 高置信度字段默认采用,低置信度标记为"待确认";提供一键采纳/拒绝交互 | + +--- + +## 十一、预期效果 + +| 指标 | 现状 | 目标 | +|------|------|------| +| 有画像的客户占比 | ~10%(人工录入) | ≥80%(AI 生成 + 人工) | +| 画像字段完整度 | 平均 3-4 个字段有值 | 平均 8-10 个字段有值 | +| 画像更新频率 | 几乎不更新 | 每次新会话后自动更新 | +| 顾问录入时间 | 每个客户 2-3 分钟 | 仅需确认/修正,30 秒 | + +--- + +## 附录:Prompt 测试建议 + +在正式开发前,建议先用 5-10 个真实客户的对话手动测试 Prompt,验证以下指标: + +1. **准确率**:LLM 提取的画像字段,与人工阅读对话后的判断一致率 +2. **召回率**:人工能看出的信息,LLM 是否都提取到了 +3. **幻觉率**:LLM 是否生成了对话中没有的信息 +4. **稳定性**:同一组对话多次调用,结果是否一致 + +测试通过后再进入开发阶段,可大幅减少返工。