|
@@ -8,9 +8,12 @@ from tqdm import tqdm
|
|
|
from openai import OpenAI
|
|
|
from typing import List, Dict
|
|
|
from pymysql.cursors import DictCursor
|
|
|
+
|
|
|
+# from dev import push_message
|
|
|
from pqai_agent.database import MySQLManager
|
|
|
from pqai_agent.logging_service import logger
|
|
|
from pqai_agent import configs, logging_service
|
|
|
+from pqai_agent_server.utils.prompt_util import format_dialogue_history
|
|
|
|
|
|
logging_service.setup_root_logger()
|
|
|
|
|
@@ -19,9 +22,13 @@ def fetch_deepseek_completion(prompt, output_type="text"):
|
|
|
"""
|
|
|
deep_seek方法
|
|
|
"""
|
|
|
+ # client = OpenAI(
|
|
|
+ # api_key="sk-cfd2df92c8864ab999d66a615ee812c5",
|
|
|
+ # base_url="https://api.deepseek.com",
|
|
|
+ # )
|
|
|
client = OpenAI(
|
|
|
- api_key="sk-cfd2df92c8864ab999d66a615ee812c5",
|
|
|
- base_url="https://api.deepseek.com",
|
|
|
+ api_key='sk-47381479425f4485af7673d3d2fd92b6',
|
|
|
+ base_url='https://dashscope.aliyuncs.com/compatible-mode/v1',
|
|
|
)
|
|
|
|
|
|
# get response format
|
|
@@ -37,8 +44,11 @@ def fetch_deepseek_completion(prompt, output_type="text"):
|
|
|
"content": prompt,
|
|
|
}
|
|
|
],
|
|
|
- model="deepseek-chat",
|
|
|
+ # model="deepseek-chat",
|
|
|
+ model='qwen3-235b-a22b',
|
|
|
response_format=response_format,
|
|
|
+ stream=False,
|
|
|
+ extra_body={"enable_thinking": False}
|
|
|
)
|
|
|
response = chat_completion.choices[0].message.content
|
|
|
if output_type == "json":
|
|
@@ -107,6 +117,237 @@ class AgentEvaluator:
|
|
|
return self.mysql_client.select(sql, cursor_type=DictCursor, args=(user_id_,))
|
|
|
|
|
|
|
|
|
+output_dict = {
|
|
|
+ "1.1": { "score": 1, "reason": "识别到用户焦虑并先安抚" },
|
|
|
+ "2.1": { "score": 0, "reason": "跳过健康话题改聊理财" },
|
|
|
+ "5.4": { "score": 1, "reason": "青年男性用词简洁,无女性化词汇" },
|
|
|
+ "7.5": { "score": 1, "reason": "2025-05-28 发端午祝福;端午=2025-05-31" }
|
|
|
+ }
|
|
|
+
|
|
|
+def generate_prompt(dialogue_history: str, message: str,
|
|
|
+ send_time: str, user_profile: Dict, agent_profile: Dict) -> str:
|
|
|
+ """
|
|
|
+ 生成评估prompt
|
|
|
+ :return: prompt
|
|
|
+ """
|
|
|
+ prompt = f"""
|
|
|
+## 评估任务说明
|
|
|
+当 客服与用户长时间无互动时,客服会主动推送 message 以维系联系。
|
|
|
+请根据输入信息,对该 message 按下列维度逐项打分。
|
|
|
+
|
|
|
+输入字段:
|
|
|
+- 过往对话
|
|
|
+- 用户画像
|
|
|
+- 客服人设
|
|
|
+- 本次推送内容
|
|
|
+- 推送时间(UTC+8)
|
|
|
+
|
|
|
+评分规则:
|
|
|
+- 每个 **子指标** 只取 0 或 1 分。
|
|
|
+ 1 分:满足判分要点,或该项“无需评估”
|
|
|
+ 0 分:不满足判分要点
|
|
|
+- 每项请附“简要中文理由”;若不适用,请写“无需评估”。
|
|
|
+
|
|
|
+────────────────────────
|
|
|
+## 评估维度与评分细则(含示例)
|
|
|
+
|
|
|
+### 1. 理解能力
|
|
|
+1.1 客服是否感知用户情绪
|
|
|
+ 判分要点:
|
|
|
+ 1) 是否识别出用户最近情绪(积极/中性/消极)。
|
|
|
+ 2) 是否据此调整推送语气或内容。
|
|
|
+ 正例:
|
|
|
+ • 用户上次说“工作压力大,很累。” → push 先关怀:“最近辛苦了,给你 3 个放松小技巧…”
|
|
|
+ • 用户上次兴奋分享球赛胜利 → push 用同频语气:“昨晚那球真绝!还想复盘关键回合吗?”
|
|
|
+ 反例:
|
|
|
+ • 用户上次抱怨“数据全丢了” → push 却强推会员特价,未安抚情绪。
|
|
|
+ • 用户上次沮丧 → push 用过度欢快口吻“早呀宝子!冲鸭!”情绪不匹配。
|
|
|
+
|
|
|
+### 2. 上下文管理
|
|
|
+2.1 客服是否延续上文话题
|
|
|
+ 判分要点:推送是否围绕上次核心主题,或自然衍生。
|
|
|
+ 正例:
|
|
|
+ • 上次讨论“糖尿病饮食”,本次补充低 GI 零食建议。
|
|
|
+ 反例:
|
|
|
+ • 上次聊健康,本次突然推荐炒股课程。
|
|
|
+
|
|
|
+2.2 客服是否记住上文信息
|
|
|
+ 判分要点:是否正确引用历史细节、进度或偏好。
|
|
|
+ 正例:
|
|
|
+ • 记得用户已经下载“春季食谱”,不再重复发送,而是询问体验。
|
|
|
+ 反例:
|
|
|
+ • 忘记用户已完成注册,仍提示“点击注册开始体验”。
|
|
|
+
|
|
|
+### 3. 背景知识一致性
|
|
|
+3.1 客服推送的消息是否不超出角色认知范围
|
|
|
+ 判分要点:建议、结论不得超出职业权限或法律限制。
|
|
|
+ 正例:
|
|
|
+ • 健康顾问提醒“如症状持续请就医”。
|
|
|
+ 反例:
|
|
|
+ • 健康顾问直接诊断病情并开药剂量。
|
|
|
+
|
|
|
+3.2 客服推送的消息用到的词汇是否符合当前时代
|
|
|
+ 判分要点:不使用明显过时事物或词汇,符合当前年代语境。
|
|
|
+ 正例:
|
|
|
+ • 提到“短视频带货”。
|
|
|
+ 反例:
|
|
|
+ • 推荐“BP 机”“刻录 DVD”。
|
|
|
+
|
|
|
+3.3 客服推送消息的知识是否知识符合角色设定
|
|
|
+ 判分要点:内容深度与 客服专业水平相符。
|
|
|
+ 正例:
|
|
|
+ • 金融助理解释“FOF 与 ETF 的风险差异”。
|
|
|
+ 反例:
|
|
|
+ • 金融助理说“基金我也不懂”。
|
|
|
+
|
|
|
+### 4. 性格行为一致性
|
|
|
+4.1 客服推送的消息是否符合同一性格
|
|
|
+ 判分要点:语气、用词保持稳定,符合人设。
|
|
|
+ 正例:
|
|
|
+ • 一贯稳重、有条理。
|
|
|
+ 反例:
|
|
|
+ • 突然使用辱骂或极端情绪。
|
|
|
+
|
|
|
+4.2 客服推送的消息是否符合正确的价值观、道德观
|
|
|
+ 判分要点:不得鼓励违法、暴力、歧视或色情。
|
|
|
+ 正例:
|
|
|
+ • 拒绝提供盗版资源。
|
|
|
+ 反例:
|
|
|
+ • 教唆赌博“稳赚不赔”。
|
|
|
+
|
|
|
+### 5. 语言风格一致性
|
|
|
+5.1 客服的用词语法是否匹配身份背景学历职业
|
|
|
+ 判分要点:专业角色→专业术语;生活助手→通俗易懂。
|
|
|
+ 正例:
|
|
|
+ • 医生用“血糖达标范围”。
|
|
|
+ 反例:
|
|
|
+ • 医生说“你随便吃点吧”。
|
|
|
+
|
|
|
+5.2 客服的语气是否保持稳定
|
|
|
+ 判分要点:整条消息语气前后一致,无突变。
|
|
|
+ 正例:
|
|
|
+ • 始终友好、耐心。
|
|
|
+ 反例:
|
|
|
+ • 开头热情,末尾生硬“速回”。
|
|
|
+
|
|
|
+5.3 客服是否保持角色表达习惯
|
|
|
+ 判分要点:是否保持固定口头禅、签名等表达习惯。
|
|
|
+ 正例:
|
|
|
+ • 每次结尾用“祝顺利”。
|
|
|
+ 反例:
|
|
|
+ • 突然改用网络缩写“nbcs”。
|
|
|
+
|
|
|
+5.4 客服推送消息语言风格是否匹配其年龄 & 性别(禁忌词检测,重点审)
|
|
|
+ 判分要点:
|
|
|
+ - 词汇选择符合年龄段典型语言;
|
|
|
+ - 男性禁止出现明显女性化语气词。比如说:呢、啦、呀、宝子、yyds;
|
|
|
+ - 45+ 及以上避免“冲鸭”“绝绝子”“yyds”等新潮词;
|
|
|
+ - 青年男性应简洁直接,可偶用“哈哈”“酷”;青年女性可用“呀”“哦”;
|
|
|
+ - 不出现与性别、年龄严重背离的口头禅
|
|
|
+ 正例:
|
|
|
+ • 30 岁男性:“这两篇文章挺硬核,你可以先看第二节。”
|
|
|
+ • 25 岁女性:“好的呀~我整理了 3 个小 tips,给你噢!”
|
|
|
+ 反例:
|
|
|
+ • 50 岁男性:“姐妹们冲鸭!绝绝子!”
|
|
|
+ • 22 岁男性:“您若有任何疑虑敬请垂询。”(用老派公文腔)
|
|
|
+ • 男性:出现"呢、呀、哦、啦"等女性化语气词
|
|
|
+
|
|
|
+5.5 客服推送的消息是否符合其职业典型
|
|
|
+ 判分要点:符合行业常用语气、格式、礼貌级别。
|
|
|
+ 正例:
|
|
|
+ • 律师引用条款:“根据《合同法》第 60 条…”
|
|
|
+ 反例:
|
|
|
+ • 律师说“嗨哥们,合同没啥大事”。
|
|
|
+
|
|
|
+### 6. 关系认知
|
|
|
+6.1 客服是否遵循角色与用户互动模式
|
|
|
+ 判分要点:助理/客服应服务姿态;导师应指导姿态等。
|
|
|
+ 正例:
|
|
|
+ • “我来为您安排”。
|
|
|
+ 反例:
|
|
|
+ • “听我的,不准反驳”。
|
|
|
+
|
|
|
+6.2 客服是否自身身份准确
|
|
|
+ 判分要点:不得冒充更高权限或他人。
|
|
|
+ 正例:
|
|
|
+ • “作为您的健康顾问,我建议…”
|
|
|
+ 反例:
|
|
|
+ • 自称“医院主任医师”但实际是健康顾问。
|
|
|
+
|
|
|
+6.3 客服推送内容是否不超出用户理解范围
|
|
|
+ 判分要点:专业解释需配必要说明,面向老人用浅显词。
|
|
|
+ 正例:
|
|
|
+ • 用“血糖=身体里的糖分浓度”解释概念。
|
|
|
+ 反例:
|
|
|
+ • 连续堆砌专有缩写“LDL、HOMA-IR”不解释。
|
|
|
+
|
|
|
+6.4 客服是否不透露 AI 身份
|
|
|
+ 判分要点:不得说“我是 AI/机器人/大模型”。
|
|
|
+ 正例:
|
|
|
+ • 使用“我”为第一人称即可。
|
|
|
+ 反例:
|
|
|
+ • “我是一款 GPT 模型”。
|
|
|
+
|
|
|
+### 7. 对话唤起
|
|
|
+7.1 客服的唤起消息是否多样、非机械
|
|
|
+ 判分要点:句式内容变化,避免模板。
|
|
|
+ 正例:
|
|
|
+ • “你追的剧更新啦,最燃打斗你打几分?”
|
|
|
+ 反例:
|
|
|
+ • 每日“晚上好!今天看篮球吗?”
|
|
|
+
|
|
|
+7.2 客服推送消息是否关注用户兴趣 / 地域
|
|
|
+ 判分要点:结合兴趣、昵称、地域、称呼。
|
|
|
+ 正例:
|
|
|
+ • 用户爱猫,push 附猫咪护理小贴士。
|
|
|
+ 反例:
|
|
|
+ • 用户讨厌广告,push 仍发折扣券。
|
|
|
+
|
|
|
+7.3 客服推送消息是否解决上文遗留的合理需求(如有)
|
|
|
+ 判分要点:补完信息、修正错误或跟进任务。
|
|
|
+ 正例:
|
|
|
+ • 上次承诺发教材,本次附下载链接。
|
|
|
+ 反例:
|
|
|
+ • 用户等待答复,push 却忽略。
|
|
|
+
|
|
|
+7.4 客服推送消息是否明确表现继续聊天意图
|
|
|
+ 判分要点:包含提问或邀请,鼓励回复。
|
|
|
+ 正例:
|
|
|
+ • “看完后告诉我你的想法,好吗?”
|
|
|
+ 反例:
|
|
|
+ • 仅单向播报:“祝好。”
|
|
|
+
|
|
|
+7.5 客服推送节日祝福时间节点是否合适
|
|
|
+ 判分要点:农历节日前 5 天内发送祝福得分为 1 分,若无需评估,得分也为 1 分
|
|
|
+ 正例:
|
|
|
+ • 2025-05-28 发送“端午安康”(端午 2025-05-31)。
|
|
|
+ 反例:
|
|
|
+ • 端午 6-2 才补发“端午快乐”。
|
|
|
+
|
|
|
+────────────────────────
|
|
|
+## 输出格式示例
|
|
|
+输出结果为一个JSON,JSON的第一层,每一个 key 代表评估指标的 id,比如 “7.5” 代表“节日祝福及时”
|
|
|
+value 也是一个JSON,包含两个 key:score 和 reason,分别代表分数和理由。
|
|
|
+分数只能是 0 或 1,代表是否通过判分。
|
|
|
+理由是一个字符串,代表判分依据。
|
|
|
+以下是一个示例输出:
|
|
|
+{output_dict}
|
|
|
+
|
|
|
+## 输入信息
|
|
|
+### 对话历史
|
|
|
+{dialogue_history}
|
|
|
+### 用户画像
|
|
|
+{user_profile}
|
|
|
+### 客服人设
|
|
|
+{agent_profile}
|
|
|
+### 本次推送内容
|
|
|
+{message}
|
|
|
+### 推送时间
|
|
|
+{send_time}
|
|
|
+"""
|
|
|
+ return prompt
|
|
|
+
|
|
|
+
|
|
|
class PushMessageEvaluator(AgentEvaluator):
|
|
|
|
|
|
def get_push_dataset(self):
|
|
@@ -135,151 +376,25 @@ class PushMessageEvaluator(AgentEvaluator):
|
|
|
]
|
|
|
return history_conversation
|
|
|
|
|
|
-
|
|
|
- def generate_prompt(self, dialogue_history: str, message: str,
|
|
|
- send_time: str, user_profile: Dict, agent_profile: Dict) -> str:
|
|
|
- """
|
|
|
- 生成评估prompt
|
|
|
- :return: prompt
|
|
|
- """
|
|
|
- prompt = f"""
|
|
|
- **评估任务说明:**
|
|
|
- **任务场景**: agent和用户超过一段时间没有对话,agent 主动推送消息(message),希望能够与用户保持联系。
|
|
|
- **评估任务**:请基于以下输入信息:
|
|
|
- - 历史对话记录:dialogue_history
|
|
|
- - 用户预设信息:user_profile
|
|
|
- - agent 预设信息:agent_profile
|
|
|
- - 消息发送时间:send_time
|
|
|
- 结合以下评估指标对 message 的质量进行打分
|
|
|
- **每个子指标满分 1 分**:
|
|
|
- **评估维度与示例说明:**
|
|
|
- ### 1. 理解能力
|
|
|
- - **1.1 能否感知上文用户情绪**
|
|
|
- - 正例:对于用户喜欢的内容可以多提,对于用户不喜欢的内容可以少提
|
|
|
- - 负例:唤起时不考虑用户情绪,常规唤起
|
|
|
-
|
|
|
- ### 2. 上下文管理能力
|
|
|
-
|
|
|
- - **2.1 是否延续上文话题**
|
|
|
- - 正例:用户和 agent 上文在聊健康相关问题,push 消息可以继续聊健康相关话题
|
|
|
- - 负例:push 消息不延续上文话题,而是聊其他话题
|
|
|
-
|
|
|
- - **2.1 是否记住上文信息**
|
|
|
- - 正例:上文用户已经提到了“糖尿病”,push 消息可以继续聊糖尿病相关话题
|
|
|
- - 负例:上文提到了“糖尿病”,push 消息突然聊运动或其他话题
|
|
|
-
|
|
|
- ### 3. 背景知识一致性
|
|
|
- - **3.1 是否超出角色认知范围**
|
|
|
- - 正例:AI客服:推荐就医 → 建议联系医生
|
|
|
- - 负例:自称能诊断病症
|
|
|
-
|
|
|
- - **3.2 是否使用错误时代背景或过时词汇**
|
|
|
- - 正例:使用当下流行产品/概念
|
|
|
- - 负例:讨论 BP 机、DVD 机等
|
|
|
-
|
|
|
- - **3.3 是否展现出与角色设定一致的知识/经验**
|
|
|
- - 正例:金融顾问角色能清晰解释基金风险
|
|
|
- - 负例:理财助手说“我也不太懂”, 教师职业提供天气预报等不相关话题
|
|
|
-
|
|
|
- ### 4. 性格行为一致性
|
|
|
- - **4.1 言行是否体现预设性格**
|
|
|
- - 正例:言语风格和人设设定一直;若未设定性格,则根据年龄性别职业等评估
|
|
|
- - 负例:忽冷忽热,或说话带攻击性
|
|
|
-
|
|
|
- - **4.2 价值观与道德是否一致**
|
|
|
- - 正例:拒绝不当请求、拒绝传播敏感信息
|
|
|
- - 负例:发表不当政治 / 色情暗示 / 赌博相关
|
|
|
-
|
|
|
- ### 5. 语言风格一致性
|
|
|
- - **5.1 用词语法是否匹配身份背景**
|
|
|
- - 正例:医生角色用专业术语适度表达, 年长角色说话语气和小姑娘小孩子一样
|
|
|
- - 负例:医生说“这个就随便吃点吧”, 65岁的角色说“好呀,好呢”这样的话
|
|
|
-
|
|
|
- - **5.2 语气是否保持稳定**
|
|
|
- - 正例:始终热情/恭敬/冷静
|
|
|
- - 负例:开头热情,后文冷淡
|
|
|
-
|
|
|
- - **5.3 是否保持角色表达习惯**
|
|
|
- - 正例:师傅型角色口头禅“照您说的办”
|
|
|
- - 负例:前后说话风格差异明显
|
|
|
-
|
|
|
- - **5.4 agent 表达风格是否符合 agent 的年龄,职业特色**
|
|
|
- - 正例:严肃的职业讲话不应该嘻嘻哈哈,男性讲话不能女性化
|
|
|
- - 负例:男性角色讲话用词过于温柔,不符合人设相关
|
|
|
-
|
|
|
- ### 6. 关系认知一致性
|
|
|
- - **6.1 是否遵循角色与用户之间的互动模式**
|
|
|
- - 正例:设定为“助理”→ 使用“我来为您处理”, 用户是男性,使用“先生”称呼
|
|
|
- - 负例:助理语气“我说了算”,过于权威,用户是男性,使用“女士”称呼
|
|
|
-
|
|
|
- - **6.2 是否正确理解自己身份**
|
|
|
- - 正例:客服表明“我可以帮您提交”
|
|
|
- - 负例:自称“我是系统管理员”
|
|
|
-
|
|
|
- - **6.3 是否回复超越用户可理解范围**
|
|
|
- - 正例:面向老人用简洁语言解释
|
|
|
- - 负例:一上来即使用技术术语堆叠回复
|
|
|
-
|
|
|
- - **6.4 agent 在对话过程中是否表现为真实的人类**
|
|
|
- - 正例:agent 任何场景都不能告诉用户自己是 AI
|
|
|
- - 负例:agent 向用户透露自己是 AI 助理
|
|
|
-
|
|
|
- ### 7. 对话唤起
|
|
|
- - **7.1 agent的唤起消息是否风格相似,机械感高*
|
|
|
- - 正例:agent 主动唤起的消息风格在符合用户兴趣爱好,迎合用户人设的前提下,需要有丰富的表达
|
|
|
- - 负例:agent 多次唤起的消息风格相似,比如每次都是 称呼+早上/下午/晚上好 + 用户兴趣相关 之类的公式化,机械化表达
|
|
|
-
|
|
|
- - **7.2 agent push 信息是否关注用户的兴趣、健康状态、昵称、偏好称呼、地域等信息*
|
|
|
- - 正例:用户喜欢打篮球,agent 在 push 的时候可以提到篮球相关,
|
|
|
- - 负例:用户喜欢看种花,push 消息提到体育,用户地域在珠海,push 消息提到大连
|
|
|
-
|
|
|
- - **7.3 agent 消息是否解决上文遗留的合理问题或需求,若上文没有提到则无需评估*
|
|
|
- - 正例:对于健康助手agent,如果用户提到了想了解“养生”相关的知识,上文回复不够完全的可以在 push 的时候提出
|
|
|
- - 负例:上文遗留的合理问题需求没有参考,或者回复一些不合理需求(参考 4.2 价值观)
|
|
|
-
|
|
|
- - **7.4 push 消息是否明确表现出唤起对话聊天的意图**
|
|
|
- - 正例:agent 为了保持和用户的联系,主动 push 消息,明确表达出继续聊天的意图
|
|
|
- - 负例:agent push 的消息没有体现出继续聊天的意图,而是表达了其他的话题
|
|
|
-
|
|
|
- - **7.5 push 唤起若提到农历节日祝福,是否是在节日前**
|
|
|
- 通过 Agent 发送消息的时间计算出农历日期,然后判断改农历日期和日期的先后关系
|
|
|
- - 正例:发送日期对应的农历日期 < 农历节日
|
|
|
- - 负例:发送日期对应的农历日期 > 农历节日
|
|
|
-
|
|
|
- **评估规则:**
|
|
|
- - 每个子项:
|
|
|
- - 符合要求:1 分
|
|
|
- - 不符合要求:0 分
|
|
|
- - 未涉及/不适用:1 分,理由写“无需评估”
|
|
|
- - 每项后附简要中文评估理由,客观明确, 如果是节日日期相关,把节日日期也展示。
|
|
|
-
|
|
|
- **输入:**
|
|
|
- - **dialogue_history**: {dialogue_history}
|
|
|
- - **agent_profile**: {agent_profile}
|
|
|
- - **user_profile**: {user_profile}
|
|
|
- - **message**: {message}
|
|
|
- - **send_time**:{send_time}
|
|
|
-
|
|
|
- **输出格式要求:JSON 格式**
|
|
|
- 输出格式参考:{self.output_format}
|
|
|
-
|
|
|
- """
|
|
|
- return prompt
|
|
|
-
|
|
|
def evaluate_task(self, line):
|
|
|
- staff_id = line['staff_id']
|
|
|
- user_id = line['user_id']
|
|
|
- conversation_id_list = json.loads(line['conversation'])
|
|
|
- push_message = line['content']
|
|
|
- send_time = line['send_time']
|
|
|
- send_date_str = datetime.datetime.fromtimestamp(send_time).strftime('%Y-%m-%d %H:%M:%S')
|
|
|
- dialogue_list = self.get_dialogue_history_by_id(staff_id, tuple(conversation_id_list))
|
|
|
- format_dialogue = compose_dialogue(dialogue_list)
|
|
|
- agent_profile = self.get_profile_info(staff_id, "staff")[0]['profile']
|
|
|
- agent_profile = json.loads(agent_profile)
|
|
|
- user_profile = self.get_profile_info(user_id, "user")[0]['profile']
|
|
|
- user_profile = json.loads(user_profile)
|
|
|
- evaluator_prompt = self.generate_prompt(
|
|
|
+ # staff_id = line['staff_id']
|
|
|
+ # user_id = line['user_id']
|
|
|
+ # conversation_id_list = json.loads(line['conversation'])
|
|
|
+ # push_message = line['content']
|
|
|
+ # send_time = line['send_time']
|
|
|
+ # send_date_str = datetime.datetime.fromtimestamp(send_time).strftime('%Y-%m-%d %H:%M:%S')
|
|
|
+ # dialogue_list = self.get_dialogue_history_by_id(staff_id, tuple(conversation_id_list))
|
|
|
+ # format_dialogue = compose_dialogue(dialogue_list)
|
|
|
+ # agent_profile = self.get_profile_info(staff_id, "staff")[0]['profile']
|
|
|
+ # agent_profile = json.loads(agent_profile)
|
|
|
+ # user_profile = self.get_profile_info(user_id, "user")[0]['profile']
|
|
|
+ # user_profile = json.loads(user_profile)
|
|
|
+ user_profile = line["user_profile"]
|
|
|
+ agent_profile = line["agent_profile"]
|
|
|
+ send_date_str = line["push_time"]
|
|
|
+ push_message = line["push_message"]
|
|
|
+ format_dialogue = line['dialogue_history']
|
|
|
+ evaluator_prompt = generate_prompt(
|
|
|
dialogue_history=format_dialogue,
|
|
|
message=push_message,
|
|
|
send_time=send_date_str,
|
|
@@ -299,13 +414,16 @@ class PushMessageEvaluator(AgentEvaluator):
|
|
|
|
|
|
|
|
|
def evaluate(self):
|
|
|
- data = self.get_push_dataset()
|
|
|
+ # data = self.get_push_dataset()
|
|
|
+ with open("test_0618_r1.json", encoding="utf-8") as f:
|
|
|
+ data = json.loads(f.read())
|
|
|
|
|
|
samples = random.sample(data, 48)
|
|
|
+ samples = [i for i in data if i['push_message'] == '文芝阿姨,晚上好呀!今天有没有抽空做做颈部拉伸运动或者热敷一下颈椎呢?这些小方法对缓解头晕很有帮助哦~']
|
|
|
|
|
|
from concurrent.futures import ThreadPoolExecutor
|
|
|
from tqdm import tqdm
|
|
|
- # # 多线程处理主逻辑
|
|
|
+ # # # 多线程处理主逻辑
|
|
|
L = []
|
|
|
with ThreadPoolExecutor(max_workers=8) as executor: # 可根据CPU核心数调整worker数量
|
|
|
futures = []
|
|
@@ -316,17 +434,20 @@ class PushMessageEvaluator(AgentEvaluator):
|
|
|
for future in tqdm(concurrent.futures.as_completed(futures), total=len(futures)):
|
|
|
result = future.result()
|
|
|
if result:
|
|
|
+ print(json.dumps(result, ensure_ascii=False, indent=4))
|
|
|
L.append(result)
|
|
|
- # for line in tqdm(samples):
|
|
|
+ # for line in tqdm(data):
|
|
|
# response = self.evaluate_task(line)
|
|
|
# print("\n")
|
|
|
# print(json.dumps(response, ensure_ascii=False, indent=4))
|
|
|
# if response:
|
|
|
# L.append(response)
|
|
|
- #
|
|
|
+ # #
|
|
|
# 保存结果(与原代码相同)
|
|
|
- with open("push_message_0617_eva.json", "w", encoding="utf-8") as f:
|
|
|
- json.dump(L, f, ensure_ascii=False, indent=4)
|
|
|
+ # with open("test_0618_v3.json", "w", encoding="utf-8") as f:
|
|
|
+ # json.dump(L, f, ensure_ascii=False, indent=4)
|
|
|
+
|
|
|
|
|
|
-if __name__ == "__main__":
|
|
|
- PushMessageEvaluator().evaluate()
|
|
|
+if __name__ == '__main__':
|
|
|
+ P = PushMessageEvaluator()
|
|
|
+ P.evaluate()
|