Anti-Hallucination / README.md
MHRDYN7's picture
Deploy Anti-Hallucination Chat
cea2150 verified
|
Raw
History Blame Contribute Delete
3.68 kB
---
title: Anti-Hallucination Chat
emoji: 💬
colorFrom: blue
colorTo: green
sdk: docker
app_port: 7860
python_version: "3.12"
short_description: Grounded chat + on-demand claim audit
---
# Anti-Hallucination Chat
Freely chat with Flash-Lite (no tools), then press **Hallucination check** to
progressively rewrite the conversation into searched bullets and judge which
points look supported, uncertain, or contradicted.
## Local run
```bash
cp .env.example .env # set GOOGLE_API_KEY
uv sync
uv run streamlit run app.py
```
On Cursor Cloud, if the preview looks stale after edits, restart Streamlit
(hard browser reload is not enough). See `.cursor/CURSOR_CLOUD_STREAMLIT.md`.
Optional env:
```bash
CHAT_MODEL=gemini-3.1-flash-lite # main chat only
AUDIT_MODEL=gemini-3.5-flash-lite # claim extract + judge + search planner
SEARCH_MODEL=gemma-4-26b-a4b-it # web_search tool only (Google Search grounding)
CHAT_SYSTEM_PROMPT=You are a helpful assistant. Be accurate and clear.
AUDIT_USE_WEB_SEARCH=true # fact-check assistant bullets online
AUDIT_WEB_SEARCH_PARALLEL=6 # concurrent per-bullet tool calls
```
## Workflow
1. Chat normally — the main reply **streams** token-by-token.
2. As soon as each reply finishes, a background auditor extracts bullets, then a
**Gemma search agent** (with full conversation context) emits one enriched
`web_search` tool call per bullet and runs those calls **in parallel**.
3. Click **Hallucination check** to **reveal** that audit stream (it does not
start the audit — it only makes the already-running/finished stream visible).
4. Colors mean:
- green = confirmed by search
- orange = cannot prove or disprove
- red = contradicted by search
plus a report with sources.
## Hugging Face Spaces
This app ships as a **Docker Space** (Streamlit on port **7860**).
`GOOGLE_API_KEY` must be a Space **secret** (not committed).
### One-shot deploy
```bash
cd hallucination
export HF_TOKEN=hf_... # write token
export GOOGLE_API_KEY=... # Gemini key → Space secret
# optional override:
# export SPACE_ID=another-user/another-space
# export SPACE_PRIVATE=1
bash scripts/deploy_hf_space.sh
```
The checked-in `.hf-space-id` points to the currently deployed personal Space:
[`MHRDYN7/sandbox-a049dee5`](https://huggingface.co/spaces/MHRDYN7/sandbox-a049dee5).
Re-running the command above updates that same Space. `SPACE_ID` takes precedence
when you intentionally want to deploy elsewhere.
The script will:
1. Read the target from `SPACE_ID`, then `.hf-space-id`, then the HF username fallback
2. Update the existing Space, or create a public Docker Space if it does not exist
3. Upload app files (excluding `.env`, tests, caches)
4. Set the `GOOGLE_API_KEY` secret on the Space
Current app: https://mhrdyn7-sandbox-a049dee5.hf.space
### Manual steps (equivalent)
```bash
uv export --no-hashes --no-dev -o requirements.txt
hf auth login # or export HF_TOKEN=...
hf repos create YOUR_NS/anti-hallucination-chat --type space --space-sdk docker --public --exist-ok
hf upload YOUR_NS/anti-hallucination-chat . --type space \
--exclude ".env" --exclude ".venv/**" --exclude ".cursor/**" --exclude "tests/**"
hf spaces secrets add YOUR_NS/anti-hallucination-chat --secrets GOOGLE_API_KEY=YOUR_KEY
```
### Notes
- New Gradio/Docker Spaces on free CPU may require [HF PRO](https://huggingface.co/pro).
- Optional public variables: `CHAT_MODEL`, `AUDIT_MODEL`, `SEARCH_MODEL`, `AUDIT_USE_WEB_SEARCH`.
- Rebuild after code changes by re-running the deploy script (or `hf upload ...`).
## Tests
```bash
uv run python -m pytest tests/ -q
```