c363a221e156dc17b9d4cde8abb7b88d58cf9f76
3
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
c363a221e1 |
docs(deploy): make deploy/ describe the deployment that actually exists
deploy/docker-compose.yml was unedited docs-mcp-template boilerplate — untouched since the scaffold commit, still carrying <product>, <registry> and <owner> placeholders — describing a standalone stack that has never existed. crop-chem-docs runs as the `chem-mcp` service inside Drawbar's parent compose. It also set MCP_ALLOWED_HOSTS, which no code in this repo reads. The knob is MCP_DISABLE_DNS_REBINDING_PROTECTION. Anyone who trusted the old file and set an allowlist would have gotten a 421 on every request with nothing in the logs to explain it. - deploy/docker-compose.yml: replaced with the real chem-mcp block, a copy of what runs in Drawbar/drawbar-backend. Verified structurally identical to the parent (image, environment, expose, extra_hosts, restart, labels all equal). Carries the why for each setting: the :latest-vs-corpus-tag Watchtower trap (#339), the rebind-protection rationale, and that the OLLAMA_URL override is load-bearing because Drawbar's own ollama service is commented out — the image default http://ollama:11434 does not resolve in that stack, so without the override every search_docs call fails to embed its query. - deploy/drawbar-compose-snippet.md: deleted. It was a second, differently-wrong copy (service name `crop-chem-docs`, ports 8001:8000, and "No environment block needed — the image's defaults handle it", which is false on both the rebind and Ollama counts). Its still-true content (verification commands) moved into the compose file; the tag scheme and deploy chain were already in the README. - deploy/rerank-docker.md: RERANK_URL said http://10.10.1.65:8082. In production the MCP reaches the sidecar by compose service name (http://llama-rerank:8080, baked into the image). Documents the network-attach gotcha that makes rerank fail silently, and keeps the host-IP form for local dev. - README.md: file tree updated for the deleted file; Watchtower poll interval corrected 5 min -> 60s (WATCHTOWER_POLL_INTERVAL=60, as configured on trashpanda). Verified: no <product>/<registry>/<owner> placeholders remain in deploy/ or README, and all six env vars set in the block are ones the server actually reads. Closes #5 Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01FFBDnRWHispovmJVK9rXc9 |
||
|
|
af44d7a102 |
Phase 11 + Phase 6 GPU move
## Phase 11 — Curated agronomy / label-handling knowledge layer
docs_mcp/lessons.md: 13 topic-anchored markdown sections covering
the LLM-side context a farmer-advisor needs alongside the raw
label corpus —
- how-to-use-this-corpus
- epa-signal-words
- rei-phi-fundamentals
- rup-handling
- supplemental-labels-24c-2ee
- tank-mix-fundamentals
- resistance-management-hrac-frac-irac
- glufosinate-application-rules
- dicamba-application-rules
- lake-erie-watershed-ohio
- scn-and-other-seed-treatment-context
- drift-management-essentials
- how-to-format-recommendations
Each Topic block is independently retrievable via the new MCP tool:
ppls_api_lessons(topic="rup-handling")
Or with no topic to get the full TOC, or with a substring to
match-and-return matching sections ("dicamba" → dicamba-application-rules).
Tool docstring instructs the LLM to call this proactively before any
pesticide recommendation so the recommendation lands with regulatory
framing, resistance-group callouts, RUP applicator language, and the
canonical recommendation format — not just a rate from a label.
## Phase 6 — Reranker moved to GPU on trashpanda
Stopped the local CPU container and started on trashpanda's Tesla P4
(8 GB VRAM) via:
docker run -d --name llama-rerank --restart unless-stopped --gpus all \
-p 8082:8080 \
ghcr.io/ggml-org/llama.cpp:server-cuda \
-hf gpustack/jina-reranker-v2-base-multilingual-GGUF:Q8_0 \
--reranking --host 0.0.0.0 --port 8080 -ngl 99
The :server-cuda image variant (not :server) is required for CUDA
backend; -ngl 99 offloads all layers to GPU.
Latency: 50-doc rerank dropped from ~23 s on CPU to ~0.7-1.5 s on
the Tesla P4 — production-grade interactive speeds.
deploy/rerank-docker.md updated with the trashpanda deploy recipe,
troubleshooting (mostly "did you use server-cuda?"), and a perf
reference table. The MCP server's RERANK_URL just points at
http://10.10.1.65:8082 now.
GPU eval still completing in background; results land in
eval/results/with_rerank_gpu.md as a follow-up commit.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
|
||
|
|
278fe5f456 |
Phase 6: reranker sidecar (jina-reranker-v2-base via llama.cpp)
Wires the docs_mcp/server.py reranker hook into a real backend:
ghcr.io/ggml-org/llama.cpp:server \\
-hf gpustack/jina-reranker-v2-base-multilingual-GGUF:Q8_0 \\
--reranking --host 0.0.0.0 --port 8080
Setup recipe at deploy/rerank-docker.md. The MCP server already
honors RERANK_URL (added in Phase 7+8 commit); setting it to
http://<host>:8082 turns on rerank automatically.
## Eval results (35 queries, k=5, pool=50)
| Retriever | MRR | Recall@5 | nDCG@5 |
|----------------|-------|----------|--------|
| dense | 0.027 | 0.086 | 0.041 |
| bm25 | 0.544 | 0.586 | 0.524 |
| hybrid-rrf | 0.114 | 0.114 | 0.108 |
| dense+rerank | 0.171 | 0.143 | 0.149 |
| hybrid+rerank | 0.672 | 0.638 | 0.621 | ← winner
The reranker fixes hybrid's failure mode (dense noise polluting
the fused pool) by scoring each (query, chunk) pair independently.
Net: hybrid+rerank gives +24% MRR over BM25-only.
Smoke test for the reranker itself (query: "soybean herbicide for
waterhemp", 4 candidates):
index=1 SENCOR metribuzin waterhemp soybean → score=0.84 ← right
index=3 Headline wheat fungicide → score=-2.80
index=2 Lorsban corn rootworm → score=-2.91
index=0 Roundup fallow burndown → score=-3.44
Strong separation between the right doc and the rest.
## Production gotchas
- CPU-only reranker is slow (~23s for a 50-doc pool). For
interactive use put it on GPU (`--gpus all`); ~10-20× faster.
- jina-reranker rejects the ENTIRE batch if any pair exceeds
n_ctx_train=1024 — server truncates each doc to 2000 chars
before sending. Already handled in _rerank_pool.
Per-query rerank report at eval/results/with_rerank.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
|