| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- """用户画像提取子Agent
- 将用户画像提取逻辑封装为独立的 SimpleAgent 子类,使其成为多智能体系统中的
- 一个专门子代理,而不是在服务层直接调用 LLM。
- """
- from hello_agents import SimpleAgent, HelloAgentsLLM
- # ============ Agent 系统提示词 ============
- SYSTEM_PROMPT = """你是一个用户偏好分析专家。你的任务是根据用户的对话消息,提取该用户的旅行偏好。
- ## 核心规则
- 1. 只从「用户消息」中提取用户**自己表达**的偏好,不要提取AI助手的建议或推荐
- 2. 如果用户消息需要结合对话历史才能理解(如"好的"、"这个不错"、"是的"),参考上下文来推断用户偏好
- 3. 不要提取一次性信息(如"明天去故宫"),只提取稳定的偏好特征(如"喜欢历史文化景点")
- 4. 每条控制在20字以内,总条目不超过8条
- 5. 宁缺毋滥,只输出有明显依据的偏好
- ## 冲突处理(重要)
- 将新提取的偏好与「已有画像」逐条对比:
- - **冲突**:如果新消息表达的偏好与某条旧画像矛盾(如"喜欢安静" vs "喜欢热闹"),删除旧条目,用新条目替代
- - **一致**:如果新消息与旧画像一致,保留旧画像条目(不重复添加)
- - **新增**:如果新消息表达了旧画像中没有的偏好,作为新条目添加
- - **无关**:如果用户消息不包含偏好信息,跳过本轮提取
- ## 输出格式
- 只输出更新后的完整画像,每行一条,以"- "开头,不要输出任何其他内容:
- - 偏好1
- - 偏好2
- """
- class ProfileExtractionAgent(SimpleAgent):
- """用户画像提取子Agent
- 专门从用户对话消息中提取旅行偏好,与已有画像合并更新。
- 不需要工具调用,纯 LLM 文本分析任务。
- """
- def __init__(self, llm: HelloAgentsLLM):
- """
- 初始化画像提取 Agent
- Args:
- llm: LLM 实例
- """
- super().__init__(
- name="用户画像提取专家",
- llm=llm,
- system_prompt=SYSTEM_PROMPT,
- enable_tool_calling=False, # 纯文本分析,无需工具
- )
- def extract(
- self,
- existing_profile: str,
- conversation_context: str,
- user_message: str,
- ) -> str:
- """
- 从用户消息中提取偏好,与已有画像对比合并
- Args:
- existing_profile: 已有画像文本("- "开头的条目),无则传空字符串
- conversation_context: 对话上下文文本(含历史会话摘要+当前会话最近消息)
- user_message: 最新用户消息
- Returns:
- 更新后的完整画像文本("- "开头的行),若无可提取内容则返回空字符串
- """
- input_text = (
- f"已有画像:\n{existing_profile or '(无)'}\n\n"
- f"对话历史(用于理解上下文):\n{conversation_context or '(无)'}\n\n"
- f"最新用户消息:{user_message}\n\n"
- f"请输出更新后的完整画像:"
- )
- result = self.run(input_text)
- return result.strip()
|