人工智能-语义校验deepEval笔记

文章目录

又一优化措施。

安装依赖

bash 复制代码
# 核心依赖:语义相似度+幻觉检测+文本处理
pip install deepeval sentence-transformers scikit-learn spacy
# 可选:中文分词(提升中文校验效果)
python -m spacy download zh_core_web_sm

示例

语义校验-基础校验

校验 AI 回答是否和标准答案 "语义等价"(比如 RAG 问答、客服回复校验)。

代码:

python 复制代码
from sentence_transformers import SentenceTransformer, util
import numpy as np

# 1. 加载预训练模型(中文优先选 paraphrase-multilingual-MiniLM-L12-v2)
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')

# 2. 定义待校验文本
reference = "魔搭社区是国内最大的AI开源社区,提供海量大模型和工具链"  # 标准答案
prediction1 = "魔搭社区是国内头部AI开源平台,有很多大模型和开发工具"  # 语义一致
prediction2 = "魔搭社区是收费的商业平台,主要做AI模型销售"  # 语义不一致

# 3. 计算句向量 & 余弦相似度(0-1,越高越相似)
def semantic_similarity(text1, text2):
    emb1 = model.encode(text1, convert_to_tensor=True)
    emb2 = model.encode(text2, convert_to_tensor=True)
    # 计算余弦相似度
    similarity = util.cos_sim(emb1, emb2).item()
    return round(similarity, 4)

# 4. 执行校验并输出结果
print("校验1(语义一致):", semantic_similarity(reference, prediction1))  # 输出≈0.92
print("校验2(语义不一致):", semantic_similarity(reference, prediction2))  # 输出≈0.45

# 5. 设定阈值判断是否通过(一般0.7以上为"语义一致")
threshold = 0.7
if semantic_similarity(reference, prediction1) >= threshold:
    print("✅ 回答语义一致,校验通过")
else:
    print("❌ 回答语义不一致,校验失败")

输出结果:

bash 复制代码
Loading weights: 100%|██████████| 199/199 [00:00<00:00, 4055.78it/s]
BertModel LOAD REPORT from: sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2
Key                     | Status     |  | 
------------------------+------------+--+-
embeddings.position_ids | UNEXPECTED |  | 

Notes:
- UNEXPECTED	:can be ignored when loading from different task/architecture; not ok if you expect identical arch.
校验1(语义一致): 0.9093
校验2(语义不一致): 0.6829

语义校验-事实一致性/幻觉检测 todo

校验 AI 回答是否 "编造事实""偏离参考文档"(RAG 核心场景)。

语义校验-混合校验

结合「关键词规则」+「语义相似度」,既校验核心信息,又校验语义一致性。

代码:

python 复制代码
import spacy
from sentence_transformers import SentenceTransformer, util

# 1. 初始化工具
nlp = spacy.load("zh_core_web_sm")  # 中文NLP工具(提取实体)
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')

# 2. 定义校验规则
# 规则1:必须包含核心实体(阿里云、2022、开源)
required_entities = {"阿里云", "2022", "开源"}
# 规则2:语义相似度≥0.7
similarity_threshold = 0.7
# 标准答案
reference = "魔搭社区是阿里云2022年上线的AI开源社区"


# 3. 核心校验函数
def hybrid_semantic_check(answer, reference):
    # 步骤1:实体校验(提取回答中的实体)
    doc = nlp(answer)
    answer_entities = {ent.text for ent in doc.ents} | set(answer.split())  # 实体+关键词
    missing_entities = required_entities - answer_entities
    entity_pass = len(missing_entities) == 0

    # 步骤2:语义相似度校验
    emb1 = model.encode(reference, convert_to_tensor=True)
    emb2 = model.encode(answer, convert_to_tensor=True)
    similarity = util.cos_sim(emb1, emb2).item()
    similarity_pass = similarity >= similarity_threshold

    # 步骤3:综合判断
    total_pass = entity_pass and similarity_pass

    # 返回详细结果
    return {
        "实体校验": {"通过": entity_pass, "缺失实体": list(missing_entities)},
        "语义相似度": {"分数": round(similarity, 4), "通过": similarity_pass},
        "综合校验": "通过" if total_pass else "失败"
    }


# 4. 测试不同回答
answer1 = "阿里云2022年推出了魔搭这个AI开源社区"  # 全符合
answer2 = "腾讯2023年上线了魔搭社区"  # 实体错误
answer3 = "魔搭社区是免费的AI平台"  # 实体缺失

# 5. 执行校验
print("回答1校验结果:", hybrid_semantic_check(answer1, reference))
print("回答2校验结果:", hybrid_semantic_check(answer2, reference))
print("回答3校验结果:", hybrid_semantic_check(answer3, reference))

输出结果:

bash 复制代码
Loading weights: 100%|██████████| 199/199 [00:00<00:00, 4214.34it/s]
BertModel LOAD REPORT from: sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2
Key                     | Status     |  | 
------------------------+------------+--+-
embeddings.position_ids | UNEXPECTED |  | 

Notes:
- UNEXPECTED	:can be ignored when loading from different task/architecture; not ok if you expect identical arch.
回答1校验结果: {'实体校验': {'通过': False, '缺失实体': ['开源', '阿里云', '2022']}, '语义相似度': {'分数': 0.9711, '通过': True}, '综合校验': '失败'}
回答2校验结果: {'实体校验': {'通过': False, '缺失实体': ['开源', '阿里云', '2022']}, '语义相似度': {'分数': 0.6133, '通过': False}, '综合校验': '失败'}
回答3校验结果: {'实体校验': {'通过': False, '缺失实体': ['开源', '阿里云', '2022']}, '语义相似度': {'分数': 0.6621, '通过': False}, '综合校验': '失败'}
相关推荐
果汁华16 分钟前
Browserbase Skills:让 Claude Agent 真正“看见“网页世界
人工智能·python
ZhengEnCi17 分钟前
04-缩放点积注意力代码实现 💻
人工智能·python
HackTwoHub1 小时前
AI大模型网关存在SQL注入、附 POC 复现、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·网络安全·系统安全·网络攻击模型·安全架构
段一凡-华北理工大学1 小时前
【高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章08:多模态数据融合:让数据更聪明
人工智能·python·高炉炼铁·ai赋能·工业智能体·高炉炉温
其实防守也摸鱼2 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
网络工程小王2 小时前
【LangChain 大模型6大调用指南】调用大模型篇
linux·运维·服务器·人工智能·学习
HIT_Weston2 小时前
63、【Agent】【OpenCode】用户对话提示词(示例)
人工智能·agent·opencode
CV-杨帆2 小时前
Phi-4-mini-flash-reasoning 部署安装与推理测试完整记录
人工智能
MediaTea2 小时前
AI 术语通俗词典:C4.5 算法
人工智能·算法
海兰3 小时前
【第27篇】Micrometer + Zipkin
人工智能·spring boot·alibaba·spring ai