Expand router into reproducible local AI platform
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
# Lokale Websuche
|
||||
|
||||
SearXNG übernimmt die Metasuche. TinySearch normalisiert, crawlt und rankt die
|
||||
Ergebnisse lokal. Nur die Web-MCP-Fassade wird dem Modell angeboten; die
|
||||
generischen TinySearch-Werkzeuge bleiben intern.
|
||||
|
||||
## Installation
|
||||
|
||||
1. `searxng-settings.example.yml` nach `searxng-settings.yml` kopieren.
|
||||
2. `CHANGE_ME_GENERATE_RANDOM_SECRET` durch einen zufälligen Wert ersetzen.
|
||||
3. `tinysearch_config.json` prüfen.
|
||||
4. `docker compose up -d` ausführen.
|
||||
5. TinySearch bleibt ausschließlich über `127.0.0.1:8000` erreichbar.
|
||||
|
||||
Die Containerimages sind per Digest festgeschrieben. Upgrades erfolgen nur
|
||||
bewusst nach Test von Suche, Crawling, Quellenbindung und Kontextgröße.
|
||||
|
||||
`web_search_mcp.py` ist die kompakte, für kleinere Modelle optimierte Fassade.
|
||||
Sie bietet nur `web_search`, `web_compare`, `web_shop` und `web_research` an
|
||||
und verwendet für GitHub und Hugging Face zusätzlich strukturierte APIs.
|
||||
|
||||
## Modellfreundliche Vorgaben
|
||||
|
||||
- kurze Suche: maximal fünf Ergebnisse
|
||||
- Recherche: maximal vier gecrawlte Seiten und acht Evidenz-Chunks
|
||||
- höchstens zwei Chunks je Quelle
|
||||
- Seitenlimit 6000 Tokens, Chunkziel 300 Tokens
|
||||
- externe Inhalte immer als nicht vertrauenswürdig markieren
|
||||
- GitHub und Hugging Face bevorzugt über strukturierte öffentliche APIs
|
||||
- Preise erst nach Prüfung der tatsächlichen Händlerseite als bestätigt melden
|
||||
@@ -0,0 +1,45 @@
|
||||
name: local-ai-web-search
|
||||
|
||||
services:
|
||||
searxng:
|
||||
image: searxng/searxng@sha256:e45d5894bfaa0bf8773b9f283795ae57f1c15ddb29c8cecb70b3665b0ce9ec60
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./searxng-settings.yml:/etc/searxng/settings.yml:ro
|
||||
networks: [search]
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1:8080/healthz"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
start_period: 30s
|
||||
security_opt: ["no-new-privileges:true"]
|
||||
|
||||
tinysearch:
|
||||
image: marcellm01/tinysearch@sha256:5a03d5a1f1b0fabe48f2a26e05db4a84bcb611106a57ec51e42db4549976aa9c
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "127.0.0.1:8000:8000"
|
||||
shm_size: "1gb"
|
||||
volumes:
|
||||
- tinysearch-models:/data/models
|
||||
- ./tinysearch_config.json:/config/tinysearch_config.json:ro
|
||||
environment:
|
||||
MCP_TRANSPORT: streamable-http
|
||||
MCP_HOST: 0.0.0.0
|
||||
MCP_PORT: 8000
|
||||
TINYSEARCH_CONFIG_PATH: /config/tinysearch_config.json
|
||||
TINYSEARCH_SEARCH_BACKEND: searxng
|
||||
SEARXNG_URL: http://searxng:8080/search
|
||||
depends_on:
|
||||
searxng:
|
||||
condition: service_healthy
|
||||
networks: [search]
|
||||
security_opt: ["no-new-privileges:true"]
|
||||
|
||||
networks:
|
||||
search:
|
||||
driver: bridge
|
||||
|
||||
volumes:
|
||||
tinysearch-models:
|
||||
@@ -0,0 +1,22 @@
|
||||
use_default_settings: true
|
||||
|
||||
general:
|
||||
instance_name: "Local AI Search"
|
||||
debug: false
|
||||
|
||||
search:
|
||||
safe_search: 0
|
||||
autocomplete: ""
|
||||
default_lang: "de"
|
||||
formats: [html, json]
|
||||
|
||||
server:
|
||||
secret_key: "CHANGE_ME_GENERATE_RANDOM_SECRET"
|
||||
limiter: false
|
||||
image_proxy: false
|
||||
bind_address: "0.0.0.0"
|
||||
port: 8080
|
||||
|
||||
outgoing:
|
||||
request_timeout: 8.0
|
||||
max_request_timeout: 15.0
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"search_backend": "searxng",
|
||||
"search_backend_url": "http://searxng:8080/search",
|
||||
"search_backend_fallback": true,
|
||||
"search_region": "de-de",
|
||||
"search_max_results": 5,
|
||||
"scrape_max_tokens": 1200,
|
||||
"search_top_k": 15,
|
||||
"search_dense_weight": 0.5,
|
||||
"search_max_results_to_keep": 4,
|
||||
"chunk_dense_weight": 0.5,
|
||||
"chunk_max_results_to_keep": 8,
|
||||
"chunk_rank_oversample": 3,
|
||||
"chunk_dedupe_jaccard_threshold": 0.92,
|
||||
"chunk_max_per_source_url": 2,
|
||||
"max_concurrent_crawls": 3,
|
||||
"pipeline_timeout_seconds": 90.0,
|
||||
"crawl_fit_markdown_mode": "bm25",
|
||||
"crawl_fit_min_chars": 200,
|
||||
"crawl_bm25_threshold": 1.5,
|
||||
"crawl_bm25_language": "german",
|
||||
"crawl_max_chunk_tokens": 300,
|
||||
"crawl_overlap_tokens": 40,
|
||||
"crawl_max_page_tokens": 6000,
|
||||
"embedding_backend": "onnx",
|
||||
"embedding_model": "fast",
|
||||
"dense_document_embed_batch_size": 32,
|
||||
"encoding_name": "embedding",
|
||||
"blocked_domains": [],
|
||||
"trace_path": ""
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user