secret 新增了人格测评两种模型

This commit is contained in:
SengokuCola
2025-03-20 21:19:43 +08:00
parent 8c178b80d7
commit f688362a0f
6 changed files with 362 additions and 51 deletions

View File

@@ -5,16 +5,19 @@ from pathlib import Path
from dotenv import load_dotenv
import sys
'''
第一种方案:基于情景评估的人格测定
'''
current_dir = Path(__file__).resolve().parent
# 获取项目根目录(上三层目录)
project_root = current_dir.parent.parent.parent
# env.dev文件路径
env_path = project_root / ".env.prod"
root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../.."))
sys.path.append(root_path)
from src.plugins.personality.offline_llm import LLMModel # noqa E402
from src.plugins.personality.scene import get_scene_by_factor,get_all_scenes,PERSONALITY_SCENES
from src.plugins.personality.questionnaire import PERSONALITY_QUESTIONS,FACTOR_DESCRIPTIONS
from src.plugins.personality.offline_llm import LLMModel
# 加载环境变量
if env_path.exists():
@@ -25,29 +28,32 @@ else:
print("将使用默认配置")
class PersonalityEvaluator:
class PersonalityEvaluator_direct:
def __init__(self):
self.personality_traits = {"开放性": 0, "尽责": 0, "外向性": 0, "宜人性": 0, "神经质": 0}
self.scenarios = [
{
"场景": "在团队项目中,你发现一个同事的工作质量明显低于预期,这可能会影响整个项目的进度。",
"评估维度": ["尽责性", "宜人性"],
},
{"场景": "你被邀请参加一个完全陌生的社交活动,现场都是不认识的人。", "评估维度": ["外向性", "神经质"]},
{
"场景": "你的朋友向你推荐了一个新的艺术展览,但风格与你平时接触的完全不同。",
"评估维度": ["开放性", "外向性"],
},
{"场景": "在工作中,你遇到了一个技术难题,需要学习全新的技术栈。", "评估维度": ["开放性", "尽责性"]},
{"场景": "你的朋友因为个人原因情绪低落,向你寻求帮助。", "评估维度": ["宜人性", "神经质"]},
]
self.personality_traits = {"开放性": 0, "严谨": 0, "外向性": 0, "宜人性": 0, "神经质": 0}
self.scenarios = []
# 为每个人格特质获取对应的场景
for trait in PERSONALITY_SCENES:
scene = get_scene_by_factor(trait)
# 为每个场景添加评估维度
# 主维度是当前特质,次维度随机选择一个其他特质
other_traits = [t for t in PERSONALITY_SCENES if t != trait]
import random
secondary_trait = random.choice(other_traits)
self.scenarios.append({
"场景": scene["scenario"],
"评估维度": [trait, secondary_trait]
})
self.llm = LLMModel()
def evaluate_response(self, scenario: str, response: str, dimensions: List[str]) -> Dict[str, float]:
"""
使用 DeepSeek AI 评估用户对特定场景的反应
"""
prompt = f"""请根据以下场景和用户描述,评估用户在大五人格模型中的相关维度得分(0-10分)。
prompt = f"""请根据以下场景和用户描述,评估用户在大五人格模型中的相关维度得分(1-6分)。
场景:{scenario}
用户描述:{response}
@@ -59,14 +65,22 @@ class PersonalityEvaluator:
"维度2": 分数
}}
标准:
标准:
1 = 非常不符合
2 = 比较不符合
3 = 有点不符合
4 = 有点符合
5 = 比较符合
6 = 非常符合
评估维度说明:
- 开放性:对新事物的接受程度和创造性思维
- 尽责性:计划性、组织性和责任感
- 严谨性:计划性、组织性和责任感
- 外向性:社交倾向和能量水平
- 宜人性:同理心、合作性和友善程度
- 神经质:情绪稳定性和压力应对能力
请确保分数在0-10之间,并给出合理的评估理由。"""
请确保分数在1-6之间,并给出合理的评估理由。"""
try:
ai_response, _ = self.llm.generate_response(prompt)
@@ -76,25 +90,26 @@ class PersonalityEvaluator:
if start_idx != -1 and end_idx != 0:
json_str = ai_response[start_idx:end_idx]
scores = json.loads(json_str)
# 确保所有分数在0-10之间
return {k: max(0, min(10, float(v))) for k, v in scores.items()}
# 确保所有分数在1-6之间
return {k: max(1, min(6, float(v))) for k, v in scores.items()}
else:
print("AI响应格式不正确使用默认评分")
return {dim: 5.0 for dim in dimensions}
return {dim: 3.5 for dim in dimensions}
except Exception as e:
print(f"评估过程出错:{str(e)}")
return {dim: 5.0 for dim in dimensions}
return {dim: 3.5 for dim in dimensions}
def main():
print("欢迎使用人格形象创建程序!")
print("接下来,您将面对一系列场景。请根据您想要创建的角色形象,描述在该场景下可能的反应。")
print("每个场景都会评估不同的人格维度,最终得出完整的人格特征评估。")
print("评分标准1=非常不符合2=比较不符合3=有点不符合4=有点符合5=比较符合6=非常符合")
print("\n准备好了吗?按回车键开始...")
input()
evaluator = PersonalityEvaluator()
final_scores = {"开放性": 0, "尽责": 0, "外向性": 0, "宜人性": 0, "神经质": 0}
evaluator = PersonalityEvaluator_direct()
final_scores = {"开放性": 0, "严谨": 0, "外向性": 0, "宜人性": 0, "神经质": 0}
dimension_counts = {trait: 0 for trait in final_scores.keys()}
for i, scenario_data in enumerate(evaluator.scenarios, 1):
@@ -119,7 +134,7 @@ def main():
print("\n当前评估结果:")
print("-" * 30)
for dimension, score in scores.items():
print(f"{dimension}: {score}/10")
print(f"{dimension}: {score}/6")
if i < len(evaluator.scenarios):
print("\n按回车键继续下一个场景...")
@@ -133,7 +148,7 @@ def main():
print("\n最终人格特征评估结果:")
print("-" * 30)
for trait, score in final_scores.items():
print(f"{trait}: {score}/10")
print(f"{trait}: {score}/6")
# 保存结果
result = {"final_scores": final_scores, "scenarios": evaluator.scenarios}