“Claimify”方法的实现,用于从文本中提取可验证的事实主张,以本地模型上下文协议(MCP)服务器的形式提供。此工具实现了学术论文《有效提取和评估事实主张》(Metropolitansky & Larson, 2025)中详细描述的多阶段事实主张提取方法。
论文中的提示已修改以适用于结构化输出。 这不是官方实现。
Claimify 使用复杂的四阶段流水线从文本中提取可验证的、去上下文化的事实主张:
该工具仅使用 OpenAI 的结构化输出功能以提高可靠性,并通过模型上下文协议公开其功能,使其可用于兼容 MCP 的客户端,如 Cursor 和 Claude Desktop。
gpt-4o(推荐)gpt-4o-mini(更快更便宜)# 克隆仓库
git clone <repository-url>
cd ClaimsMCP
# 创建并激活虚拟环境
python -m venv claimify-env
source claimify-env/bin/activate # 在 Windows 上:claimify-env\Scripts\activate
# 安装依赖项
pip install -r requirements.txt
# 下载所需的 NLTK 数据(首次运行时会自动下载)
python -c "import nltk; nltk.download('punkt_tab')"
在项目根目录创建一个 .env 文件:
# 复制示例文件
cp env.example .env
编辑 .env 并添加您的 API 密钥:
# API 密钥
OPENAI_API_KEY="your-openai-api-key-here"
# LLM 配置
LLM_MODEL="gpt-4o-2024-08-06" # 支持结构化输出的模型
# 日志配置
LOG_LLM_CALLS="true" # 设置为 "false" 以禁用日志
LOG_OUTPUT="stderr" # "stderr" 或 "file" - 日志发送位置
LOG_FILE="claimify_llm.log" # 当 LOG_OUTPUT="file" 时使用
~/.cursor/mcp.json):{
"mcpServers": {
"claimify-local": {
"command": "/path/to/your/claimify-env/bin/python",
"args": [
"/path/to/your/project/claimify_server.py"
]
}
}
}
“Claimify 提取服务器”现在应该出现在您的 MCP 启用聊天中的连接工具列表中。
配置完成后,您可以在您的 MCP 客户端中使用该工具:
服务器提供了两个提示,帮助验证和记录提取的主张:
verify_claim)提供了一个预构建的提示,指示 LLM 根据外部来源验证单个事实主张。
参数:
claim_text(必需):要检查的去上下文化的事实主张。行为:
示例检索(概念性 – 实际调用取决于客户端 API):
get_prompt(name="verify_claim", arguments={"claim_text": "Python 最早在 1991 年公开发布。"})
示例预期 LLM 响应格式:
**主张**:Python 最早在 1991 年公开发布。
**状态**:IN_PROGRESS
[经过研究...]
**主张**:Python 最早在 1991 年公开发布。
**状态**:VERIFIED
**证据**:
- 来源 1:[Python.org 发布历史](https://www.python.org/doc/versions/) - 官方 Python 发布历史页面确认了最初的公开发布时间
- 来源 2:[计算机历史博物馆](https://www.computerhistory.org/collections/catalog/102726710) - 档案引用了 Python 的早期开发
- 来源 3:[维基百科 - Python](https://en.wikipedia.org/wiki/Python_(编程语言)) - 百科全书条目引用了原始发布时间
如果不确定:
**主张**:斯德哥尔摩有 800,000 居民。
**状态**:UNCERTAIN
**证据**:
- 来源 1:[瑞典统计局](https://www.scb.se/en/) - 报告根据测量城市本身、市镇还是大都市区而提供的不同人口数字
**分析**:
该主张缺乏对所引用的“斯德哥尔摩”定义的具体性(城市本身约 975k,市镇约 975k,或大都市区约 1.6M,截至 2023 年)。800,000 的数字可能在某些定义和特定时间段内是准确的,但在没有时间和地理上下文的情况下,完全验证是不可能的。
如果反驳:
**主张**:地球是平的。
**状态**:DISPUTED
**分析**:
这一主张与压倒性的科学证据相矛盾。地球的球形已被卫星图像、太空任务和数世纪的天文观测证实。可靠的来源普遍拒绝这一主张。
create_claims_report)生成一个初始的 CLAIMS.md 文件,其中所有主张均标记为 TODO。然后可以逐步验证这些主张,更新它们的状态:TODO → IN_PROGRESS → VERIFIED/UNCERTAIN/DISPUTED。
流程:
参数:
行为:
示例用法: 当在 VS Code 中查看提取资源时,将其附加到提示上下文中。提示将生成一个初始的 CLAIMS.md 文件,准备好进行验证。
初始 CLAIMS.md 结构:
# 主张报告
**提取 ID**:extraction_1_1730678400
**生成时间**:2025-11-03
**总主张数**:5
**待办事项**:5
**正在进行**:0
**已验证**:0
**不确定**:0
**反驳**:0
---
## 主张
### 主张 1
**文本**:苹果公司成立于 1976 年。
**状态**:TODO
---
### 主张 2
**文本**:史蒂夫·乔布斯共同创立了苹果公司。
**状态**:TODO
---
...
验证更新后:
### 主张 1
**文本**:苹果公司成立于 1976 年。
**状态**:VERIFIED
**证据**:
- 来源 1:[维基百科 - 苹果公司](https://en.wikipedia.org/wiki/Apple_Inc.) - 表明公司在 1976 年成立
- 来源 2:[苹果官方](https://www.apple.com/about/) - 公司历史确认 1976 年成立
- 来源 3:[大英百科全书](https://www.britannica.com/topic/Apple-Inc) - 百科全书条目验证了成立年份
---
### 主张 2
**文本**:斯德哥尔摩有 800,000 居民。
**状态**:UNCERTAIN
**证据**:
- 来源 1:[瑞典统计局](https://www.scb.se/en/) - 根据定义报告不同的数字
**分析**:
该主张缺乏对所引用的地理定义和时间周期的具体性。截至 2023 年,人口在城市本身(约 975k)、市镇(约 975k)和大都市区(约 1.6M)之间显著变化。800k 的数字可能在历史上对于某些定义是准确的。
---
### 主张 3
**文本**:该公司发明了智能手机。
**状态**:DISPUTED
**分析**:
虽然苹果公司通过 2007 年的 iPhone 推广了智能手机,但它并没有发明智能手机。早期设备如 IBM Simon(1994 年)和黑莓设备(2000 年代初)早于 iPhone。该主张混淆了创新/推广与发明。
---
...
注意:服务器仅提供提示;外部搜索取决于客户端/模型的能力。
输入:"美国国旗包含 50 颗星和 13 条横杠。"
输出:[
"美国国旗包含 50 颗星 [代表 50 个州] 和 13 条横杠 [代表最初的 13 个殖民地]。",
"美国国旗设计于 1777 年",
"美国国旗已经修改了 27 次"
]
输入:"苹果公司成立于 1976 年,由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗纳德·韦恩共同创立。这家公司极其创新,拥有世界上最好的产品。"
输出:[
"苹果公司成立于 1976 年,由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗纳德·韦恩共同创立。"
]
(注意:关于“极其创新”和“拥有世界上最好的产品”的主观内容被过滤掉)
输入:"String-systemet 是一个获奖的图标,结合了优雅和极简的设计以及广泛的色彩和尺寸选择。Nisse Strinning 早在 1949 年就创造了第一个架子。"
输出:[
"String-systemet [一种搁板系统] 是一个获奖的图标 [在设计领域]",
"String-systemet 结合了优雅和极简的设计以及广泛的色彩和尺寸选择",
"Nisse Strinning 在 1949 年创造了第一个 String 搁板 [String-systemet]"
]
(注意:内容保留原始瑞典语,并在括号中添加了上下文解释)
每次提取都会生成两种类型的资源:
claim://extraction_<n>_<timestamp>)
claim://<slug>)
{
"id": "extraction_1_1730678400",
"timestamp": "2025-11-03T14:30:00.123456",
"question": "苹果的历史是什么?",
"text_preview": "苹果公司成立于 1976 年,由史蒂夫·乔布斯...",
"claims": [
"苹果公司成立于 1976 年,由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗纳德·韦恩共同创立。"
],
"claim_count": 1
}
URI:claim://apple-inc-was-founded-in-1976-by-steve-jobs
URI 模式:claim://<slug>
示例:
claim://apple-inc-was-founded-in-1976-by-steve-jobs-steve-wozniak-and-ronaldclaim://stockholm-is-the-capital-of-swedenclaim://python-was-first-publicly-released-in-1991内容:主张本身的纯文本(无 JSON 包装)
单个主张资源的好处:
ClaimsMCP/
├── README.md # 此文件
├── requirements.txt # Python 依赖项
├── env.example # 环境配置模板
├── claimify_server.py # 主 MCP 服务器脚本
├── llm_client.py # 使用结构化输出支持的 LLM 客户端
├── pipeline.py # 核心主张提取流水线
├── structured_models.py # 结构化输出的 Pydantic 模型
├── structured_prompts.py # 优化的结构化输出提示
├── setup.py # 包设置配置
├── test_claimify.py # 主张提取流水线的测试套件
└── LICENSE # Apache 2.0 许可证
该系统遵循模块化架构,采用结构化输出:
实现使用 OpenAI 的结构化输出功能,提供:
| 环境变量 | 描述 | 默认值 | 选项 |
|---|---|---|---|
LLM_MODEL | 使用的具体模型 | gpt-4o-2024-08-06 | 支持结构化输出的模型 |
OPENAI_API_KEY | OpenAI API 密钥 | 无 | 您的 API 密钥 |
LOG_LLM_CALLS | 启用所有 LLM 交互的详细日志 | true | true, false |
LOG_OUTPUT | 日志输出位置 | stderr | stderr, file |
LOG_FILE | 日志文件名(当 LOG_OUTPUT=file 时使用) | claimify_llm.log | 任意文件名 |
“模型不支持结构化输出”错误
gpt-4o-2024-08-06,gpt-4o-mini 或 gpt-4o.env 文件:LLM_MODEL=gpt-4o-2024-08-06“API 密钥未设置”错误
.env