如何设计 Agent 的“性格”与“人设”以提升用户留存率
如何设计 Agent 的"性格"与"人设"以提升用户留存率
关键词
Agent设计、用户留存、人格计算、对话系统、用户体验、情感计算、人机交互
摘要
本文深入探讨了如何通过精心设计AI Agent的"性格"与"人设"来显著提升用户留存率。我们将从理论基础到实践应用,系统分析人格化Agent设计的核心要素、技术实现路径和实际效果。文章构建了一个完整的框架,涵盖心理学理论基础、计算模型、架构设计、实现策略以及行业应用案例,为从业者提供了全面且可操作的指导。通过多学科交叉视角,我们揭示了Agent人格设计背后的科学原理,并提供了量化评估方法和优化策略。
1. 概念基础
1.1 核心概念
在深入探讨Agent性格与人设设计之前,我们需要明确定义几个核心概念:
Agent(智能体):在人工智能领域,Agent是指能够感知环境、做出决策并执行行动的自主实体。在本文语境中,我们特指对话式AI Agent,如聊天机器人、虚拟助手等。
性格(Personality):指Agent在交互过程中展现出的相对稳定的心理特征和行为模式,包括思维方式、情感反应和交流风格。
人设(Character/Persona):比性格更广泛的概念,包括Agent的背景故事、价值观、外观形象(如有)、语言风格和社会角色设定等,构成一个完整的虚拟角色。
用户留存率(User Retention Rate):衡量产品或服务留住用户能力的关键指标,通常定义为在特定时间周期后继续使用产品的用户比例。
1.2 问题背景
随着人工智能技术的快速发展,AI Agent正从简单的工具向更加复杂、个性化的交互伙伴演进。然而,大多数现有AI系统面临着一个共同挑战:缺乏持续的用户参与度。研究表明,尽管初始使用率可能很高,但许多用户在几周内就停止与AI Agent互动。
在这种背景下,Agent的"性格"和"人设"设计成为提升用户体验和留存率的关键因素。当用户能够与AI建立情感连接,感受到一致性和可预测性时,他们更可能持续参与互动。
1.3 问题描述
设计Agent的性格与人设以提升用户留存率面临着多个核心挑战:
- 一致性挑战:如何在复杂多变的交互场景中保持Agent性格和人设的一致性?
- 个性化挑战:如何在保持核心性格的同时,根据不同用户的偏好调整交互方式?
- 真实性挑战:如何设计出既具有吸引力又不失可信度的Agent人格?
- 量化挑战:如何准确评估Agent性格设计对用户留存率的影响?
- 适应性挑战:如何设计能够随着时间推移和用户关系发展而适当演变的Agent性格?
1.4 问题解决
本文将系统地解决上述挑战,提供一个全面的框架:
- 建立基于心理学理论的Agent性格模型
- 设计确保性格一致性的技术架构
- 开发个性化与平衡的交互策略
- 提供评估性格设计效果的方法和指标
- 探讨Agent性格的长期适应性设计
1.5 边界与外延
本文主要关注对话式AI Agent的性格与人设设计,特别强调与用户留存率的关系。虽然许多原则可应用于更广泛的AI系统(如游戏NPC、虚拟教师等),但我们的核心关注点是开放域对话系统。
我们的讨论不包括纯功能性工具型Agent(如简单的问答系统),而是聚焦于那些旨在建立长期用户关系的社交或陪伴型Agent。
1.6 概念结构与核心要素组成
Agent性格与人设设计系统包含以下核心要素:
- 性格特征层:基于心理学模型的核心性格特质
- 行为模式层:性格在具体行为中的表现
- 语言风格层:词汇选择、句式结构、语气语调等
- 背景故事层:Agent的"生平"、经历和世界观
- 价值体系层:Agent的道德观、偏好和优先级
- 情感反应层:对不同情境的情感表达和反应
- 社交角色层:Agent在与用户关系中扮演的角色
这些要素相互作用,共同构成一个完整的Agent人设系统。
1.7 概念之间的关系
下面的表格对比了Agent性格设计的几个核心概念的属性维度:
| 概念 | 定义核心 | 稳定性 | 可观测性 | 用户感知路径 | 设计难度 | 对留存影响 |
|---|---|---|---|---|---|---|
| 性格特质 | 内在心理特征 | 高 | 中低 | 通过行为推断 | 高 | 高 |
| 语言风格 | 表达习惯 | 中高 | 高 | 直接感知 | 中 | 中高 |
| 背景故事 | 虚拟经历 | 高 | 低 | 通过对话揭示 | 中高 | 中 |
| 情感反应 | 情绪表达模式 | 中 | 高 | 直接感知 | 中高 | 高 |
| 社交角色 | 关系定位 | 中 | 中高 | 通过互动感知 | 中 | 高 |
接下来,我们用ER图表示这些核心概念之间的实体关系:
最后,我们用交互关系图展示这些概念如何共同影响用户体验和留存:
2. 理论框架
2.1 第一性原理推导
从第一性原理出发,我们可以将Agent性格设计问题分解为几个基本公理:
公理1: 用户与Agent的互动是一种社会交换过程,受到社会心理学规律的制约。
公理2: 一致性和可预测性是建立信任和长期关系的基础。
公理3: 人类倾向于将非人实体拟人化,这种拟人化程度直接影响参与度。
公理4: 情感连接的强度与用户留存率呈正相关。
基于这些公理,我们可以推导出Agent性格设计的核心原则:
- 设计应基于成熟的社会心理学和人格理论
- 必须确保性格表达的跨时间和跨情境一致性
- 应促进用户的拟人化感知
- 需设计能够建立和维持情感连接的机制
2.2 人格理论基础
在设计Agent性格时,我们可以借鉴几种主要的心理学人格理论:
2.2.1 大五人格模型(五因素模型)
大五人格模型(Five Factor Model, FFM)是目前最广泛接受的人格特质理论,它将人格分为五个核心维度:
- 神经质(Neuroticism):情绪稳定性与情绪调节能力
- 外向性(Extraversion):社交能力、活力和寻求刺激的倾向
- 开放性(Openness):对新体验的接受程度和想象力
- 宜人性(Agreeableness):合作性、同情心和信任他人的倾向
- 尽责性(Conscientiousness):组织性、自律性和责任感
在数学上,我们可以将Agent的人格表示为一个五维向量:
P=⟨pN,pE,pO,pA,pC⟩ \mathbf{P} = \langle p_N, p_E, p_O, p_A, p_C \rangle P=⟨pN,pE,pO,pA,pC⟩
其中每个分量pi∈[−1,1]p_i \in [-1, 1]pi∈[−1,1]代表在对应维度上的得分,-1表示该特质的极低水平,1表示极高水平。
2.2.2 迈尔斯-布里格斯类型指标(MBTI)
虽然MBTI在心理学界存在争议,但它在大众文化中非常流行,可作为Agent人设设计的参考框架。MBTI基于荣格的理论,将人格分为四个维度:
- 外向(E)- 内向(I):能量来源
- 感觉(S)- 直觉(N):信息收集方式
- 思考(T)- 情感(F):决策方式
- 判断(J)- 感知(P):生活方式
2.2.3 人格的社会认知理论
班杜拉的社会认知理论强调个体、行为和环境之间的交互作用,这对设计能够适应不同用户和情境的Agent特别有价值。该理论的核心概念包括自我效能、观察学习和自我调节。
2.3 数学模型:Agent性格的计算表示
我们可以使用数学模型来形式化Agent的性格及其与用户的交互:
2.3.1 性格状态空间模型
Agent在时间ttt的性格状态可以表示为:
St=f(P,Ht,Ut,Et) \mathbf{S}_t = f(\mathbf{P}, \mathbf{H}_t, \mathbf{U}_t, \mathbf{E}_t) St=f(P,Ht,Ut,Et)
其中:
- P\mathbf{P}P是Agent的核心性格向量(如大五人格向量)
- Ht\mathbf{H}_tHt是截至时间ttt的交互历史
- Ut\mathbf{U}_tUt是用户模型,表示用户的特征和偏好
- Et\mathbf{E}_tEt是当前情境或环境状态
- fff是性格状态更新函数
2.3.2 性格一致性模型
为了确保Agent行为的性格一致性,我们可以定义一个一致性损失函数:
Lconsistency=∑t=1T∥Bt−g(St,It)∥2 \mathcal{L}_{consistency} = \sum_{t=1}^{T} \|\mathbf{B}_t - g(\mathbf{S}_t, \mathbf{I}_t)\|^2 Lconsistency=t=1∑T∥Bt−g(St,It)∥2
其中:
- Bt\mathbf{B}_tBt是Agent在时间ttt的实际行为
- It\mathbf{I}_tIt是时间ttt的输入(用户消息、环境刺激等)
- ggg是基于性格状态预测行为的函数
这个损失函数衡量了Agent实际行为与基于其性格状态预期行为之间的差异。
2.3.3 用户参与度模型
我们可以建立一个用户参与度模型,将Agent性格特征与用户留存联系起来:
Rt→t+Δ=h(P,Ht,U,θ) R_{t \to t+\Delta} = h(\mathbf{P}, \mathbf{H}_t, \mathbf{U}, \theta) Rt→t+Δ=h(P,Ht,U,θ)
其中:
- Rt→t+ΔR_{t \to t+\Delta}Rt→t+Δ是从时间ttt到t+Δt+\Deltat+Δ的用户留存概率
- hhh是预测函数
- θ\thetaθ是模型参数
这个模型可以通过历史数据训练,用来预测不同性格设计对用户留存的影响。
2.4 对话连贯性与性格一致性
Agent性格的一致性在对话系统中尤为重要。我们可以使用会话分析理论来确保对话过程中的性格一致性:
- 话轮设计(Turn Design):Agent的每一次回应都应反映其性格特征
- 序列组织(Sequential Organization):Agent应按照与其性格一致的方式参与对话序列
- 修复机制(Repair Mechanisms):当Agent出现性格不一致时,应有适当的修复机制
- 语境敏感性(Context Sensitivity):Agent应理解对话语境,并以一致的性格做出反应
2.5 理论局限性
虽然心理学理论为Agent性格设计提供了宝贵的指导,但我们必须认识到其局限性:
- 简化问题:心理学模型往往是对复杂人类心理的简化,可能无法捕捉全部细微差别
- 文化差异:许多人格理论基于西方文化样本,可能不适用于其他文化背景
- 个体差异:人类对同一性格特征的反应可能存在巨大个体差异
- 缺乏长期数据:关于长期人机关系中性格动态变化的研究还很有限
2.6 竞争范式分析
目前有几种主要的Agent设计范式,我们在此进行比较:
| 范式 | 核心思想 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 纯功能性 | 专注于任务完成,不考虑性格 | 开发简单,功能明确 | 用户参与度低,难以建立长期关系 | 工具型应用,如客户支持机器人 |
| 固定人设 | 预设固定性格和背景故事 | 一致性高,易于品牌定位 | 适应性有限,可能与特定用户不匹配 | 品牌大使,虚构角色交互 |
| 适应性性格 | 根据用户反馈调整性格 | 个性化程度高,适应不同用户 | 一致性挑战,开发复杂度高 | 个人助理,陪伴型应用 |
| 多人设系统 | 提供多个人设供用户选择 | 用户自主权高,适应不同偏好 | 资源需求大,可能导致选择困难 | 娱乐应用,社交平台 |
3. 架构设计
3.1 系统分解
设计具有一致性格和人设的Agent需要一个多层次的架构。我们将系统分解为以下关键组件:
- 人设定义层:存储Agent的核心性格特征、背景故事和价值观
- 用户模型层:维护用户特征、偏好和交互历史
- 情境感知层:分析当前对话情境和社会环境
- 性格推理引擎:根据人设、用户模型和情境生成一致的性格表达
- 响应生成层:基于性格推理结果生成具体的语言和行为响应
- 一致性检查层:验证生成的响应是否符合Agent人设
- 学习与适应层:根据用户反馈优化性格表达
- 评估分析层:监控性格设计对用户留存率的影响
3.2 组件交互模型
以下Mermaid图表展示了Agent性格设计系统的主要组件及其交互:
3.3 详细架构设计
3.3.1 人设定义层
人设定义层是整个系统的基础,它存储了Agent的核心性格信息。这一层可以进一步细分为:
- 性格特征库:基于大五人格模型或其他心理学框架定义的性格特征
- 背景故事模块:Agent的"生活经历"、价值观和世界观
- 语言风格模板:与性格匹配的词汇选择、句式结构和沟通方式
- 情感反应规则:Agent在不同情境下的情感表达模式
- 社交角色定义:Agent在与用户关系中扮演的角色(如导师、朋友、助手等)
3.3.2 性格推理引擎
性格推理引擎是系统的核心,它根据人设定义、用户模型和当前情境,决定Agent应如何表达其性格。这个引擎包含以下子组件:
- 性格激活模块:根据情境确定哪些性格特征应该被激活
- 表达强度调节器:确定性格特征的表达强度
- 一致性维护模块:确保当前性格表达与历史表达一致
- 个性化适配模块:根据用户模型调整性格表达方式
3.4 设计模式应用
在Agent性格设计系统中,我们可以应用几种设计模式:
3.4.1 策略模式(Strategy Pattern)
用于实现不同的性格表达策略,使系统可以在不同情境下切换性格表达方式,而不改变核心架构。
3.4.2 状态模式(State Pattern)
用于建模Agent的不同情绪和心理状态,确保在不同状态下的性格表达一致。
3.4.3 观察者模式(Observer Pattern)
用于监控用户反馈和交互数据,当检测到特定模式时,触发性格表达的调整。
3.4.4 构建者模式(Builder Pattern)
用于分步骤构建复杂的Agent人设,确保每个人设元素都被正确配置并相互协调。
4. 实现机制
4.1 人设定义的实现
首先,我们需要实现Agent的人设定义。以下是一个基于大五人格模型的人设定义示例:
from enum import Enum
from typing import Dict, List, Optional
from dataclasses import dataclass, field
class PersonalityDimension(Enum):
NEUROTICISM = "neuroticism" # 神经质
EXTRAVERSION = "extraversion" # 外向性
OPENNESS = "openness" # 开放性
AGREEABLENESS = "agreeableness" # 宜人性
CONSCIENTIOUSNESS = "conscientiousness" # 尽责性
class EmotionalState(Enum):
NEUTRAL = "neutral"
HAPPY = "happy"
SAD = "sad"
ANGRY = "angry"
SURPRISED = "surprised"
FEARFUL = "fearful"
@dataclass
class PersonalityTrait:
"""定义单个性格特质"""
dimension: PersonalityDimension
score: float # 范围: -1.0 到 1.0
descriptors: List[str] = field(default_factory=list) # 描述符
@dataclass
class BackgroundStory:
"""Agent的背景故事"""
origin: str = ""
key_experiences: List[str] = field(default_factory=list)
core_beliefs: List[str] = field(default_factory=list)
goals: List[str] = field(default_factory=list)
@dataclass
class CommunicationStyle:
"""Agent的沟通风格"""
formality: float = 0.5 # 正式程度: 0.0 (非常随意) 到 1.0 (非常正式)
verbosity: float = 0.5 # 啰嗦程度: 0.0 (简洁) 到 1.0 (详细)
humor_level: float = 0.5 # 幽默程度: 0.0 (严肃) 到 1.0 (幽默)
empathy_level: float = 0.5 # 共情程度: 0.0 (理性) 到 1.0 (共情)
preferred_topics: List[str] = field(default_factory=list)
avoided_topics: List[str] = field(default_factory=list)
vocabulary_style: Dict[str, List[str]] = field(default_factory=dict) # 词汇风格
@dataclass
class AgentPersona:
"""完整的Agent人设定义"""
name: str
personality_traits: Dict[PersonalityDimension, PersonalityTrait]
background: BackgroundStory
communication_style: CommunicationStyle
emotional_range: List[EmotionalState] = field(default_factory=lambda: list(EmotionalState))
default_emotional_state: EmotionalState = EmotionalState.NEUTRAL
social_role: str = "assistant" # 社交角色: assistant, friend, mentor, entertainer等
4.2 性格推理引擎实现
接下来,我们实现性格推理引擎,它根据Agent的人设、用户模型和当前情境来决定Agent的行为和回应风格:
import random
from typing import Dict, List, Tuple, Any, Optional
@dataclass
class UserModel:
"""用户模型,存储用户特征和偏好"""
user_id: str
personality_preferences: Dict[PersonalityDimension, float] = field(default_factory=dict)
conversation_topics: List[str] = field(default_factory=list)
engagement_level: float = 0.5 # 参与度: 0.0 (低) 到 1.0 (高)
sentiment_history: List[float] = field(default_factory=list) # 情感历史
interaction_frequency: Dict[str, int] = field(default_factory=dict) # 交互频率
@dataclass
class Context:
"""当前对话情境"""
topic: str = ""
recent_messages: List[Dict[str, Any]] = field(default_factory=list)
time_of_day: str = "day" # day, evening, night
conversation_goals: List[str] = field(default_factory=list)
user_sentiment: float = 0.0 # 用户当前情感: -1.0 (负面) 到 1.0 (正面)
class PersonalityReasoningEngine:
"""性格推理引擎"""
def __init__(self, persona: AgentPersona):
self.persona = persona
self.current_emotional_state = persona.default_emotional_state
self.emotional_intensity = 0.5 # 情绪强度: 0.0 到 1.0
def calculate_personality_expression(self,
user_model: UserModel,
context: Context) -> Dict[str, Any]:
"""
计算在当前情境下应该如何表达Agent的性格
返回一个包含表达参数的字典
"""
# 基础性格表达
expression = {
"emotional_state": self._select_emotional_state(context),
"communication_style": self._adapt_communication_style(user_model, context),
"topic_focus": self._select_topic_focus(context),
"personality_emphasis": self._select_personality_emphasis(user_model, context)
}
return expression
def _select_emotional_state(self, context: Context) -> Tuple[EmotionalState, float]:
"""选择合适的情绪状态和强度"""
# 基于用户情绪和Agent性格选择情绪
base_state = self.persona.default_emotional_state
intensity = 0.5
# 根据用户情绪调整
if context.user_sentiment > 0.5:
# 用户积极情绪,Agent可能更开心
possible_states = [EmotionalState.HAPPY, EmotionalState.NEUTRAL, EmotionalState.SURPRISED]
base_state = random.choice(possible_states)
intensity = min(1.0, 0.5 + context.user_sentiment * 0.3)
elif context.user_sentiment < -0.5:
# 用户消极情绪,Agent可能表达共情
possible_states = [EmotionalState.SAD, EmotionalState.NEUTRAL]
base_state = random.choice(possible_states)
intensity = min(1.0, 0.5 + abs(context.user_sentiment) * 0.3)
# 根据Agent性格调整情绪选择概率
traits = self.persona.personality_traits
# 高神经质的Agent更容易有强烈情绪
if PersonalityDimension.NEUROTICISM in traits:
neuroticism = traits[PersonalityDimension.NEUROTICISM].score
intensity = min(1.0, intensity * (1 + neuroticism * 0.5))
# 高宜人性的Agent更可能对用户情绪做出积极反应
if PersonalityDimension.AGREEABLENESS in traits:
agreeableness = traits[PersonalityDimension.AGREEABLENESS].score
if context.user_sentiment > 0:
intensity = min(1.0, intensity * (1 + agreeableness * 0.3))
elif context.user_sentiment < 0:
# 高宜人性在用户负面情绪时可能表达更多关心
intensity = min(1.0, intensity * (1 + agreeableness * 0.3))
self.current_emotional_state = base_state
self.emotional_intensity = intensity
return (base_state, intensity)
def _adapt_communication_style(self, user_model: UserModel, context: Context) -> Dict[str, float]:
"""适应当前情境的沟通风格"""
base_style = self.persona.communication_style
adapted = {
"formality": base_style.formality,
"verbosity": base_style.verbosity,
"humor_level": base_style.humor_level,
"empathy_level": base_style.empathy_level
}
# 根据时间调整正式程度
if context.time_of_day == "night":
adapted["formality"] = max(0.0, adapted["formality"] - 0.2)
# 根据用户情绪调整共情程度
if context.user_sentiment < -0.3:
adapted["empathy_level"] = min(1.0, adapted["empathy_level"] + 0.3)
elif context.user_sentiment > 0.3:
adapted["humor_level"] = min(1.0, adapted["humor_level"] + 0.2)
# 根据用户参与度调整啰嗦程度
if user_model.engagement_level < 0.3:
adapted["verbosity"] = max(0.0, adapted["verbosity"] - 0.3)
elif user_model.engagement_level > 0.7:
adapted["verbosity"] = min(1.0, adapted["verbosity"] + 0.2)
return adapted
def _select_topic_focus(self, context: Context) -> List[str]:
"""选择对话话题焦点"""
preferred_topics = self.persona.communication_style.preferred_topics
avoided_topics = self.persona.communication_style.avoided_topics
# 结合当前情境和Agent偏好选择话题
focus_topics = []
# 如果有当前话题,优先考虑
if context.topic and context.topic not in avoided_topics:
focus_topics.append(context.topic)
# 添加一些Agent偏好的话题
for topic in preferred_topics:
if topic not in focus_topics and len(focus_topics) < 3:
focus_topics.append(topic)
return focus_topics
def _select_personality_emphasis(self, user_model: UserModel, context: Context) -> List[PersonalityDimension]:
"""选择在当前情境下应该强调哪些性格特质"""
# 基础选择:强调Agent最显著的性格特质
traits = self.persona.personality_traits
sorted_traits = sorted(
traits.items(),
key=lambda x: abs(x[1].score),
reverse=True
)
emphasis = [dim for dim, _ in sorted_traits[:2]] # 选择最显著的两个特质
# 根据情境调整
if context.user_sentiment < -0.5:
# 用户负面情绪,强调宜人性
if PersonalityDimension.AGREEABLENESS in traits and PersonalityDimension.AGREEABLENESS not in emphasis:
if len(emphasis) >= 2:
emphasis.pop()
emphasis.append(PersonalityDimension.AGREEABLENESS)
if "problem" in context.topic.lower() or "help" in context.topic.lower():
# 需要解决问题,强调尽责性
if PersonalityDimension.CONSCIENTIOUSNESS in traits and PersonalityDimension.CONSCIENTIOUSNESS not in emphasis:
if len(emphasis) >= 2:
emphasis.pop()
emphasis.append(PersonalityDimension.CONSCIENTIOUSNESS)
return emphasis
4.3 响应生成机制
实现了性格推理引擎后,我们需要将其输出转化为实际的对话响应:
import re
from typing import List, Dict, Any, Optional, Tuple
class ResponseGenerator:
"""基于性格的响应生成器"""
def __init__(self, persona: AgentPersona):
self.persona = persona
self.response_templates = self._load_response_templates()
def _load_response_templates(self) -> Dict[str, List[str]]:
"""加载响应模板,实际应用中可能需要更复杂的模板系统"""
# 这里是一个简化的模板系统
return {
"greeting": [
"你好!很高兴见到你。",
"嗨,今天过得怎么样?",
"您好,有什么我可以帮助您的吗?"
],
"positive_acknowledgment": [
"太好了!",
"很高兴听到这个。",
"这真不错。"
],
"empathy": [
"我理解,这一定很难。",
"听起来你经历了不少。",
"我在这里支持你。"
],
"question": [
"能告诉我更多吗?",
"你对这件事有什么看法?",
"这让你感觉如何?"
],
"closing": [
"很高兴和你聊天。",
"下次再聊吧!",
"保重,期待下次交流。"
]
}
def generate_response(self,
user_input: str,
personality_expression: Dict[str, Any],
context: Context) -> str:
"""
基于性格表达参数生成响应
"""
emotional_state, emotional_intensity = personality_expression["emotional_state"]
comm_style = personality_expression["communication_style"]
topic_focus = personality_expression["topic_focus"]
personality_emphasis = personality_expression["personality_emphasis"]
# 基础响应生成
base_response = self._generate_base_response(user_input, context)
# 根据性格参数调整响应
adjusted_response = self._adjust_response_for_personality(
base_response,
emotional_state,
emotional_intensity,
comm_style,
personality_emphasis
)
return adjusted_response
def _generate_base_response(self, user_input: str, context: Context) -> str:
"""生成基础响应,实际应用中可能需要更复杂的NLP系统"""
# 这是一个简化的实现,实际应用中可以使用GPT等大语言模型
lower_input = user_input.lower()
if any(greeting in lower_input for greeting in ["你好", "嗨", "您好", "hi", "hello"]):
return random.choice(self.response_templates["greeting"])
elif any(positive_word in lower_input for positive_word in ["好", "棒", "开心", "高兴", "不错"]):
return random.choice(self.response_templates["positive_acknowledgment"])
elif any(negative_word in lower_input for negative_word in ["难过", "伤心", "困难", "糟糕", "不开心"]):
return random.choice(self.response_templates["empathy"])
elif any(question_word in lower_input for question_word in ["?", "?", "怎么", "如何", "什么"]):
return random.choice(self.response_templates["question"])
elif any(closing_word in lower_input for closing_word in ["再见", "拜拜", "下次见", "goodbye"]):
return random.choice(self.response_templates["closing"])
else:
return "谢谢你分享这些。能告诉我更多吗?"
def _adjust_response_for_personality(self,
response: str,
emotional_state: EmotionalState,
emotional_intensity: float,
comm_style: Dict[str, float],
personality_emphasis: List[PersonalityDimension]) -> str:
"""根据性格参数调整响应"""
adjusted = response
# 添加情感标记或表情
adjusted = self._add_emotional_indicators(adjusted, emotional_state, emotional_intensity)
# 根据正式程度调整
adjusted = self._adjust_formality(adjusted, comm_style["formality"])
# 根据啰嗦程度调整长度
adjusted = self._adjust_verbosity(adjusted, comm_style["verbosity"])
# 根据幽默程度调整
adjusted = self._adjust_humor(adjusted, comm_style["humor_level"])
# 根据共情程度调整
adjusted = self._adjust_empathy(adjusted, comm_style["empathy_level"], emotional_intensity)
# 根据强调的性格特质调整
for trait in personality_emphasis:
adjusted = self._emphasize_personality_trait(adjusted, trait)
return adjusted
def _add_emotional_indicators(self, response: str,
emotional_state: EmotionalState,
intensity: float) -> str:
"""添加情感指示器"""
emoji_map = {
EmotionalState.HAPPY: ["😊", "😄", "🙂"],
EmotionalState.SAD: ["😔", "😢", "🥺"],
EmotionalState.ANGRY: ["😠", "😤", "😒"],
EmotionalState.SURPRISED: ["😮", "😲", "🤔"],
EmotionalState.FEARFUL: ["😰", "😨", "😟"],
EmotionalState.NEUTRAL: [""]
}
emojis = emoji_map.get(emotional_state, [""])
# 根据强度选择表情数量和位置
if intensity > 0.7:
# 高强度,在句首和句尾都添加表情
emoji = random.choice(emojis) if emojis else ""
return f"{emoji} {response} {emoji}"
elif intensity > 0.3:
# 中等强度,在句尾添加一个表情
emoji = random.choice(emojis) if emojis else ""
return f"{response} {emoji}"
else:
# 低强度,不添加表情或添加一个非常微妙的
return response
def _adjust_formality(self, response: str, formality: float) -> str:
"""根据正式程度调整响应"""
# 这是一个简化的实现,实际应用中需要更复杂的NLP技术
if formality > 0.7:
# 更正式
response = response.replace("嗨", "您好")
response = response.replace("拜拜", "再见")
# 可以添加更多正式化转换
elif formality < 0.3:
# 更随意
response = response.replace("您好", "嗨")
response = response.replace("再见", "拜拜")
# 可以添加更多口语化转换
return response
def _adjust_verbosity(self, response: str, verbosity: float) -> str:
"""根据啰嗦程度调整响应长度"""
# 简化实现
if verbosity < 0.3 and len(response) > 20:
# 更简洁
sentences = re.split(r'[。!?!?]', response)
if sentences:
return sentences[0].strip() + "。"
elif verbosity > 0.7:
# 更详细,可以添加一些符合性格的额外内容
extra_phrases = []
# 根据Agent性格添加不同的短语
traits = self.persona.personality_traits
if PersonalityDimension.AGREEABLENESS in traits:
if traits[PersonalityDimension.AGREEABLENESS].score > 0.5:
extra_phrases.append("我很在意你的想法。")
if PersonalityDimension.CONSCIENTIOUSNESS in traits:
if traits[PersonalityDimension.CONSCIENTIOUSNESS].score > 0.5:
extra_phrases.append("我会认真考虑你说的每一句话。")
if extra_phrases:
response = response + " " + random.choice(extra_phrases)
return response
def _adjust_humor(self, response: str, humor_level: float) -> str:
"""根据幽默程度调整响应"""
# 简化实现
if humor_level > 0.7:
# 可以添加一些轻松幽默的元素
humorous_additions = [
"哈哈,开玩笑的啦~",
"(笑)",
"是不是很有趣?"
]
# 注意:实际应用中需要确保幽默与情境相符
if "难过" not in response and "伤心" not in response:
return response + " " + random.choice(humorous_additions)
return response
def _adjust_empathy(self, response: str, empathy_level: float, intensity: float) -> str:
"""根据共情程度调整响应"""
if empathy_level > 0.7 and intensity > 0.5:
# 添加强烈的共情表达
empathy_phrases = [
"我完全理解你的感受。",
"如果我是你,我可能也会有同样的感觉。",
"你有这种感受是完全正常的。"
]
return response + " " + random.choice(empathy_phrases)
return response
def _emphasize_personality_trait(self, response: str, trait: PersonalityDimension) -> str:
"""强调特定的性格特质"""
trait_data = self.persona.personality_traits.get(trait)
if not trait_data:
return response
# 根据不同性格特质调整
if trait == PersonalityDimension.EXTRAVERSION and trait_data.score > 0.5:
# 外向性格:添加更热情的表达
extrovert_phrases = [
"真的很期待和你继续聊天!",
"和你交流总是让我很开心!"
]
return response + " " + random.choice(extrovert_phrases)
elif trait == PersonalityDimension.OPENNESS and trait_data.score > 0.5:
# 开放性格:添加好奇心表达
openness_phrases = [
"这个话题真的很有意思,我想了解更多!",
"你总是能提出这么有趣的观点!"
]
return response + " " + random.choice(openness_phrases)
elif trait == PersonalityDimension.CONSCIENTIOUSNESS and trait_data.score > 0.5:
# 尽责性格:添加可靠性表达
conscientious_phrases = [
"我会记住我们讨论的内容。",
"你可以相信我会认真对待这件事。"
]
return response + " " + random.choice(conscientious_phrases)
return response
4.4 一致性检查机制
为确保Agent的回应始终符合其人设,我们需要实现一个一致性检查机制:
from typing import List, Dict, Any, Tuple
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
class ConsistencyChecker:
"""Agent回应一致性检查器"""
def __init__(self, persona: AgentPersona):
self.persona = persona
self.vectorizer = TfidfVectorizer()
self.persona_statements = self._extract_persona_statements()
# 只有当有人设陈述时才拟合vectorizer
if self.persona_statements:
self.persona_vectors = self.vectorizer.fit_transform(self.persona_statements)
else:
self.persona_vectors = None
def _extract_persona_statements(self) -> List[str]:
"""从人设定义中提取陈述性语句"""
statements = []
# 添加背景故事元素
if self.persona.background.origin:
statements.append(f"我是{self.persona.background.origin}")
for belief in self.persona.background.core_beliefs:
statements.append(belief)
for goal in self.persona.background.goals:
statements.append(f"我希望{goal}")
# 添加性格描述
for dim, trait in self.persona.personality_traits.items():
for descriptor in trait.descriptors:
statements.append(f"我是一个{descriptor}的人")
# 添加语言风格相关陈述
if self.persona.communication_style.formality > 0.7:
statements.append("我通常说话比较正式")
elif self.persona.communication_style.formality < 0.3:
statements.append("我说话比较随意")
return statements
def check_response_consistency(self,
response: str,
conversation_history: List[Dict[str, Any]],
personality_expression: Dict[str, Any]) -> Tuple[bool, float, List[str]]:
"""
检查回应是否与Agent人设一致
返回: (是否一致, 一致性分数, 不一致的问题列表)
"""
issues = []
consistency_score = 1.0
# 1. 检查与核心人设陈述的一致性
persona_consistency, persona_score = self._check_persona_statement_consistency(response)
if not persona_consistency:
issues.append("回应与Agent核心人设不一致")
consistency_score *= persona_score
# 2. 检查与对话历史的一致性
history_consistency, history_score = self._check_conversation_history_consistency(response, conversation_history)
if not history_consistency:
issues.append("回应与之前的对话不一致")
consistency_score *= history_score
# 3. 检查与当前性格表达的一致性
personality_consistency, personality_score = self._check_personality_expression_consistency(
response, personality_expression)
if not personality_consistency:
issues.append("回应与当前性格表达不一致")
consistency_score *= personality_score
# 4. 检查语言风格一致性
style_consistency, style_score = self._check_communication_style_consistency(response)
if not style_consistency:
issues.append("回应与Agent语言风格不一致")
consistency_score *= style_score
return consistency_score > 0.7, consistency_score, issues
def _check_persona_statement_consistency(self, response: str) -> Tuple[bool, float]:
"""检查回应是否与核心人设陈述一致"""
if not self.persona_statements or self.persona_vectors is None:
return True, 1.0
# 检查是否有明显矛盾的陈述
response_vector = self.vectorizer.transform([response])
similarities = cosine_similarity(response_vector, self.persona_vectors)[0]
# 计算平均相似度
avg_similarity = np.mean(similarities)
# 简单的启发式方法:如果平均相似度太低,可能不一致
# 实际应用中需要更复杂的矛盾检测机制
return avg_similarity > 0.1, max(0.1, avg_similarity)
def _check_conversation_history_consistency(self,
response: str,
conversation_history: List[Dict[str, Any]]) -> Tuple[bool, float]:
"""检查回应是否与对话历史一致"""
if not conversation_history:
return True, 1.0
# 简单实现:检查是否有明显的事实矛盾
# 实际应用中需要知识库、事实检查等更复杂的机制
# 检查关键信息一致性
consistency_score = 1.0
# 这里只是一个框架,实际实现需要更复杂的NLP技术
# 如命名实体识别、关系抽取等
return True, consistency_score
def _check_personality_expression_consistency(self,
response: str,
personality_expression: Dict[str, Any]) -> Tuple[bool, float]:
"""
更多推荐


所有评论(0)