杜绝谣言:用 MindSpore 和 Gradio 构建 AI 事实核查助手

在自媒体时代,信息传播速度极快,但内容的真实性也面临前所未有的挑战。对于创作者而言,发布一篇包含事实错误的文章或视频,不仅会损害专业信誉,还可能引发不必要的误解。

为了帮助创作者守住事实底线,今天我们将从零开始,构建一个“自媒体文案事实核查助手”。这个应用能利用 AI 的分析能力,自动审查文本中的事实性陈述,高亮标记出可信、存疑或错误的部分,并提供改进建议,成为你内容创作流程中的第一道“质检员”。

https://modelers.cn/spaces/qq_29922685/TextVerse

项目亮点

  • 结构化分析:AI 被指令以严格的 JSON 格式返回分析结果,便于程序解析和后续处理。
  • 可视化标注:应用能自动在原文中用不同颜色(绿、橙、红)高亮标记句段,让你对问题点一目了然。
  • AI 驱动核心:应用的核心分析能力由 MindSpore 生态的 Qwen1.5-0.5B 模型提供,确保了分析的智能性。
  • 友好的用户体验:通过 Gradio 和自定义 CSS,我们实现了一个简洁、带加载动画的界面,提升了应用的专业感和易用性。

核心技术栈

  • Python: 项目的开发语言。
  • MindSpore & OpenMind: 我们使用 openmindpipeline API 加载并运行 Qwen1.5-0.5B 模型,这是执行事实核查任务的大脑。
  • Gradio: 用于快速构建交互式 Web 界面的 Python 库,是本项目前端呈现的关键。
  • JSON & HTML: JSON 用于规范 AI 的输出,HTML 则用于在前端动态渲染高亮文本和详细报告。

代码深度解析

让我们深入探索这个应用的构建过程。

1. 定义 AI 的“岗位职责”:系统提示词

这是整个应用能够稳定运行的基石。我们通过一个极其明确的系统提示词,强制 AI 扮演“事实核查助手”的角色,并且必须以 JSON 格式输出结果。

Python

# -------------------------
# System Prompt
# -------------------------
SYSTEM_PROMPT = """
你是一名事实核查助手,请分析输入文案,找出事实陈述或数据可能存在的错误、存疑或可信部分,
并输出严格 JSON 格式:
{
  "items": [
    {
      "fragment": "原文片段",
      "judgement": "可信/存疑/错误",
      "confidence": 0-100,
      "sources": ["来源1","来源2"],
      "suggestion": "改进建议"
    }
  ],
  "summary": "总体结论"
}
重要:仅输出JSON{}。
"""

这个提示词的精髓在于其结构化要求。通过定义 JSON 的 schema(items, fragment, judgement 等字段),我们确保了无论 AI 的自然语言理解如何,其输出始终能被我们的程序稳定解析,这是从“聊天机器人”迈向“可靠工具”的关键一步。

2. 初始化 AI 模型

在应用启动时,我们通过 openmindpipeline 来加载 MindSpore Qwen 模型。

Python

# -------------------------
# 模型初始化
# -------------------------
pipe = None
try:
    print("🧠 尝试初始化 Qwen 模型 ...")
    from openmind import pipeline
    pipe = pipeline("text-generation", 
                    model="MindSpore-Lab/Qwen1.5-0.5B", 
                    framework="ms")
    print("✅ Qwen 初始化成功!")
except Exception as e:
    print("⚠️ Qwen 初始化失败:", e)
    pipe = None

3. 核心逻辑:从文本到结构化 JSON

ask_model_for_factcheck 函数负责将用户的文本发送给 AI。extract_json 函数则扮演了“数据清洗工”的角色,确保从 AI 可能返回的夹杂着其他文本的输出中,精准地提取出 JSON 部分。

Python

# -------------------------
# 模型调用函数
# -------------------------
def ask_model_for_factcheck(text, check_type):
    messages = [
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": f"核查类型:{check_type}\n\n{text}"}
    ]
    if pipe:
        try:
            res = pipe(messages)
            return extract_assistant_content(res)
        except Exception as e:
            print("⚠️ Qwen 调用失败:", e)
            return json.dumps({"error": str(e)}) # 保证返回一个json
    else:
        return json.dumps({"error": "Qwen 模型未初始化"})

def extract_json(text: str):
    """
    从字符串中稳健地提取 JSON 内容。
    """
    try:
        start = text.find('{')
        end = text.rfind('}')
        if start == -1 or end == -1:
            raise ValueError("未检测到 JSON 结构")
        return text[start:end+1].strip()
    except Exception as e:
        print(f"[extract_json 错误] 无法解析 JSON: {e}")
        return None

4. 数据可视化:解析 JSON 并渲染 HTML

这是将枯燥的 JSON 数据变得直观易懂的关键。build_result_html 函数接收原始文本和 AI 返回的 JSON 字符串,执行以下操作:

  1. 解析 JSON 数据。
  2. 遍历 items 列表中的每一项核查结果。
  3. 根据 judgement(可信/存疑/错误)字段,在原始文本的相应片段 fragment 上包裹带有不同颜色背景的 HTML `` 标签。
  4. 生成一份详细的、结构化的 HTML 报告,列出每个问题的细节、来源和建议。

Python

# -------------------------
# 解析与高亮输出
# -------------------------
def build_result_html(text, result_str):
    try:
        data = json.loads(result_str)
    except Exception:
        # 如果JSON解析失败,直接显示原始错误信息
        return f"<pre>{html.escape(result_str)}</pre>", "<pre>解析失败</pre>"
    
    items = data.get("items", [])
    color_map = {"可信": "green", "存疑": "orange", "错误": "red"}
    html_text = html.escape(text) # 防止XSS攻击

    # 渲染高亮文本
    for item in items:
        frag = html.escape(item.get("fragment", ""))
        col = color_map.get(item.get("judgement", "存疑"), "orange")
        html_text = html_text.replace(frag, f"<mark style='background:{col}20;border-bottom:2px solid {col};'>{frag}</mark>")

    # 渲染详情报告
    details = "<h4>核查详情</h4>"
    for i, item in enumerate(items, 1):
        details += f"<b>{i}. {item.get('fragment')}</b><br>..."
    
    return f"<div>{html_text}</div>", f"<div>{details}</div>"

5. 用 Gradio 构建交互界面

我们使用 gr.Blocks 搭建了应用的整体布局,并用 gr.HTML 组件来承载由 build_result_html 生成的动态内容。CSS 部分则通过添加优雅的加载动画,极大地改善了用户在等待 AI 处理时的体验。

Python

# -------------------------
# Gradio UI
# -------------------------
with gr.Blocks(css=css, title="事实核查助手") as demo:
    gr.Markdown("## 🛡️ 事实核查助手...")
    # ... 输入框、下拉菜单、按钮等组件定义

    annotated = gr.HTML(label="原文标注", elem_id="annotated-box", ...)
    details = gr.HTML(label="核查详情", elem_id="details-box", ...)
    
    start_btn.click(
        fn=process_factcheck, # 主处理函数
        inputs=[input_text, check_type],
        outputs=[annotated, details, result_raw]
    )
    # ...

process_factcheck 函数是整个流程的协调者,它依次调用模型、解析 JSON 并渲染 HTML,最后将结果更新到前端的 annotateddetails 组件中。

如何运行它?

  1. 安装依赖库:

    Bash

    pip install openmind_sdk mindspore gradio openai
    

    (注:openai 库在这里可能是某些依赖需要,或用于兼容 API 格式)

  2. 保存代码: 将代码保存为 fact_checker.py 文件。

  3. 启动应用: 在终端中运行:

    Bash

    python fact_checker.py
    
  4. 开始使用: 在浏览器中打开终端显示的本地 URL (例如 http://127.0.0.1:7860),即可开始你的事实核查工作。

结语

这个项目展示了如何将大语言模型的能力封装成一个解决特定问题的实用工具。通过强制 AI 进行结构化输出,并结合前端的可视化技术,我们可以将复杂的分析结果以最直观的方式呈现给用户。

当然,AI 核查并非万无一失,它更适合作为高效的初筛工具。最重要的,仍然是我们创作者保持审慎的态度,结合权威来源进行最终确认。希望这个工具能为你严谨、高质量的创作之路提供一份助力。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐