Anti-Hallucination / README.md
MHRDYN7's picture
Deploy Anti-Hallucination Chat
cea2150 verified
|
Raw
History Blame Contribute Delete
3.68 kB
metadata
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

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:

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

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. 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)

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.
  • 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

uv run python -m pytest tests/ -q