大型语言模型(LLM)的“幻觉”(Hallucination)问题是其投入生产环境的最大障碍之一。幻觉指的是模型生成了听起来合理但在事实层面上错误的信息。解决这一问题的最可靠方法是引入外部真值源——知识图谱(KG)。
Freebase,尽管已停止维护,但其结构(实体、属性、值)和概念是构建验证系统的优秀蓝本。本文将深入探讨如何基于这种结构化的知识基础,构建一个实用的LLM事实性检测管道,侧重于如何将非结构化的LLM输出转化为可查询的知识图谱语句。
1. 架构概览:KG验证管道
我们的检测管道涉及三个核心步骤:
1. 事实提取(Fact Extraction):使用NER/关系抽取技术将LLM的自然语言输出转化为(Subject, Predicate, Object)三元组。
2. KG查询(KG Query):将三元组转化为知识图谱的查询语言(如Cypher或SPARQL)。
3. 真值比对(Ground Truth Comparison):比对KG返回的结果与LLM生成的原始事实。
2. 模拟Freebase结构与接口
由于直接操作Freebase的原始巨大数据集不切实际,我们在部署时通常会将其导入到专用的图数据库(如Neo4j、Dgraph),或者使用Wikidata/DBpedia(Freebase的精神继承者)。为了演示核心逻辑,我们首先定义一个Python类来模拟知识图谱的查询接口,它包含 Freebase 典型的实体(MIDs)和属性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 # 模拟知识图谱查询接口
class FreebaseVerifier:
def __init__(self):
# 简化版知识库,模拟Freebase三元组结构: (Subject, Predicate): Object
self.knowledge_base = {
("Barack_Obama", "person.place_of_birth"): "Honolulu",
("The_Beatles", "music.genre"): "Rock and Roll",
("Python_Programming_Language", "creator"): "Guido van Rossum",
("Honolulu", "country"): "USA"
}
def query_fact(self, subject: str, predicate: str) -> str:
"""根据主体和谓词查询KG中的真值"""
key = (subject.replace(" ", "_"), predicate)
return self.knowledge_base.get(key, "")
def verify(self, subject: str, predicate: str, object_val: str) -> bool:
"""验证给定的事实三元组是否为真"""
ground_truth = self.query_fact(subject, predicate)
# 忽略大小写和标点符号进行宽松比对
if ground_truth and ground_truth.lower() == object_val.lower().replace(" ", "_"):
return True
print(f"Verification failed: KG truth for ({subject}, {predicate}) is '{ground_truth}', but LLM stated '{object_val}'.")
return False
3. 从LLM输出到三元组的转换(Infra核心)
LLM生成的句子是自由文本。我们需要一个中间层将文本转化为结构化的(S, P, O)。这一步骤通常使用现有的信息抽取模型(如基于BERT或特定微调的模型)。
示例句: “Barack Obama was born in Maui.”
目标三元组: (Barack Obama, person.place_of_birth, Maui)
我们将使用一个简化的函数来模拟这个抽取过程,重点在于标准化实体和属性的命名,以匹配Freebase/KG的约定(例如,将”出生地”映射到person.place_of_birth)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 import re
# 简化版映射和抽取函数
def extract_and_map_triplet(llm_statement: str) -> tuple:
# 1. 实体识别(模拟):从句子中识别出核心实体
if "Barack Obama" in llm_statement:
subject = "Barack Obama"
elif "The Beatles" in llm_statement:
subject = "The Beatles"
else:
return None, None, None
# 2. 属性映射(模拟):将自然语言的表达映射到KG的Schema
if "born in" in llm_statement.lower():
predicate = "person.place_of_birth"
# 提取宾语(假设在"in"之后)
match = re.search(r"born in ([\w\s]+)[.\s]", llm_statement)
object_val = match.group(1).strip() if match else ""
elif "genre" in llm_statement.lower():
predicate = "music.genre"
object_val = "Rock and Roll" # 假设LLM回答了正确答案
else:
return None, None, None
# 3. 标准化实体名称
return subject, predicate, object_val
4. 运行幻觉检测管道
现在,我们将上述组件整合起来,运行一个完整的验证流程,对比一个真实事实和一个幻觉事实。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 # 初始化验证器
verifier = FreebaseVerifier()
# --- 场景 1: 幻觉事实 ---
llm_output_hallucination = "Barack Obama was born in Maui, which is a common misconception."
subject, predicate, object_val = extract_and_map_triplet(llm_output_hallucination)
if subject:
print(f"\n--- 验证幻觉语句 ---")
print(f"Extracted Triplet: ({subject}, {predicate}, {object_val})")
is_verified = verifier.verify(subject, predicate, object_val)
print(f"Verification Result (Hallucination): {is_verified}")
# --- 场景 2: 真实事实 ---
llm_output_truth = "The creator of the Python Programming Language is Guido van Rossum."
subject, predicate, object_val = extract_and_map_triplet(llm_output_truth)
# 注意:此处我们需要调整 extract_and_map_triplet 来处理这个新场景,或直接提供三元组以聚焦验证逻辑。
# 假设我们已成功抽取三元组:
subject_t, predicate_t, object_val_t = "Python Programming Language", "creator", "Guido van Rossum"
if subject_t:
print(f"\n--- 验证真实语句 ---")
print(f"Extracted Triplet: ({subject_t}, {predicate_t}, {object_val_t})")
is_verified = verifier.verify(subject_t, predicate_t, object_val_t)
print(f"Verification Result (Truth): {is_verified}")
输出示例:
1
2
3
4
5
6
7
8 --- 验证幻觉语句 ---
Extracted Triplet: (Barack Obama, person.place_of_birth, Maui)
Verification failed: KG truth for (Barack Obama, person.place_of_birth) is 'Honolulu', but LLM stated 'Maui'.
Verification Result (Hallucination): False
--- 验证真实语句 ---
Extracted Triplet: (Python Programming Language, creator, Guido van Rossum)
Verification Result (Truth): True
总结
基于Freebase或任何结构化知识图谱构建LLM幻觉检测能力,关键在于两个基础设施环节:一是维护一个高效、可查询的真值知识库(通常是图数据库),二是建立可靠的自然语言到KG查询语言的转换层(信息抽取模型)。这种结构化的验证方法将幻觉检测从主观评价提升为客观、可量化的事实比对。
汤不热吧