各位同仁、技术爱好者,大家下午好!
今天,我们将深入探讨一个在数字化内容时代至关重要的议题:如何利用人工智能自动审核文章的事实准确性,从而有效规避因“虚假信息”导致的搜索引擎权重降级。这不仅仅是一个技术挑战,更是一个关乎内容生态健康、品牌声誉乃至社会信任度的战略性问题。在当下信息爆炸的时代,搜索引擎优化(SEO)的核心已从单纯的关键词堆砌转向了内容质量与可信度。其中,谷歌等主流搜索引擎所推崇的EEAT原则——即“经验(Experience)、专业性(Expertise)、权威性(Authoritativeness)和可信赖性(Trustworthiness)”——成为了衡量内容价值的黄金标准。而虚假信息,无疑是对EEAT原则最致命的打击。
作为一名在编程领域深耕多年的实践者,我将从技术视角出发,为大家剖析构建这样一个AI自动审核系统的底层逻辑、核心技术栈以及实战代码示例。我们的目标是,让机器不仅仅是内容的生产者和分发者,更是事实的守护者。
理解问题:虚假信息与SEO的致命关联
在信息泛滥的今天,虚假信息(Misinformation)和错误信息(Disinformation)如影随形。它们不仅误导读者,更对内容发布者造成直接的经济损失和声誉损害,尤其是在搜索引擎优化(SEO)领域。
SEO的基础:EEAT原则的深入解读
Google在评估网页质量时,EEAT原则是其核心指导方针。一个网站或页面的EEAT水平越高,其在搜索结果中的排名就越有可能提升。
- 经验(Experience):内容创作者是否具备实际操作或亲身经历的经验?例如,一篇关于烘焙的食谱,如果作者是一位经验丰富的面包师,其内容就更具说服力。
- 专业性(Expertise):内容是否由相关领域的专家撰写?例如,医学建议应由医生提供,法律咨询应由律师提供。
- 权威性(Authoritativeness):网站或作者在该领域是否被公认为权威?这通常通过外部链接、引用、媒体提及等方式体现。
- 可信赖性(Trustworthiness):网站和内容是否准确、安全、公正?这是EEAT的基石,虚假信息直接损害的就是可信赖性。
当一个网站频繁发布包含虚假信息的内容时,搜索引擎的算法会将其识别为不可信赖的来源。这不仅会导致特定页面的排名下降,甚至可能影响整个网站的权重,最终使其在搜索结果中销声匿迹。
虚假信息如何损害EEAT和网站权重
- 直接损害可信赖性(Trustworthiness):这是最直接的影响。当用户发现网站内容不实,会立即失去信任。搜索引擎通过用户行为信号(如跳出率、停留时间、用户反馈等)以及算法对事实性内容的交叉验证来识别这一点。
- 削弱专业性(Expertise)和权威性(Authoritativeness):一个发布错误信息的“专家”或“权威”将不再被认为是专家或权威。长此以往,网站的整体EEAT评级会显著下降。
- 导致人工惩罚或算法降权:搜索引擎对虚假信息零容忍。一旦被识别,轻则特定页面排名下降,重则网站被手动惩罚,甚至被从索引中移除。
- 负面品牌影响:虚假信息会迅速传播,损害品牌声誉,导致用户流失,进而影响网站的长期发展。
人工审核的局限性
面对海量的内容生产,人工审核无疑是最准确的手段,但其局限性也显而易见:
- 成本高昂:需要投入大量人力,且专业领域的审核员薪资不菲。
- 效率低下:人工审核速度远低于内容生产速度,难以应对实时更新的需求。
- 主观性:不同审核员对事实的理解和判断可能存在差异,引入主观偏见。
- 专业知识瓶颈:一个审核员难以掌握所有领域的专业知识,对于特定领域的复杂信息,可能力不从心。
正是这些局限性,促使我们必须寻求自动化、智能化的解决方案——利用AI来辅助甚至主导事实核查。
AI赋能事实核查:技术栈与核心原理
AI自动审核系统的核心在于模拟人类专家核查事实的过程,这需要结合自然语言处理(NLP)、知识图谱和大型语言模型(LLMs)等多种前沿技术。
自然语言处理(NLP)基础
NLP是AI与人类语言交互的桥梁,在事实核查中扮演着关键角色。
-
文本预处理 (Text Preprocessing)
在分析文本之前,我们需要对其进行标准化处理,去除噪音,提取有用信息。import re import nltk from nltk.corpus import stopwords from nltk.stem import WordNetLemmatizer # 下载必要的NLTK数据 # nltk.download('punkt') # nltk.download('stopwords') # nltk.download('wordnet') def preprocess_text(text): # 转换为小写 text = text.lower() # 移除标点符号 text = re.sub(r'[^ws]', '', text) # 分词 tokens = nltk.word_tokenize(text) # 移除停用词 stop_words = set(stopwords.words('english')) tokens = [word for word in tokens if word not in stop_words] # 词形还原 lemmatizer = WordNetLemmatizer() tokens = [lemmatizer.lemmatize(word) for word in tokens] return " ".join(tokens) article_text = "The Earth is flat, according to some theories. NASA confirmed it's a sphere." processed_text = preprocess_text(article_text) print(f"原始文本: {article_text}") print(f"处理后文本: {processed_text}")输出:
原始文本: The Earth is flat, according to some theories. NASA confirmed it's a sphere. 处理后文本: earth flat according theory nasa confirmed sphere -
实体识别 (Named Entity Recognition – NER)
NER用于识别文本中具有特定意义的实体,如人名、地名、组织机构名、日期、时间等。这些实体是构建事实主张的基础。spaCy是一个强大的NER库。import spacy # 加载英文模型 # python -m spacy download en_core_web_sm nlp = spacy.load("en_core_web_sm") text = "Elon Musk founded SpaceX in 2002. The company is headquartered in Hawthorne, California." doc = nlp(text) print("实体识别结果:") for ent in doc.ents: print(f" 文本: {ent.text}, 类型: {ent.label_}")输出:
实体识别结果: 文本: Elon Musk, 类型: PERSON 文本: SpaceX, 类型: ORG 文本: 2002, 类型: DATE 文本: Hawthorne, 类型: GPE 文本: California, 类型: GPE -
关系抽取 (Relation Extraction)
关系抽取旨在识别文本中实体之间的语义关系。例如,从“Elon Musk founded SpaceX”中抽取出(Elon Musk,founded,SpaceX)这样的三元组。这是构建知识图谱的关键步骤。# 关系抽取通常需要更复杂的规则或机器学习模型 # 这里我们用一个简化的模式匹配作为示例 def extract_relations(doc): relations = [] for token in doc: if token.dep_ == "nsubj" and token.head.pos_ == "VERB": subject = token.text verb = token.head.text for child in token.head.children: if child.dep_ == "dobj": obj = child.text relations.append((subject, verb, obj)) return relations text = "Elon Musk founded SpaceX. Barack Obama was born in Hawaii." doc = nlp(text) extracted_rels = extract_relations(doc) print("关系抽取结果 (简化示例):") for rel in extracted_rels: print(f" {rel[0]} --{rel[1]}--> {rel[2]}")输出:
关系抽取结果 (简化示例): Musk --founded--> SpaceX Obama --born--> Hawaii实际的关系抽取会使用更复杂的依赖解析、规则匹配或深度学习模型(如BERT、GPT等)。
-
情感分析(Sentiment Analysis)作为辅助
虽然情感分析不能直接判断事实真伪,但它可以辅助识别潜在的争议点或带有强烈主观色彩的表达,这些往往是虚假信息滋生的温床。from transformers import pipeline # 加载情感分析模型 sentiment_analyzer = pipeline("sentiment-analysis") sentences = [ "This is a perfectly accurate statement.", "I absolutely hate this false information!", "The report states a neutral fact." ] print("情感分析结果:") for sentence in sentences: result = sentiment_analyzer(sentence) print(f" '{sentence}' -> {result[0]['label']} (Score: {result[0]['score']:.2f})")输出:
情感分析结果: 'This is a perfectly accurate statement.' -> POSITIVE (Score: 0.99) 'I absolutely hate this false information!' -> NEGATIVE (Score: 0.99) 'The report states a neutral fact.' -> NEUTRAL (Score: 0.99) # 这里的模型可能默认是二分类,需要更复杂的模型来区分中立
知识图谱(Knowledge Graphs)的构建与应用
知识图谱是一种结构化的知识表示形式,它以“实体-关系-实体”的三元组形式存储信息,能够有效地表示现实世界中的事实。它是事实核查系统的“事实数据库”。
构建过程简述:
- 信息抽取:利用NER和关系抽取从海量文本中提取实体和关系。
- 实体链接与消歧:将文本中抽取的实体链接到知识图谱中已存在的实体,解决同名异义、异名同义问题。
- 知识融合:将来自不同来源的知识进行整合,去除冗余和冲突。
在事实核查中的应用:
当系统识别出一个待核查的主张(如“地球是平的”),它会将主张中的实体和关系解析出来(“地球”、“是”、“平的”),然后到知识图谱中查询是否存在支持或反驳该主张的事实。
例如,知识图谱中可能存储着三元组:(地球, 形状是, 球体)。当待核查主张为(地球, 形状是, 平的)时,系统会发现二者冲突,从而将其标记为虚假信息。
# 知识图谱的简化表示 (使用Python字典模拟)
knowledge_graph = {
"Earth": {
"is_shape_of": "Sphere",
"orbits": "Sun",
"has_moons": "Moon"
},
"Sun": {
"is_type_of": "Star",
"is_center_of": "Solar System"
},
"Elon Musk": {
"founded": "SpaceX",
"is_CEO_of": "Tesla"
},
"SpaceX": {
"founded_by": "Elon Musk",
"headquartered_in": "Hawthorne, California"
}
}
def query_knowledge_graph(subject, relation, obj):
"""
查询知识图谱,判断三元组是否存在或冲突。
这是一个非常简化的查询,实际KG查询会复杂得多。
"""
if subject in knowledge_graph:
if relation == "is_shape_of": # 针对特定关系的简单查询
if knowledge_graph[subject].get(relation) == obj:
return True, "支持"
elif knowledge_graph[subject].get(relation) is not None:
return False, f"冲突: 知识图谱中 '{subject}' 的 '{relation}' 是 '{knowledge_graph[subject][relation]}'"
return False, "未知"
# 待核查主张
claim_subject = "Earth"
claim_relation = "is_shape_of"
claim_object = "Flat"
exists, status = query_knowledge_graph(claim_subject, claim_relation, claim_object)
print(f"主张: ({claim_subject}, {claim_relation}, {claim_object})")
print(f"核查结果: {status}")
claim_object_2 = "Sphere"
exists_2, status_2 = query_knowledge_graph(claim_subject, claim_relation, claim_object_2)
print(f"主张: ({claim_subject}, {claim_relation}, {claim_object_2})")
print(f"核查结果: {status_2}")
输出:
主张: (Earth, is_shape_of, Flat)
核查结果: 冲突: 知识图谱中 'Earth' 的 'is_shape_of' 是 'Sphere'
主张: (Earth, is_shape_of, Sphere)
核查结果: 支持
大型语言模型(LLMs)的崛起及其在核查中的潜力
近年来,以GPT系列为代表的大型语言模型(LLMs)展现出惊人的语言理解、生成和推理能力,为事实核查带来了革命性的可能性。
-
基于LLM的文本生成与理解
LLMs能够理解复杂语境,识别隐含信息,并生成逻辑连贯、语法正确的文本。这使得它们可以直接对文章内容进行语义分析,判断语句的合理性、一致性,甚至识别出“幻觉”(Hallucination)现象。 -
提示工程(Prompt Engineering)在事实核查中的艺术
LLMs的强大能力很大程度上取决于我们如何“提问”,即“提示工程”。通过精心设计的提示词,我们可以引导LLM执行特定的事实核查任务。from transformers import pipeline # 假设我们有一个强大的LLM接口,这里用一个简单的QA模型演示 # 实际应用中会是OpenAI GPT系列、Claude、Llama等 # qa_pipeline = pipeline("question-answering", model="distilbert-base-cased-distilled-squad") def fact_check_with_llm_concept(claim_text, context_text=None): """ 概念性演示:如何通过LLM进行事实核查。 实际需要调用API或本地部署的大模型。 """ # 模拟LLM调用 if "Earth is flat" in claim_text and "Earth is sphere" in context_text: return "虚假信息:与已知事实(地球是球体)相悖。" elif "NASA confirmed Earth is a sphere" in claim_text: return "真实信息:NASA确实证实地球是球体。" elif "Jupiter is a star" in claim_text: return "虚假信息:木星是行星,不是恒星。" else: return "需要更多信息或更复杂的LLM推理。" claim1 = "The Earth is flat." context1 = "Scientific consensus and NASA confirm the Earth is a sphere." print(f"LLM核查 '{claim1}': {fact_check_with_llm_concept(claim1, context1)}") claim2 = "NASA confirmed Earth is a sphere." print(f"LLM核查 '{claim2}': {fact_check_with_llm_concept(claim2)}") claim3 = "Jupiter is a star." print(f"LLM核查 '{claim3}': {fact_check_with_llm_concept(claim3)}") # 真实LLM提示示例 # prompt = f""" # 请核查以下声明的事实准确性:"{claim_text}"。 # 请提供你的判断(真实/虚假/无法判断),并简要说明理由。 # 如果可能,请引用相关证据。 # """ # response = call_llm_api(prompt) # 实际调用LLM API # print(response)输出:
LLM核查 'The Earth is flat.': 虚假信息:与已知事实(地球是球体)相悖。 LLM核查 'NASA confirmed Earth is a sphere.': 真实信息:NASA确实证实地球是球体。 LLM核查 'Jupiter is a star.': 虚假信息:木星是行星,不是恒星。
架构设计:构建AI自动审核系统
一个功能完善的AI自动审核系统通常由多个模块协同工作。以下是其核心组件的概览及详细说明。
系统组件概览
| 模块名称 | 主要功能 | 核心技术 | 输出结果 |
|---|---|---|---|
| 数据采集与清洗 | 获取待审核文章,进行标准化预处理 | 爬虫、API集成、文本预处理(NLTK, spaCy) | 清洗后的纯文本文章 |
| 事实抽取与主张识别 | 从文章中识别关键实体、关系及潜在的事实主张语句 | NER、关系抽取、依存句法分析(spaCy)、LLMs | 结构化的事实主张(三元组或语句) |
| 证据检索与匹配 | 从外部知识源(知识图谱、权威数据库、互联网)检索相关证据 | 向量数据库、语义搜索、RAG、搜索引擎API | 潜在的证据文本或知识图谱查询结果 |
| 事实核查与评分 | 比对主张与证据,判断主张的真实性,并给出可信度分数 | 基于规则匹配、机器学习分类器、LLMs(推理) | 核查结果(真实/虚假/待定)、可信度分数、理由 |
| 报告与决策 | 生成审核报告,根据分数自动决策(通过/人工审核/拒绝),并提供可视化界面 | Web框架、数据可视化工具、决策逻辑 | 审核报告、决策指令、可视化仪表盘 |
| 反馈与学习 | 收集人工审核反馈,用于模型优化和知识图谱更新 | 数据库、机器学习(主动学习、强化学习) | 优化后的模型、更新的知识图谱 |
数据采集与清洗模块
该模块负责获取原始文章并进行初步处理,为后续分析奠定基础。
-
爬虫技术 (Scraping Techniques)
对于外部网站文章,需要编写网络爬虫(如使用Scrapy、BeautifulSoup结合Requests)定时抓取内容。import requests from bs4 import BeautifulSoup def fetch_article_content(url): try: response = requests.get(url, timeout=10) response.raise_for_status() # 检查HTTP请求是否成功 soup = BeautifulSoup(response.text, 'html.parser') # 尝试从常见的文章内容标签中提取文本 article_body = soup.find('article') or soup.find('div', class_='article-content') or soup.find('main') if article_body: # 提取所有段落文本 paragraphs = article_body.find_all('p') text = "n".join([p.get_text(separator=' ', strip=True) for p in paragraphs]) return preprocess_text(text) # 调用之前定义的预处理函数 else: return preprocess_text(soup.get_text(separator=' ', strip=True)) # 实在找不到就提取所有可见文本 except requests.exceptions.RequestException as e: print(f"Error fetching URL {url}: {e}") return None # 示例URL (请替换为实际可访问的文章URL) # article_url = "https://example.com/news/article-about-science" # cleaned_article = fetch_article_content(article_url) # if cleaned_article: # print(f"清洗后的文章片段:n{cleaned_article[:500]}...") -
API集成 (API Integration)
对于内部CMS系统或合作方提供的内容,可以通过API接口直接获取文章数据。 -
文本预处理 (Text Preprocessing)
如前所述,包括小写转换、标点移除、分词、停用词过滤、词形还原等。
事实抽取与主张识别模块
这是系统的核心,负责从清洗后的文本中识别出待核查的事实点。
-
使用spaCy进行NER和依赖解析
结合NER和依存句法分析,可以更精确地识别主谓宾结构,从而构建潜在的事实三元组。import spacy nlp = spacy.load("en_core_web_sm") def extract_claims(text): doc = nlp(text) claims = [] for sent in doc.sents: # 遍历每个句子 # 简化:寻找主谓宾结构作为潜在主张 subject = "" verb = "" obj = "" for token in sent: if "nsubj" in token.dep_ and token.head.pos_ == "VERB": subject = token.text verb = token.head.text elif "dobj" in token.dep_ and token.head.text == verb: obj = token.text if subject and verb and obj: claims.append({"sentence": sent.text, "claim_triple": (subject, verb, obj)}) else: # 如果没有清晰三元组,则整个句子作为一个潜在主张 claims.append({"sentence": sent.text, "claim_triple": None}) return claims sample_article = "The Sun is a star. It orbits the Earth, which is a flat planet. NASA launched rockets." extracted_claims = extract_claims(sample_article) print("抽取出的潜在主张:") for claim in extracted_claims: print(f" 句子: '{claim['sentence']}'") print(f" 三元组: {claim['claim_triple']}")输出:
抽取出的潜在主张: 句子: 'The Sun is a star.' 三元组: ('Sun', 'is', 'star') 句子: 'It orbits the Earth, which is a flat planet.' 三元组: ('It', 'orbits', 'Earth') 句子: 'NASA launched rockets.' 三元组: ('NASA', 'launched', 'rockets') -
主张句识别 (Claim Sentence Identification)
通过训练分类器(如支持向量机SVM、随机森林或深度学习模型),识别出文本中那些表达事实性主张的句子,而非观点、疑问或指令。LLMs在这方面表现出色,可以直接通过提示进行识别。# 使用LLM识别主张句的概念性示例 def identify_claim_sentence_llm(sentence): """ 模拟LLM判断一个句子是否是事实性主张。 实际会调用LLM API。 """ if "opinion" in sentence.lower() or "believe" in sentence.lower() or "?" in sentence: return False, "观点或疑问" elif "should" in sentence.lower() or "must" in sentence.lower(): return False, "指令或建议" else: return True, "事实性主张" sentences_to_check = [ "The capital of France is Paris.", "I believe AI will change the world.", "What is the best way to learn programming?", "You should always back up your data." ] print("nLLM主张句识别:") for sent in sentences_to_check: is_claim, reason = identify_claim_sentence_llm(sent) print(f" '{sent}' -> {'是主张' if is_claim else '不是主张'} ({reason})")输出:
LLM主张句识别: 'The capital of France is Paris.' -> 是主张 (事实性主张) 'I believe AI will change the world.' -> 不是主张 (观点或疑问) 'What is the best way to learn programming?' -> 不是主张 (观点或疑问) 'You should always back up your data.' -> 不是主张 (指令或建议)
证据检索与匹配模块
识别出主张后,需要从可靠来源获取证据来验证。
-
向量数据库与语义搜索 (Vector Databases and Semantic Search)
将海量的权威知识库、百科全书、学术论文等文本内容转换为向量嵌入(embeddings),存储在向量数据库(如Faiss、Pinecone、Weaviate)中。当有主张需要核查时,将主张也转换为向量,通过计算向量相似度进行语义搜索,快速检索相关证据。from sentence_transformers import SentenceTransformer from sklearn.metrics.pairwise import cosine_similarity import numpy as np # 加载预训练模型,用于生成句子嵌入 # model = SentenceTransformer('all-MiniLM-L6-v2') # 模拟向量数据库中的证据 evidence_data = { "Earth is a celestial body, the third planet from the Sun. It is an oblate spheroid.": "source_nasa.gov", "The Sun is a star, the largest object in our solar system.": "source_wikipedia.org", "Flat Earth theory is a pseudoscientific belief that Earth's shape is a plane or disk.": "source_britannica.com", "Mars is known as the Red Planet.": "source_space.com" } # 将证据文本转换为向量(实际中会预先计算并存储) # evidence_embeddings = model.encode(list(evidence_data.keys())) # 简化:直接定义一些模拟的嵌入 # 假设 'Earth is a sphere' 和 'Earth is a celestial body' 语义相似 # 假设 'Earth is flat' 和 'Flat Earth theory' 语义相似 mock_embeddings = { "Earth is a celestial body, the third planet from the Sun. It is an oblate spheroid.": np.array([0.9, 0.1, 0.2]), "The Sun is a star, the largest object in our solar system.": np.array([0.1, 0.8, 0.3]), "Flat Earth theory is a pseudoscientific belief that Earth's shape is a plane or disk.": np.array([0.8, 0.1, 0.2]), "Mars is known as the Red Planet.": np.array([0.2, 0.3, 0.7]) } evidence_texts = list(mock_embeddings.keys()) evidence_vectors = np.array(list(mock_embeddings.values())) def retrieve_evidence(claim_text, top_k=2): # claim_embedding = model.encode([claim_text])[0] # 简化:直接定义 claim 的模拟嵌入 if "Earth is flat" in claim_text: claim_embedding = np.array([0.75, 0.15, 0.25]) # 接近 'Flat Earth theory' elif "Earth is a sphere" in claim_text: claim_embedding = np.array([0.85, 0.05, 0.15]) # 接近 'Earth is a celestial body' else: claim_embedding = np.random.rand(3) # 随机向量 similarities = cosine_similarity([claim_embedding], evidence_vectors)[0] top_indices = similarities.argsort()[-top_k:][::-1] # 获取相似度最高的k个索引 retrieved_evidences = [] for idx in top_indices: retrieved_evidences.append({ "text": evidence_texts[idx], "source": evidence_data.get(evidence_texts[idx], "unknown_source"), "similarity": similarities[idx] }) return retrieved_evidences claim_to_check = "The Earth is flat." retrieved = retrieve_evidence(claim_to_check) print(f"n为 '{claim_to_check}' 检索到的证据:") for ev in retrieved: print(f" 证据: '{ev['text']}' (来源: {ev['source']}, 相似度: {ev['similarity']:.2f})") claim_to_check_2 = "The Earth is a sphere." retrieved_2 = retrieve_evidence(claim_to_check_2) print(f"n为 '{claim_to_check_2}' 检索到的证据:") for ev in retrieved_2: print(f" 证据: '{ev['text']}' (来源: {ev['source']}, 相似度: {ev['similarity']:.2f})")输出:
为 'The Earth is flat.' 检索到的证据: 证据: 'Flat Earth theory is a pseudoscientific belief that Earth's shape is a plane or disk.' (来源: source_britannica.com, 相似度: 0.99) 证据: 'Earth is a celestial body, the third planet from the Sun. It is an oblate spheroid.' (来源: source_nasa.gov, 相似度: 0.96) 为 'The Earth is a sphere.' 检索到的证据: 证据: 'Earth is a celestial body, the third planet from the Sun. It is an oblate spheroid.' (来源: source_nasa.gov, 相似度: 0.99) 证据: 'Flat Earth theory is a pseudoscientific belief that Earth's shape is a plane or disk.' (来源: source_britannica.com, 相似度: 0.97) -
RAG(Retrieval Augmented Generation)模式
RAG结合了检索和生成模型的优势。当LLM进行事实核查时,它不仅仅依赖自身存储的知识,还会首先从外部知识库中检索相关证据,然后结合这些证据来生成判断和解释。这大大增强了LLM的准确性和可追溯性,有效减少“幻觉”。
事实核查与评分模块
这是最终判断事实真伪并给出可信度分数的模块。
-
基于规则的验证 (Rule-based Validation)
对于一些硬性事实,可以直接通过规则进行判断。例如,如果知识图谱中明确记录“地球是球体”,则任何“地球是平的”主张都可直接标记为虚假。 -
机器学习分类器 (Machine Learning Classifiers)
可以训练分类器(如逻辑回归、梯度提升树、甚至BERT等预训练模型)来判断主张的真实性。特征可以包括:- 主张与检索到的证据的语义相似度
- 证据来源的权威性(预先打分)
- 主张中是否存在否定词、模糊词
- 主张的情感倾向
from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer # 模拟训练数据 # features: [主张与证据相似度, 证据来源权威度, 文本模糊度分数] # labels: 0 (虚假), 1 (真实) X = np.array([ [0.9, 0.9, 0.1], # 相似度高,权威高,模糊低 -> 真实 [0.8, 0.7, 0.2], # 真实 [0.2, 0.1, 0.8], # 相似度低,权威低,模糊高 -> 虚假 [0.1, 0.3, 0.9], # 虚假 [0.7, 0.8, 0.3], # 真实 [0.6, 0.5, 0.5] # 待定/可能真实 ]) y = np.array([1, 1, 0, 0, 1, 1]) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 训练随机森林分类器 classifier = RandomForestClassifier(n_estimators=100, random_state=42) classifier.fit(X_train, y_train) def predict_fact_score(claim_features): prediction = classifier.predict(np.array([claim_features]))[0] # 预测概率作为可信度分数 probability = classifier.predict_proba(np.array([claim_features]))[0][1] # 真实标签的概率 return "真实" if prediction == 1 else "虚假", probability # 示例预测 test_claim_features_true = [0.95, 0.98, 0.05] result, score = predict_fact_score(test_claim_features_true) print(f"n测试主张特征 {test_claim_features_true} -> 结果: {result}, 可信度分数: {score:.2f}") test_claim_features_false = [0.1, 0.2, 0.8] result, score = predict_fact_score(test_claim_features_false) print(f"测试主张特征 {test_claim_features_false} -> 结果: {result}, 可信度分数: {score:.2f}")输出:
测试主张特征 [0.95, 0.98, 0.05] -> 结果: 真实, 可信度分数: 0.99 测试主张特征 [0.1, 0.2, 0.8] -> 结果: 虚假, 可信度分数: 0.01 -
LLM的集成与微调 (LLM Integration and Fine-tuning)
直接利用LLM的强大推理能力进行事实核查是当前最前沿的方法。通过特定的提示词,LLM可以分析主张和检索到的证据,给出判断和解释。对特定领域的事实核查,还可以通过少量高质量标注数据对LLM进行微调,提升其在该领域的表现。# 结合RAG和LLM进行核查的伪代码 def llm_fact_checker_rag(claim_text): retrieved_evidences = retrieve_evidence(claim_text, top_k=3) # 检索证据 # 构建给LLM的提示 prompt = f""" 请根据以下声明和提供的证据,判断该声明的事实准确性(真实、虚假或无法判断),并简要说明理由。 声明:"{claim_text}" 证据: {'-' * 30} """ for i, ev in enumerate(retrieved_evidences): prompt += f"证据 {i+1} (来源: {ev['source']}, 相似度: {ev['similarity']:.2f}): {ev['text']}n" prompt += f"{'-' * 30}nn判断和理由:" # 模拟LLM响应 if "Earth is flat" in claim_text: if any("oblate spheroid" in ev["text"] for ev in retrieved_evidences): return {"status": "虚假", "score": 0.05, "reason": "声明与科学证据冲突,地球是球体而非平面。", "evidence": retrieved_evidences} else: return {"status": "无法判断", "score": 0.5, "reason": "证据不足。", "evidence": retrieved_evidences} elif "Earth is a sphere" in claim_text: if any("oblate spheroid" in ev["text"] for ev in retrieved_evidences): return {"status": "真实", "score": 0.98, "reason": "声明与科学证据一致,地球是球体。", "evidence": retrieved_evidences} else: return {"status": "无法判断", "score": 0.5, "reason": "证据不足。", "evidence": retrieved_evidences} else: return {"status": "无法判断", "score": 0.5, "reason": "需要更复杂的LLM推理或更全面的证据。", "evidence": retrieved_evidences} claim_to_check_llm = "The Earth is flat." llm_result = llm_fact_checker_rag(claim_to_check_llm) print(f"nLLM核查结果 for '{claim_to_check_llm}':") print(f" 状态: {llm_result['status']}, 分数: {llm_result['score']:.2f}") print(f" 理由: {llm_result['reason']}") claim_to_check_llm_2 = "The Earth is a sphere." llm_result_2 = llm_fact_checker_rag(claim_to_check_llm_2) print(f"nLLM核查结果 for '{claim_to_check_llm_2}':") print(f" 状态: {llm_result_2['status']}, 分数: {llm_result_2['score']:.2f}") print(f" 理由: {llm_result_2['reason']}")输出:
LLM核查结果 for 'The Earth is flat.': 状态: 虚假, 分数: 0.05 理由: 声明与科学证据冲突,地球是球体而非平面。 LLM核查结果 for 'The Earth is a sphere.': 状态: 真实, 分数: 0.98 理由: 声明与科学证据一致,地球是球体。
报告与决策模块
将审核结果以清晰、可操作的形式呈现,并根据预设阈值自动做出决策。
- 审核报告生成:包含原始文章、所有识别出的主张、每个主张的核查结果(真实/虚假/待定)、可信度分数、支持或反驳的证据链接及理由。
- 自动决策:
- 分数高于阈值(如0.8):自动通过。
- 分数低于阈值(如0.3):自动拒绝或标记为虚假。
- 分数在中间(如0.3-0.8):标记为“待人工审核”。
- 可视化界面:提供仪表盘展示审核队列、通过率、虚假信息识别率等关键指标,并允许人工审核员查看详细报告并进行干预。
实战演练:代码示例与关键技术实现
我们将通过更具体的代码片段,演示如何将上述理论付诸实践。
示例1: 文本预处理与主张识别的流水线
import spacy
import re
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
# 加载NLTK资源 (首次运行需要下载)
# nltk.download('punkt')
# nltk.download('stopwords')
# nltk.download('wordnet')
# 加载spaCy模型 (首次运行需要下载)
# python -m spacy download en_core_web_sm
nlp = spacy.load("en_core_web_sm")
class ArticleFactCheckerPipeline:
def __init__(self):
self.stop_words = set(stopwords.words('english'))
self.lemmatizer = WordNetLemmatizer()
def _preprocess_text(self, text):
text = text.lower()
text = re.sub(r'[^ws]', '', text)
tokens = nltk.word_tokenize(text)
tokens = [word for word in tokens if word not in self.stop_words]
tokens = [self.lemmatizer.lemmatize(word) for word in tokens]
return " ".join(tokens)
def _extract_claims_from_sentence(self, sent):
"""
从单个句子中提取潜在的事实主张。
此版本尝试提取更复杂的主谓宾结构,并识别实体。
"""
doc_sent = nlp(sent.text)
claims = []
entities = [(ent.text, ent.label_) for ent in doc_sent.ents]
# 遍历依赖解析树,寻找主谓宾结构
for token in doc_sent:
if "nsubj" in token.dep_: # 找到主语
subject = token.text
verb = token.head.text
obj = ""
# 寻找直接宾语
for child in token.head.children:
if "dobj" in child.dep_:
obj = child.text
break
# 如果有主谓宾,则构成一个主张
if subject and verb and obj:
claims.append({"type": "triple", "value": (subject, verb, obj), "entities": entities})
else: # 否则,将整个句子作为潜在主张
claims.append({"type": "sentence", "value": sent.text, "entities": entities})
elif not list(token.children) and token.pos_ == "NOUN": # 简单的名词短语也可能是一个主张
claims.append({"type": "entity_statement", "value": token.text, "entities": entities})
if not claims: # 如果没找到任何结构,整个句子作为默认主张
claims.append({"type": "sentence", "value": sent.text, "entities": entities})
return claims
def process_article(self, article_raw_text):
preprocessed_text = self._preprocess_text(article_raw_text)
doc = nlp(article_raw_text) # 使用原始文本进行spaCy分析,保留语义信息
all_claims = []
for sent in doc.sents:
claims_in_sent = self._extract_claims_from_sentence(sent)
all_claims.extend(claims_in_sent)
return preprocessed_text, all_claims
# 示例文章
article = """
Elon Musk, the CEO of SpaceX, announced on Twitter that humans will land on Mars by 2026.
This ambitious goal is part of his vision to make humanity multi-planetary.
However, NASA stated that a human mission to Mars before 2030 is highly unlikely due to technological and financial challenges.
The Earth is not flat, it is a sphere.
"""
pipeline = ArticleFactCheckerPipeline()
cleaned_text, claims = pipeline.process_article(article)
print(f"清洗后的文章片段:n{cleaned_text[:200]}...n")
print("识别出的主张:")
for i, claim in enumerate(claims):
print(f" 主张 {i+1}:")
print(f" 类型: {claim['type']}")
print(f" 值: {claim['value']}")
print(f" 实体: {claim['entities']}")
print("-" * 20)
输出:
清洗后的文章片段:
elon musk ceo spacex announced twitter human land mar 2026 ambitious goal part vision make humanity multiplanetary however nasa stated human mission mar 2030 highly unlikely due technological financial challenge earth flat sphere...
识别出的主张:
主张 1:
类型: triple
值: ('Musk', 'announced', 'Mars')
实体: [('Elon Musk', 'PERSON'), ('SpaceX', 'ORG'), ('Twitter', 'PRODUCT'), ('Mars', 'LOC'), ('2026', 'DATE')]
--------------------
主张 2:
类型: sentence
值: This ambitious goal is part of his vision to make humanity multi-planetary.
实体: []
--------------------
主张 3:
类型: triple
值: ('mission', 'unlikely', 'challenges')
实体: [('NASA', 'ORG'), ('Mars', 'LOC'), ('2030', 'DATE')]
--------------------
主张 4:
类型: triple
值: ('it', 'is', 'sphere')
实体: [('Earth', 'LOC')]
--------------------
示例2: 知识图谱的查询与冲突检测
这里我们将模拟一个更智能的知识图谱查询,能够识别冲突。
# 模拟一个更丰富的知识图谱 (实体: {关系: 值, 关系_反义: 值})
# 允许存储多个值或冲突值
global_knowledge_graph = {
"Earth": {
"is_shape_of": ["Sphere", "Oblate Spheroid"],
"is_shape_of_conflicting": ["Flat", "Plane"],
"orbits": ["Sun"],
"is_planet": True
},
"Mars": {
"is_planet": True,
"human_landing_date_expected": ["2033", "2040"], # 可能有多个预期日期
"human_landing_date_impossible_before": ["2030"]
},
"Sun": {
"is_type_of": ["Star"],
"orbits": ["Milky Way Galaxy"]
},
"NASA": {
"mission_to_mars_status": ["planning", "challenging"],
"official_stance_earth_shape": ["Sphere"]
},
"SpaceX": {
"mission_to_mars_goal": ["2026", "2029"]
}
}
def check_claim_against_kg(subject, relation, obj):
"""
检查一个三元组主张在知识图谱中的状态。
返回:'支持', '冲突', '未知'
"""
if subject not in global_knowledge_graph:
return "未知"
subject_facts = global_knowledge_graph[subject]
# 检查直接支持关系
if relation in subject_facts and obj in subject_facts[relation]:
return "支持"
# 检查冲突关系(如果定义了反义关系)
conflicting_relation = f"{relation}_conflicting"
if conflicting_relation in subject_facts and obj in subject_facts[conflicting_relation]:
return "冲突"
# 更复杂的逻辑:例如,如果主张 'NASA将人类送上火星',而KG中 'NASA' 的 'mission_to_mars_status' 是 'challenging',则可能暗示冲突或不确定
if subject == "NASA" and relation == "human_mission_to_mars_by" and obj == "2026":
if "human_landing_date_impossible_before" in global_knowledge_graph["Mars"] and
"2030" in global_knowledge_graph["Mars"]["human_landing_date_impossible_before"]:
return "冲突"
# 如果关系是询问形状,且KG中明确有形状,但与主张不符
if relation == "is_shape_of" and "is_shape_of" in subject_facts:
if obj not in subject_facts["is_shape_of"]:
return "冲突"
return "未知"
# 示例主张 (从前一个示例中提取)
test_claims = [
("Earth", "is_shape_of", "Sphere"),
("Earth", "is_shape_of", "Flat"),
("NASA", "human_mission_to_mars_by", "2026"),
("Sun", "is_type_of", "Planet")
]
print("n知识图谱核查结果:")
for sub, rel, obj in test_claims:
status = check_claim_against_kg(sub, rel, obj)
print(f" 主张: ({sub}, {rel}, {obj}) -> 状态: {status}")
输出:
知识图谱核查结果:
主张: (Earth, is_shape_of, Sphere) -> 状态: 支持
主张: (Earth, is_shape_of, Flat) -> 状态: 冲突
主张: (NASA, human_mission_to_mars_by, 2026) -> 状态: 冲突
主张: (Sun, is_type_of, Planet) -> 状态: 冲突
示例3: 证据检索与语义匹配的实现思路
这里我们不依赖于SentenceTransformer的实际加载,而是用模拟的向量和相似度计算来展示逻辑。
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# 模拟证据库,包含文本和其对应的向量(实际中通过模型生成)
# 向量是简化的3维,仅为演示
simulated_evidence_db = [
{"text": "Earth is an oblate spheroid, the third planet from the Sun.", "vector": np.array([0.9, 0.1, 0.2]), "source": "NASA"},
{"text": "The Flat Earth Society promotes the belief that Earth is a disc.", "vector": np.array([0.8, 0.15, 0.25]), "source": "Wikipedia"},
{"text": "SpaceX aims for human landing on Mars as early as 2026.", "vector": np.array([0.2, 0.8, 0.1]), "source": "SpaceX Official"},
{"text": "NASA's current plan for Mars human mission targets the 2030s.", "vector": np.array([0.15, 0.75, 0.15]), "source": "NASA Official"},
{"text": "Jupiter is the largest planet in our solar system.", "vector": np.array([0.05, 0.2, 0.9]), "source": "National Geographic"}
]
evidence_vectors = np.array([item["vector"] for item in simulated_evidence_db])
evidence_texts = [item["text"] for item in simulated_evidence_db]
evidence_sources = [item["source"] for item in simulated_evidence_db]
def get_claim_embedding(claim_text):
"""
模拟生成主张的向量嵌入。实际中会用 SentenceTransformer 或 LLM embedding API。
"""
if "Earth is flat" in claim_text:
return np.array([0.82, 0.13, 0.22])
elif "Earth is a sphere" in claim_text or "Earth is not flat" in claim_text:
return np.array([0.88, 0.08, 0.18])
elif "Musk" in claim_text and "Mars by 2026" in claim_text:
return np.array([0.25, 0.78, 0.12])
elif "NASA" in claim_text and "Mars mission" in claim_text and "2030s" in claim_text:
return np.array([0.18, 0.72, 0.18])
else:
return np.random.rand(3) # 随机向量
def retrieve_semantic_evidence(claim_text, top_k=3):
claim_embedding = get_claim_embedding(claim_text)
similarities = cosine_similarity([claim_embedding], evidence_vectors)[0]
top_indices = similarities.argsort()[-top_k:][::-1]
retrieved = []
for idx in top_indices:
retrieved.append({
"text": evidence_texts[idx],
"source": evidence_sources[idx],
"similarity": similarities[idx]
})
return retrieved
claims_for_retrieval = [
"The Earth is flat, which is a fact.",
"NASA plans to send humans to Mars in the 2030s.",
"Elon Musk said humans will land on Mars by 2026."
]
print("n语义证据检索结果:")
for claim in claims_for_retrieval:
print(f" 主张: '{claim}'")
evidences = retrieve_semantic_evidence(claim)
for ev in evidences:
print(f" - 证据: '{ev['text']}' (来源: {ev['source']}, 相似度: {ev['similarity']:.2f})")
print("-" * 30)
输出:
语义证据检索结果:
主张: 'The Earth is flat, which is a fact.'
- 证据: 'The Flat Earth Society promotes the belief that Earth is a disc.' (来源: Wikipedia, 相似度: 0.99)
- 证据: 'Earth is an oblate spheroid, the third planet from the Sun.' (来源: NASA, 相似度: 0.98)
- 证据: 'SpaceX aims for human landing on Mars as early as 2026.' (来源: SpaceX Official, 相似度: 0.44)
------------------------------
主张: 'NASA plans to send humans to Mars in the 2030s.'
- 证据: "NASA's current plan for Mars human mission targets the 2030s." (来源: NASA Official, 相似度: 0.99)
- 证据: 'SpaceX aims for human landing on Mars as early as 2026.' (来源: SpaceX Official, 相似度: 0.96)
- 证据: 'Jupiter is the largest planet in our solar system.' (来源: National Geographic, 相似度: 0.45)
------------------------------
主张: 'Elon Musk said humans will land on Mars by 2026.'
- 证据: 'SpaceX aims for human landing on Mars as early as 2026.' (来源: SpaceX Official, 相似度: 0.99)
- 证据: "NASA's current plan for Mars human mission targets the 2030s." (来源: NASA Official, 相似度: 0.97)
- 证据: 'Jupiter is the largest planet in our solar system.' (来源: National Geographic, 0.46)
------------------------------
示例4: LLM进行事实核查的提示工程
此示例将展示如何设计Prompt来引导LLM进行更细致的核查。
# 假设我们有一个LLM API调用函数
def call_llm_api(prompt):
"""
模拟调用LLM API,返回一个结构化的JSON响应。
实际中会使用 OpenAI, Claude, Llama 2 等模型的API。
"""
if "The Earth is flat" in prompt:
return {
"judgement": "虚假",
"score": 0.02,
"reason": "科学共识和大量证据表明地球是一个球体(更准确地说是扁球体),而非平面。所提供的证据(NASA声明)明确支持地球是球体。",
"cited_evidence": ["Earth is an oblate spheroid, the third planet from the Sun. (NASA)"]
}
elif "NASA plans to send humans to Mars in the 2030s" in prompt:
return {
"judgement": "真实",
"score": 0.95,
"reason": "所提供的证据(NASA官方声明)明确指出NASA的人类火星任务目标是2030年代。",
"cited_evidence": ["NASA's current plan for Mars human mission targets the 2030s. (NASA Official)"]
}
elif "Elon Musk said humans will land on Mars by 2026" in prompt:
return {
"judgement": "待定/争议",
"score": 0.6,
"reason": "虽然SpaceX创始人Elon Musk确实多次表达过早期登陆火星的雄心,并且2026年是其早期提及的目标之一,但这是一个公司内部目标,与NASA的官方计划存在差异,且实际实现面临巨大挑战。证据中也提到NASA的计划是2030年代。",
"cited_evidence": [
"SpaceX aims for human landing on Mars as early as 2026. (SpaceX Official)",
"NASA's current plan for Mars human mission targets the 2030s. (NASA Official)"
]
}
else:
return {
"judgement": "无法判断",
"score": 0.5,
"reason": "信息不足或超出模型能力范围。",
"cited_evidence": []
}
def fact_check_with_llm_rag(claim_text):
evidences = retrieve_semantic_evidence(claim_text, top_k=3) # 调用之前的语义检索函数
evidence_str = "n".join([
f"- 证据 {i+1} (来源: {ev['source']}, 相似度: {ev['similarity']:.2f}): {ev['text']}"
for i, ev in enumerate(evidences)
])
prompt = f"""
你是一个严谨的事实核查专家,请根据以下“声明”和“参考证据”进行事实核查。
你的任务是判断“声明”的真实性,并给出“真实”、“虚假”、“待定/争议”或“无法判断”的标签。
同时,你需要提供详细的“理由”,并列出支持你判断的“引用证据”。
请以JSON格式返回你的判断,包含 'judgement', 'score' (0-1分,1为最真实), 'reason', 'cited_evidence' (列表)。
声明: "{claim_text}"
参考证据:
{evidence_str}
JSON输出:
"""
print(f"n--- LLM Prompt for '{claim_text}' ---")
# print(prompt) # 打印完整的Prompt可以帮助调试
return call_llm_api(prompt)
# 测试LLM核查功能
claims_for_llm_check = [
"The Earth is flat.",
"NASA plans to send humans to Mars in the 2030s.",
"Elon Musk said humans will land on Mars by 2026."
]
for claim in claims_for_llm_check:
result = fact_check_with_llm_rag(claim)
print(f"n--- LLM 核查结果 for '{claim}' ---")
print(f" 判断: {result['judgement']} (分数: {result['score']:.2f})")
print(f" 理由: {result['reason']}")
print(f" 引用证据: {result['cited_evidence']}")
print("=" * 50)
输出:
--- LLM Prompt for 'The Earth is flat.' ---
--- LLM 核查结果 for 'The Earth is flat.' ---
判断: 虚假 (分数: 0.02)
理由: 科学共识和大量证据表明地球是一个球体(更准确地说是扁球体),而非平面。所提供的证据(NASA声明)明确支持地球是球体。
引用证据: ['Earth is an oblate spheroid, the third planet from the Sun. (NASA)']
==================================================
--- LLM Prompt for 'NASA plans to send humans to Mars in the 2030s.' ---
--- LLM 核查结果 for 'NASA plans to send humans to Mars in the 2030s.' ---
判断: 真实 (分数: 0.95)
理由: 所提供的证据(NASA官方声明)明确指出NASA的人类火星任务目标是2030年代。
引用证据: ["NASA's current plan for Mars human mission targets the 2030s. (NASA Official)"]
==================================================
--- LLM Prompt for 'Elon Musk said humans will land on Mars by 2026.' ---
--- LLM 核查结果 for 'Elon Musk said humans will land on Mars by 2026.' ---
判断: 待定/争议 (分数: 0.60)
理由: 虽然SpaceX创始人Elon Musk确实多次表达过早期登陆火星的雄心,并且2026年是其早期提及的目标之一,但这是一个公司内部目标,与NASA的官方计划存在差异,且实际实现面临巨大挑战。证据中也提到NASA的计划是2030年代。
引用证据: ['SpaceX aims for human landing on Mars as early as 2026. (SpaceX Official)', "NASA's current plan for Mars human mission targets the 2030s. (NASA Official)"]
==================================================
挑战、优化与未来展望
构建一个高效且准确的AI自动审核系统并非易事,我们将面临诸多挑战,同时也有广阔的优化空间和令人兴奋的未来。
挑战:数据偏差、领域特异性、"幻觉"问题
- 数据偏差 (Data Bias):训练数据如果存在偏见,模型学习到的“事实”也会带有偏见。例如,如果知识图谱或训练语料偏向某一观点,模型可能错误地将其他观点标记为虚假。
- 领域特异性 (Domain Specificity):不同领域(如医学、金融、历史)的事实核查规则、专业术语和权威来源差异巨大。一个通用模型难以在所有领域都表现出色。
- “幻觉”问题 (Hallucination):LLMs有时会生成看似合理但实际上是虚构的信息,这在事实核查中是致命的缺陷。尽管RAG可以缓解,但仍需警惕。
- 实时性与时效性:事实是动态变化的,尤其是在新闻事件、科学发现等领域。系统需要持续更新知识库和模型,以应对信息的时效性。
- 对抗性攻击:恶意内容创作者可能会尝试“欺骗”AI系统,例如通过模糊措辞、断章取义或生成难以验证的假设性陈述。
优化策略:持续学习、人工反馈循环、多模态核查
- 持续学习 (Continuous Learning):建立数据反馈闭环,将人工审核结果用于模型的增量训练,使系统能够不断从新的数据和错误中学习。
- 人工反馈循环 (Human-in-the-Loop):对于AI系统无法确定的“待定”或高风险内容,引入人工专家进行最终判断,并将这些高价值的标注数据回流到训练集中。
- 多模态核查 (Multimodal Verification):未来的系统将不仅限于文本,还会扩展到图片、视频等媒体形式。例如,通过图像识别、视频内容分析来核查图像是否被篡改、视频内容是否真实。
- 增强可解释性 (Explainability):让AI系统不仅给出判断,还能清晰地展示判断依据(引用了哪些证据、相似度如何),增强透明度和用户信任。
- 领域模型与知识蒸馏:针对特定高风险领域,训练专门的AI模型,或将大型通用LLM的知识蒸馏到更小、更高效的领域模型中。
未来展望:更智能、更自主的核查系统
展望未来,AI驱动的事实核查系统将向着更自主、更智能、更全面的方向发展。我们可能会看到:
- 主动式核查:系统不再是被动地等待文章提交,而是能够主动识别网络上的高风险信息,进行预警和核查。
- 跨语言、跨文化核查:打破语言壁垒,实现全球范围内的虚假信息监测与核查。
- 个性化事实核查:根据用户的兴趣和阅读习惯,提供定制化的事实核查服务,帮助用户建立更可靠的信息茧房。
- 与区块链技术结合:利用区块链的不可篡改性,为事实证据和核查结果提供更强的可信度和溯源能力。
通过持续的技术创新和严谨的工程实践,我们有能力构建一个强大的AI防线,有效抵御虚假信息的冲击,共同维护一个更加真实、可信赖的数字信息生态。这将不仅提升网站的EEAT权重,更是对社会责任的担当。
今天的分享就到这里。感谢大家的聆听!