关于 ukvet: UK Companies House
ukvet 是面向英国公司尽职调查的开源工具,依据 Companies House 公开记录生成带引用的风险报告。其规则计算事实与风险标记,并在使用 LLM 撰写报告时检查引用。
主要功能
- 01读取公司、董事和控制人记录
- 02检查逾期申报、担保债务与破产记录
- 03识别董事关联的失败公司
- 04生成带来源引用的风险报告
- 05缺少数据时明确标示
适用场景
- 01核查英国公司的状态和申报情况
- 02调查董事、控制人及担保债务
- 03在交易或合作前查看公司风险标记
MCP 相关
ukvet-mcp 是 MCP 服务,向任意 MCP 客户端开放 Companies House 数据。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
ukvet — 英国公司的 AI 尽职调查 Agent
30 秒内审查任意英国公司——附有引用、经过评估且开源。
状态:第 6 阶段(发布)已完成。
ukvet-mcp0.1.0 已发布到 PyPI,并已收录于官方 MCP 注册表(io.github.FraidoonOmarzai/ukvet-mcp)。Agent、界面和评估框架均已构建、测试,并在 CI 中设置了准入门槛。
快速开始
1. 在 Claude Desktop 中使用数据层(2 分钟)
你需要安装 uv 并获取免费的 Companies House REST API 密钥 (在此创建,使用线上环境)。
$env:CH_API_KEY="your-key"; uvx ukvet-mcp --check # prints OK if the key works
然后将以下内容添加到 claude_desktop_config.json,并重启 Claude Desktop:
{
"mcpServers": {
"ukvet": {
"command": "uvx",
"args": ["ukvet-mcp"],
"env": { "CH_API_KEY": "your-key" }
}
}
}
完整指南:packages/ukvet-mcp 及其 PyPI 页面。
2. 运行完整 Agent 和界面(Docker)
git clone https://github.com/fraidoonomarzai/ukvet.git
cd ukvet
copy .env.example .env # add CH_API_KEY (LLM settings are optional)
docker compose up --build # API http://localhost:8000/docs, UI http://localhost:8501
如果未设置 LLM_PROVIDER,报告将使用模板叙述,且不产生任何费用。如果设置了该变量,大模型会撰写报告内容,并且每个句子都必须通过引用检查,否则将改用模板。
功能
输入英国公司名称或编号。ukvet 会检查 Companies House 的官方记录,并生成风险报告,回答以下问题:
- 公司处于运营、解散还是破产状态?
- 公司成立多久了?
- 董事有哪些?
- 公司账目或确认声明是否逾期?
- 谁控制着公司?
- 公司是否有担保债务(抵押)?
- 是否有破产历史?
- 公司董事是否经营过倒闭的公司?
- 董事或地址近期是否有变更?
- 有哪些风险信号?
每项事实均引用自官方记录。如果缺少数据,ukvet 会如实说明,而不是猜测。
构建方式
| 部分 | 内容 |
|---|---|
ukvet-mcp | 开源 MCP 服务,向任意 MCP 客户端提供 Companies House 数据 |
ukvet-agent | LangGraph Agent:规划器 → 研究员 → 验证员 → 报告撰写员 |
| 评估 | 基于 48 家冻结且匿名化的公司的 432 项基准测试;在 CI 中设置准入门槛(evals/) |
| 可观测性 | 可选的 Langfuse 跟踪(默认关闭;内容已脱敏);逐份报告统计延迟、令牌、费用和工具调用次数 |
| 防护措施 | 引用检查器,以及对每份完成报告的输出检查;注入攻击评估(M6) |
| 模型选择 | 在同一测试集上比较 Claude Haiku 5.5 与开放权重模型 Qwen3.6-27B,并以表格形式发布(结果) |
事实、风险信号和风险等级均由确定性代码和规则生成。大模型只是其中一个节点:它只能看到已验证的事实,没有任何工具可用,而且它撰写的每项说法都会经过检查。架构:docs/08-architecture.md
结果
在包含 48 家公司的带版本数据集上测得(30 家开发集,18 家测试集)。完整表格、区间和失败分析:docs/eval-report.md 和 docs/results.md。
基准测试(Claude Haiku 5.5,全部 48 家公司)
| 指标 | 目标 | 结果 |
|---|---|---|
| M1 检索准确率 | ≥ 90% | 100%(1488/1488 个字段) |
| M2 无依据的说法 | < 2% | 0 条(共 421 条;95% 上限为 0.9%) |
| M4 引用有效率(机械检查) | 100% | 100%(421/421) |
| M5 风险信号召回率 | ≥ 85% | 100%(89/89) |
模型对比(测试集:18 份报告,每份约 155 条说法)
| Claude Haiku 5.5(API) | Qwen3.6-27B(可自托管,A100) | |
|---|---|---|
| M1 准确率 | 100% | 100% |
| M2 无依据的说法 | 0 条(共 156 条) | 1 条(共 154 条) |
| M4 有效引用 | 156 条(共 156 条) | 153 条(共 154 条) |
| M6 抗提示注入能力 | 96.7%(87/90) | 100%(90/90) |
| M7 延迟,p95 | 6.6 秒 | 24.2 秒 |
| M8 每份报告的成本 | £0.00058 | £0.0076(最佳情况,仅计入实际运行的 GPU 时间) |
建议:继续将 Claude Haiku 5.5 用作默认模型;只需更改设置即可使用开放权重模型方案。在此测试集上,准确率差异处于误差范围内。
局限性(请阅读)
- M1 衡量的是与我编写的基准答案的一致性;我曾对照 10 家公司的实时网站进行人工核查。这不能证明每个字段都属实;100% 的得分意味着当前数据集还不够难,无法发现新的检索错误。
- M2 和 M4 是机械检查(ID、日期、数字、名称、禁用措辞)。我们未评估引用事实是否能充分支持句子,也未评估措辞是否公平。
- 测试集包含 18 份报告;仅测试了一个开放权重模型,每个模型各运行一次;延迟和成本数据来自一个网络环境和一块 GPU。
- 提示注入:一个载荷(公司名称)在 3 家被测公司中全部让攻击者指定的文本进入了 Claude 的报告。风险等级和风险信号未改变。这项问题仍待后续跟进;M6 仅衡量对所列载荷的抵抗能力。
- 标签和规则由一个人编写。
开发
需要 Python 3.12+ 和 uv。以下命令适用于 PowerShell;在 Linux 或 macOS 上也可使用相同的 uv run ... 命令(在支持 make 的环境中还提供了 Makefile 作为快捷方式)。
git clone https://github.com/fraidoonomarzai/ukvet.git
cd ukvet
copy .env.example .env # add your Companies House API key
uv sync --all-groups --all-packages # install dependencies
uv run ruff check . # lint
uv run ruff format --check . # formatting
uv run mypy # type check
uv run pytest # tests
运行
# .env: CH_API_KEY=... (optional: LLM_PROVIDER / LLM_MODEL / LLM_API_KEY, see .env.example)
uv run ukvet-check --full 00445790 # terminal, no UI
docker compose up --build # API (http://localhost:8000/docs) + UI (http://localhost:8501)
未设置 LLM_PROVIDER 时,报告使用模板叙述,不产生费用。设置后,LLM 会撰写措辞,且每个句子都必须通过引用检查,否则将改用模板。
运行评估
uv run ukvet-evals demo-build # synthetic demo set, proves the harness works
uv run ukvet-evals run --dataset demo
uv run ukvet-evals run --dataset v0.1 --split dev # real set, dev split, free (template mode)
uv run ukvet-evals gate --dataset v0.1 # compare with the baseline; fails if worse
可观测性与安全(阶段 4)
# .env (all optional): LANGFUSE_PUBLIC_KEY, LANGFUSE_SECRET_KEY, LANGFUSE_HOST
# UKVET_TRACE_CONTENT=redacted (default, names are masked) or full (synthetic data only)
# UKVET_PRICE_IN_GBP_PER_MTOK / UKVET_PRICE_OUT_GBP_PER_MTOK (cost is shown only when set)
uv sync --all-groups --all-packages --extra observability
# live latency (M7), cost (M8) and tool calls (M9); needs CH_API_KEY and an LLM key
uv run python scripts/phase4_metrics.py --file numbers.txt --out evals/results/phase4
# prompt-injection resistance (M6): record once, then replay for free
uv run ukvet-evals extend-injection --dataset v0.1
uv run ukvet-evals injection --dataset v0.1 --llm record --model <model>
uv run ukvet-evals injection --dataset v0.1 --llm replay --model <model>
只有在设置了两个 Langfuse 密钥时才会启用追踪,而且追踪绝不会导致报告生成失败。目标:M6 抗提示注入能力达到 95% 或更高,M7 p95 延迟低于 30 秒,M8 每份报告的成本低于 £0.05,M9 跟踪每份报告的工具调用次数并作为基准。M6 仅衡量对所列载荷的抵抗能力;这并不能证明安全性。测量结果位于 evals/results/。
模型对比(阶段 5)
# one env file per model; copy the one you want over .env
uv run python scripts/phase5_check_endpoint.py # smoke-test an OpenAI-compatible endpoint (vLLM)
uv run ukvet-evals run --dataset v0.1 --split test --llm record --model <model-id> --confirm-test-split "reason" --out evals/results/v0.1-test-<name>
uv run python scripts/phase4_metrics.py --file numbers.txt --label <name> --out evals/results/phase5-live-<name>
uv run ukvet-evals compare --init # create evals/comparison.json, fill it in
uv run ukvet-evals compare # writes docs/results.md; refuses unfair comparisons
两个模型必须使用相同的数据集版本、数据拆分、提示词和 git 提交;compare 会拒绝不同的数据集或拆分,并对其他差异发出警告。开放权重模型的服务方式说明:ADR-008 和 docs/PHASE-5-GPU-SETUP.md。
更多文档
架构与 ADR · 评估报告 · 模型对比 · 威胁模型 · 决策日志 · 所有文档
免责声明
ukvet 仅供参考,不构成法律、财务或信贷建议。报告基于检索时的公开记录,这些记录可能不完整或已过时。做出决策前,请务必进行核实。ukvet 与 Companies House 无关联。
署名
包含根据 Open Government Licence v3.0(Companies House)授权的公共部门信息。
许可证
代码:MIT © 2026 Fraidoon Omarzai
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。