Explorar el Código

feat(profile): 方案生成时自动注入用户画像数据

Sisyphus hace 4 semanas
padre
commit
169e990830
Se han modificado 2 ficheros con 33 adiciones y 0 borrados
  1. 23 0
      cfc-langgraph/app/api/adapter.py
  2. 10 0
      cfc-langgraph/app/tools/java_client.py

+ 23 - 0
cfc-langgraph/app/api/adapter.py

@@ -621,6 +621,9 @@ PLAN_SYSTEM_PROMPT = """你是一个专业的家庭健康方案规划师。根
 3. 建议要具体可执行,避免空泛
 4. 营养补充部分要具体到产品类型和用量
 5. 严重健康问题建议咨询医生
+
+## 画像数据使用指南
+如果提供了用户的画像数据(五维评分、身体指标、心理指标等),请结合这些真实数据给出更有针对性的建议。特别关注异常指标(如睡眠不足、压力偏高、运动频率低等),在方案中明确说明这些指标的现状和改善方向。
 """
 
 REGENERATE_SECTION_SYSTEM_PROMPT = """你是一个家庭健康方案规划师。根据用户反馈重新生成指定部分内容。
@@ -699,6 +702,14 @@ async def health_plan_generate(req: HealthPlanRequest):
 
     members_info, all_indicators, kb_results = await _collect_plan_data(java, retriever, req.member_ids or "", goal, req.dimensions or "")
 
+    # 获取每个成员的画像数据
+    for member in members_info:
+        try:
+            profile = await java.get_member_profile(int(member["id"]))
+            member["profile"] = profile
+        except Exception:
+            member["profile"] = {}
+
     # 构建 prompt
     parts = [PLAN_SYSTEM_PROMPT]
     parts.append(f"\n## 用户目标\n{goal}")
@@ -706,7 +717,19 @@ async def health_plan_generate(req: HealthPlanRequest):
         parts.append(f"\n## 重点关注维度\n{req.dimensions}")
     parts.append("\n## 家庭成员")
     for m in members_info:
+        profile = m.get("profile", {})
+        dims = profile.get("dimension_scores", {})
+        body = profile.get("body_metrics", {})
+        mind = profile.get("mind_metrics", {})
         parts.append(f"- {m['name']} (年龄: {m['age']})")
+        if dims:
+            parts.append(f"  五维评分: 身{dims.get('body','?')} 智{dims.get('wisdom','?')} 心{dims.get('mind','?')} 行{dims.get('action','?')} 富{dims.get('wealth','?')}")
+        if body.get('sleep_dur_avg'):
+            parts.append(f"  平均睡眠: {body['sleep_dur_avg']}小时/天")
+        if mind.get('stress_avg'):
+            parts.append(f"  平均压力: {mind['stress_avg']}/10")
+        if body.get('exercise_count_week'):
+            parts.append(f"  周运动: {body['exercise_count_week']}次")
 
     if all_indicators:
         parts.append("\n## 健康指标摘要")

+ 10 - 0
cfc-langgraph/app/tools/java_client.py

@@ -189,3 +189,13 @@ class JavaClient:
         if data.get("code") == 200:
             return data.get("data", {})
         return {}
+
+    async def get_member_profile(self, member_id: int) -> dict:
+        """获取家庭成员画像快照"""
+        client = await self._get_client()
+        resp = await client.post("/api/profile/my", json={"memberId": member_id})
+        data = resp.json()
+        if data.get("code") == 200 and data.get("data"):
+            return data["data"]
+        return {}
+