Refine member context profiling detail

This commit is contained in:
liuwei
2026-04-08 10:27:14 +08:00
parent fa98c9e6a5
commit 6401ec02de
7 changed files with 488 additions and 16 deletions

View File

@@ -130,10 +130,18 @@ class MemberContextService:
monthly_structured + weekly_structured + daily_structured,
["identity_traits", "identity_clues"], limit=5
),
"common_scenarios": self._extract_scored_items(
monthly_structured + weekly_structured + daily_structured,
["common_scenarios", "discussion_scenarios"], limit=5
),
"skill_profile": self._extract_scored_items(
monthly_structured + weekly_structured + daily_structured,
["skill_profile", "skill_signals"], limit=6
),
"problem_solving_profile": self._extract_scored_items(
monthly_structured + weekly_structured + daily_structured,
["problem_solving_profile", "problem_solving_signals"], limit=5
),
"family_profile": self._extract_scored_items(
monthly_structured + weekly_structured + daily_structured,
["family_profile", "family_signals"], limit=4
@@ -153,6 +161,14 @@ class MemberContextService:
monthly_structured + weekly_structured + daily_structured,
["habit_patterns", "habit_signals"], limit=self.stable_max_items
),
"expression_profile": self._extract_scored_items(
monthly_structured + weekly_structured + daily_structured,
["expression_profile", "expression_markers"], limit=5
),
"reply_entry_profile": self._extract_scored_items(
monthly_structured + weekly_structured + daily_structured,
["reply_entry_profile", "reply_entry_points"], limit=4
),
"long_term_reply_preferences": self._extract_scored_items(
monthly_structured + weekly_structured, ["long_term_reply_preferences", "reply_preferences"], limit=4
),
@@ -538,12 +554,16 @@ class MemberContextService:
"confidence": max(0.0, min(1.0, confidence)),
"meta": {
"identity_traits": norm_list(data.get("identity_traits"), 5),
"common_scenarios": norm_list(data.get("common_scenarios"), 5),
"skill_profile": norm_list(data.get("skill_profile"), 6),
"problem_solving_profile": norm_list(data.get("problem_solving_profile"), 5),
"family_profile": norm_list(data.get("family_profile"), 4),
"life_stage_profile": norm_list(data.get("life_stage_profile"), 4),
"value_profile": norm_list(data.get("value_profile"), 5),
"stable_traits": norm_list(data.get("stable_traits"), self.stable_max_items),
"habit_patterns": norm_list(data.get("habit_patterns"), self.stable_max_items),
"expression_profile": norm_list(data.get("expression_profile"), 5),
"reply_entry_profile": norm_list(data.get("reply_entry_profile"), 4),
"long_term_reply_preferences": norm_list(data.get("long_term_reply_preferences"), 4),
"group_role": str(data.get("group_role", "")).strip(),
"decision_profile": str(data.get("decision_profile", "")).strip(),
@@ -586,11 +606,21 @@ class MemberContextService:
meta.get("identity_traits", []),
current_context.get("confidence", 0) * 0.75,
)
merged_common_scenario_scores = self._merge_scored_items(
existing_meta.get("common_scenario_scores", {}),
meta.get("common_scenarios", []),
current_context.get("confidence", 0) * 0.85,
)
merged_skill_scores = self._merge_scored_items(
existing_meta.get("skill_profile_scores", {}),
meta.get("skill_profile", []),
current_context.get("confidence", 0) * 0.85,
)
merged_problem_solving_scores = self._merge_scored_items(
existing_meta.get("problem_solving_profile_scores", {}),
meta.get("problem_solving_profile", []),
current_context.get("confidence", 0) * 0.9,
)
merged_family_scores = self._merge_scored_items(
existing_meta.get("family_profile_scores", {}),
meta.get("family_profile", []),
@@ -606,6 +636,16 @@ class MemberContextService:
meta.get("value_profile", []),
current_context.get("confidence", 0) * 0.75,
)
merged_expression_scores = self._merge_scored_items(
existing_meta.get("expression_profile_scores", {}),
meta.get("expression_profile", []),
current_context.get("confidence", 0) * 0.95,
)
merged_reply_entry_scores = self._merge_scored_items(
existing_meta.get("reply_entry_profile_scores", {}),
meta.get("reply_entry_profile", []),
current_context.get("confidence", 0),
)
merged_reply_pref_scores = self._merge_scored_items(
existing_meta.get("long_term_reply_preference_scores", {}),
meta.get("long_term_reply_preferences", []),
@@ -621,32 +661,48 @@ class MemberContextService:
meta["stable_trait_scores"] = merged_trait_scores
meta["habit_pattern_scores"] = merged_habit_scores
meta["identity_trait_scores"] = merged_identity_scores
meta["common_scenario_scores"] = merged_common_scenario_scores
meta["skill_profile_scores"] = merged_skill_scores
meta["problem_solving_profile_scores"] = merged_problem_solving_scores
meta["family_profile_scores"] = merged_family_scores
meta["life_stage_profile_scores"] = merged_life_stage_scores
meta["value_profile_scores"] = merged_value_scores
meta["expression_profile_scores"] = merged_expression_scores
meta["reply_entry_profile_scores"] = merged_reply_entry_scores
meta["long_term_reply_preference_scores"] = merged_reply_pref_scores
meta["temperament_tendency_scores"] = merged_temperament_scores
meta["identity_traits"] = self._top_scored_items(merged_identity_scores, limit=5)
meta["common_scenarios"] = self._top_scored_items(merged_common_scenario_scores, limit=5)
meta["skill_profile"] = self._top_scored_items(merged_skill_scores, limit=6)
meta["problem_solving_profile"] = self._top_scored_items(merged_problem_solving_scores, limit=5)
meta["family_profile"] = self._top_scored_items(merged_family_scores, limit=4)
meta["life_stage_profile"] = self._top_scored_items(merged_life_stage_scores, limit=4)
meta["value_profile"] = self._top_scored_items(merged_value_scores, limit=5)
meta["stable_traits"] = self._top_scored_items(merged_trait_scores, limit=self.stable_max_items)
meta["habit_patterns"] = self._top_scored_items(merged_habit_scores, limit=self.stable_max_items)
meta["expression_profile"] = self._top_scored_items(merged_expression_scores, limit=5)
meta["reply_entry_profile"] = self._top_scored_items(merged_reply_entry_scores, limit=4)
meta["long_term_reply_preferences"] = self._top_scored_items(merged_reply_pref_scores, limit=4)
temperament = self._top_scored_items(merged_temperament_scores, limit=1)
meta["temperament_tendency"] = temperament[0] if temperament else meta.get("temperament_tendency", "")
if not meta["identity_traits"]:
meta["identity_traits"] = (existing_meta.get("identity_traits") or [])[:5]
if not meta["common_scenarios"]:
meta["common_scenarios"] = (existing_meta.get("common_scenarios") or [])[:5]
if not meta["skill_profile"]:
meta["skill_profile"] = (existing_meta.get("skill_profile") or [])[:6]
if not meta["problem_solving_profile"]:
meta["problem_solving_profile"] = (existing_meta.get("problem_solving_profile") or [])[:5]
if not meta["family_profile"]:
meta["family_profile"] = (existing_meta.get("family_profile") or [])[:4]
if not meta["life_stage_profile"]:
meta["life_stage_profile"] = (existing_meta.get("life_stage_profile") or [])[:4]
if not meta["value_profile"]:
meta["value_profile"] = (existing_meta.get("value_profile") or [])[:5]
if not meta["expression_profile"]:
meta["expression_profile"] = (existing_meta.get("expression_profile") or [])[:5]
if not meta["reply_entry_profile"]:
meta["reply_entry_profile"] = (existing_meta.get("reply_entry_profile") or [])[:4]
meta["group_role"] = meta.get("group_role") or existing_meta.get("group_role") or ""
meta["decision_profile"] = meta.get("decision_profile") or existing_meta.get("decision_profile") or ""
meta["engagement_traits"] = (meta.get("engagement_traits") or existing_meta.get("engagement_traits") or [])[:4]
@@ -706,6 +762,13 @@ class MemberContextService:
)
if preferences:
return "更适合:" + "".join(preferences[:3])
entry_points = self._extract_scored_items(
monthly_structured + weekly_structured + daily_structured,
["reply_entry_profile", "reply_entry_points"],
limit=3,
)
if entry_points:
return "优先从这些点接话:" + "".join(entry_points[:3])
return "保持自然口语化,结论和解释尽量平衡"
def _calc_digest_confidence(self, monthly_digests: List[Dict], weekly_digests: List[Dict],
@@ -745,12 +808,18 @@ class MemberContextService:
if meta.get("temperament_tendency"):
label = "长期沟通倾向" if meta.get("stable_ready") else "阶段性沟通倾向"
parts.append(f"{label}{meta.get('temperament_tendency')}")
if meta.get("common_scenarios"):
parts.append(f"常见场景:{''.join(meta.get('common_scenarios')[:3])}")
if meta.get("problem_solving_profile"):
parts.append(f"处理方式:{''.join(meta.get('problem_solving_profile')[:3])}")
if meta.get("stable_traits"):
parts.append(f"长期特征:{''.join(meta.get('stable_traits')[:3])}")
if meta.get("identity_traits"):
parts.append(f"身份线索:{''.join(meta.get('identity_traits')[:2])}")
if meta.get("skill_profile"):
parts.append(f"技能画像:{''.join(meta.get('skill_profile')[:3])}")
if meta.get("expression_profile"):
parts.append(f"表达标记:{''.join(meta.get('expression_profile')[:3])}")
if meta.get("value_profile"):
parts.append(f"判断偏好:{''.join(meta.get('value_profile')[:2])}")
if meta.get("habit_patterns"):