北欧声音透明
通过人工智能搜索Nordstemmen社区的所有公共文件 - 直接在Claude中!
立即使用
您可以使用此搜索引擎 立即免费使用无需安装任何东西:
关于Claude
- 进入https://claude.ai
- 点击您的个人资料(左下角) → 设置 -> 连接器
- 点击 添加自定义连接器
- 输入 :
- 名字北方之声社区 - 统一资源定位符: https://nordstemmen-mcp.levinkeller.de/mcp
- 保存
完成!你可以问克劳德:
- *“北斯特门的新游泳池要多少钱?”*
- *“向我展示有关Escherder Straße建筑工地的所有决定”*
- *“2024年预算何时通过?”*
自2007年以来,Claude自动搜索所有文件,并为您提供理事会信息系统中原始文件的链接。
关于ChatGPT
您需要一个付费账户(例如 Plus),并且必须在https://chatgpt.com/登录。
- 点击您的个人资料(左下角) → 设置 -> 应用程序和连接器.
- 在 扩展设置 洞穴 开发者模式 启用(如果尚未启用)。之后在 返回 点击。
- 右上角 创建 点击并输入以下内容:
- 名字北方之声社区 - MCP服务器的URL: https://nordstemmen-mcp.levinkeller.de/mcp - 验证无身份验证
- 死 我理解,我想继续。单击复选框,然后按 创建 点击。
连接器已设置并准备使用。打开一个 新聊天 然后选择这个 +在输入框左侧的图标 → … 更多 → 北方之声社区 出来。
首次调用操作时,出于安全原因,您需要确认操作。您可以选择 记住此对话 启用以减少查询次数。
______________________________________________________________________
这是达斯吗?
该项目允许语义搜索 所有公共文件 北方之声社区信息系统:
- 会议记录(市议会、地方议会、委员会)
- 决议草案和决定
- 预算和财务报告
- 施工计划和规划文件
- 公告和招标
时间 : 2007年至今的所有文档(~5800 个 PDF,自动更新)
语义人工智能搜索可以找到相关信息,即使确切的搜索词不在文本中。
技术概述(面向开发人员)
该项目包括三个组成部分:
- OParl刮板机 — 从理事会信息系统下载PDF文件和元数据
- 文档管道 — 完整的PDF处理: Gemini OCR → Jina Embeddings + Sparse Vectors → Qdrant
- MCP服务器 — 通过Claude/ChatGPT进行混合搜索的Cloudflare页面功能(语义+关键字)
此外,还有一个 CI管道 (GitHub Actions Cronjob),每小时同步新文档。
建筑
graph TB
User[Claude / ChatGPT
User]
MCP[MCP Server
Cloudflare Pages]
Qdrant[(Qdrant
Vector Store
Self-hosted VPS)]
Pipeline[Document Pipeline
TypeScript]
Docs[Documents
PDF Files]
Scraper[OParl Scraper
TypeScript]
Jina[Jina AI API]
Gemini[Gemini 2.5 Flash]
CI[GitHub Actions
Hourly Cron]
User -->|MCP Protocol
Connector| MCP
MCP -->|Query Embeddings
+ Sparse Vector| Jina
MCP -->|Hybrid Search
Dense + Sparse RRF| Qdrant
MCP -->|Fulltext| MCP
CI -->|Hourly| Scraper
CI -->|Hourly| Pipeline
Scraper -->|Download PDFs
+ Metadata| Docs
Docs -->|Read PDFs| Pipeline
Pipeline -->|OCR| Gemini
Pipeline -->|Jina v3 Dense
+ BM25 Sparse| Qdrant
style User fill:#e1f5ff
style MCP fill:#fff4e1
style Qdrant fill:#e8f5e9
style Pipeline fill:#f3e5f5
style Docs fill:#fce4ec
style Scraper fill:#e0f2f1
style Jina fill:#fff9c4
style Gemini fill:#fff9c4
style CI fill:#f0f0f0组件概述
| 组件 | 技术 | 目的 |
|---|---|---|
| OParl刮板机 | TypeScript + Effect | 从 OParl API 下载 PDF + 元数据 |
| 文档管道 | TypeScript,异步/等待 | PDF→ Gemini OCR→ Jina嵌入+稀疏向量→ Qdrant |
| MCP服务器 | Cloudflare Pages Functions | 混合搜索(密集+稀缺 RRF),全文检索 |
| 矢量数据库 | Qdrant(自托管) | 命名向量:密集(Jina 1024D)+稀疏(BM25-TF) |
| 光学字符识别 | Gemini 2.5 Flash | PDF→ 文本(seitenweise) |
| 嵌入 女性AI v3(1024D)+局部BM25-TF→密集+稀疏矢量 | ||
| 全文 | Cloudflare 静态资产 | 全文 .txtMCP服务器上的文件。 |
Warum混合搜索?
搜索结合了两种方法 互易秩融合(RRF):
- 密集向量 (Jina v3, 1024D):语义搜索 — 理解含义,在“室内游泳池”中找到“游泳池”
- 稀疏向量 (BM25-TF,本地计算):关键字搜索 — 查找确切名称(“Müller”)、编号(“DS 101/2024”)、街道名称(“Escherder Straße”)
稀疏向量werden 本地 从文本中计算(FNV-1a哈希,德语停词,不需要API)。同样的令牌在Pipeline和MCP服务器中运行。
AI 模型决策
OCR——双子座2.5闪光灯 与GPT-4o和GPT-4o-mini相比:
- 双子座最便宜的选项(~$0.0001/页),无幻觉,也可以正确处理旋转的PDF
- GPT-4o翻译而不是转录 - 用自己的话重写内容并伪造其含义
- GPT-4o-mini拒绝旋转的PDF,跳过发件人块,几乎和GPT-4o一样昂贵
嵌入-Jina v3(1024D)多语种模式,具有良好的德语支持。特定任务LoRA适配器(retrieval.passage 为了索引, retrieval.query 寻找)。
存储库结构
nordstemmen-ai/
├── .github/workflows/
│ ├── data-sync.yml # Stündlicher CI-Cronjob für Datenaktualisierung
│ └── claude.yml # Claude Code Action
├── documents/ # Heruntergeladene PDFs und Metadaten (Git LFS)
│ ├── papers/ # Drucksachen (~1578 Verzeichnisse)
│ └── meetings/ # Sitzungen (~1087 Verzeichnisse)
├── scraper/ # OParl Scraper (TypeScript + Effect)
│ ├── src/
│ │ ├── index.ts # CLI Entry Point
│ │ ├── scraper.ts # OParl Scraper Logic
│ │ ├── client.ts # HTTP Client
│ │ └── schema.ts # OParl Type Definitions
│ └── package.json
├── pipeline/ # Document Pipeline (TypeScript)
│ ├── src/
│ │ ├── index.ts # CLI Entry Point
│ │ ├── pipeline.ts # Orchestrator
│ │ ├── ocr.ts # Gemini OCR
│ │ ├── jina.ts # Jina Embeddings (mit Semaphore)
│ │ ├── sparse.ts # BM25-TF Sparse Vectors (lokal)
│ │ ├── qdrant.ts # Qdrant Upload (Named Vectors: dense + sparse)
│ │ ├── cache.ts # Cache + .completed Tracking
│ │ ├── rebuild-qdrant.ts # Qdrant aus Cache neu aufbauen
│ │ └── migrate-sparse.ts # Einmalige Migration (danach löschen)
│ └── package.json
├── mcp-server/ # MCP Server (Cloudflare Pages)
│ ├── functions/
│ │ └── mcp.js # MCP Protocol Handler + 4 Tools
│ └── package.json
├── docs/
│ └── github-secrets.md # CI Secret-Dokumentation
├── .env.example
└── README.md设置
条件
- Node.js 22+ (所有组件)
- Qdrant Instanz (自主或云端)
- Google API密钥 (Gemini OCR)
- Jina AI API密钥 (对于Embeddings,https://jina.ai)
- 克劳德账户 (用于 MCP 集成的 Web 或桌面应用程序)
1.知识库klonen
git clone https://github.com/levino/nordstemmen-ai.git
cd nordstemmen-ai
npm install
# PDFs herunterladen (Git LFS) — optional, nur wenn lokal verarbeitet werden soll
git lfs pull重要 : PDF文档通过Git LFS进行管理。存储库使用自己的 LFS 服务器(不是 GitHub LFS)。克隆后,必须 git lfs pull 下载实际的文件。
2. 设置环境变量
cp .env.example .env编辑 .env 请输入您的凭据:
# Qdrant Configuration
QDRANT_URL=https://qdrant.levinkeller.de
QDRANT_API_KEY=your-qdrant-api-key
QDRANT_PORT=443
QDRANT_COLLECTION=nordstemmen
# Pipeline: Gemini OCR
GOOGLE_API_KEY=your-google-api-key
# Pipeline + MCP Server: Jina Embeddings
JINA_API_KEY=your-jina-api-key我在哪里可以得到钥匙?
- Qdrant: https://cloud.qdrant.io或者自己主办
- Google API密钥: https://console.cloud.google.com(生成语言API aktiveren)
- 名称 AI: https://jina.ai
3.OParl刮板
cd scraper
npm run scrape下载新的/修改过的 PDF 文档和 OParl 元数据。
4.文件管道
# Alle unverarbeiteten Dokumente verarbeiten
npm run pipeline
# Nur 10 Dokumente (zum Testen)
npm run pipeline -- --limit 10
# Nur auflisten, nichts tun
npm run pipeline -- --dry-run专业PDF:Gemini OCR→ Jina嵌入件→ Qdrant上传。死 .completed只有当所有步骤都成功时才会写入文件。如果取消,下次运行时只会处理丢失的文件。
5.MCP服务器部署(Cloudflare页面)
MCP服务器是一个Cloudflare Pages功能,有四个工具:
search_documents--混合Suche(密集型+稀疏型RRF)get_paper_by_reference— 使用 DS 号查询打印件search_papers结构化过滤器搜索get_document_text— 使用 SHA256 哈希检索全文
部署: 推送时自动通过 Cloudflare Pages main.
环境变量 (Cloudflare仪表板):
QDRANT_URL, QDRANT_API_KEY, QDRANT_PORT, QDRANT_COLLECTION, JINA_API_KEY本地测试 :
cd mcp-server
npm run dev # Dev Server starten
npm test # Tests ausführen自动数据更新(CI)
数据将 每小时自动 通过 GitHub Actions 更新:
- 爬虫 从OParl API加载新文档
- 管道 处理新的PDF文件(Gemini OCR → Jina Embeddings → Qdrant)
- 提交 保存新文件(用于 PDF/嵌入的 LFS)
手动触发 : GitHub操作>数据同步>运行工作流
必要的秘密: 查看
MCP工具
search_documents
混合搜索(语义+关键字)所有文档。通过相互排名融合 (RRF) 结合密度向量 (Jina v3) 和稀疏向量 (BM25-TF)。即使没有准确的关键字,也可靠地查找相关结果,并提供准确的名称/数字。
{"query": "Schwimmbad Kosten", "limit": 5}get_paper_by_reference
按号码打印。支持格式:“DS 101/2012”,“101/2012”,“101-2012”。
{"reference": "101/2012"}search_papers
结构化的打印过滤器搜索(标题,类型,日期,编号模式)。
{"name_contains": "Haushalt", "date_from": "2024-01-01"}get_document_text
通过SHA256哈希检索文档的全文。可选单页。
{"file_hash": "abc123...", "page": 3}Kosten&性能
Gemini OCR(管道)
- ~$0.0001 每页 (~$2.50每25000页)
- 初始处理总额(~5800 个 PDF):~$3-5
Jina AI API(管道+MCP)
- 免费等级:1M代币/Monat
- 管道~$0.02 / 100万代币(初始处理~5-10万代币)
- MCP查询每个查询 ~50 个令牌 → ~20000 个查询免费/月
Qdrant
- VPS上自托管
- ~6000个1024D矢量文档
Cloudflare页面
- 免费等级100000 个请求/天 → 有效免费
数据保护和透明度
- 无用户跟踪MCP 服务器不保存查询
- 公共数据: 只有来自理事会信息系统的已公开文件
- 开源MIT许可证,GitHub上的完整代码
- 独立项目没有官方社区申请
状态
该项目是高效和可行的!
- OParl刮刀(TypeScript+效果)
- 文档管道(TypeScript):Gemini OCR→ Jina嵌入+稀疏向量→ Qdrant
- MCP Server 现场https://nordstemmen-mcp.levinkeller.de/mcp
- 4 MCP工具:语义搜索,DS查找,过滤器搜索,全文检索
- ~5800个PDF已被索引(2007年至今)
- 每小时自动数据更新(GitHub Actions CI)
- 全文包装为 Cloudflare 静态资产
支持与贡献
问题: https://github.com/levino/nordstemmen-ai/issues
Pull Requests 欢迎!
许可证
麻省理工学院执照 许可证
______________________________________________________________________
注释: 这是一个独立的透明度工具,不是Nordstemmen社区的官方应用程序。
开发于: 克劳德代码
