neuron-explorer
Qwen3.5‑4B 전용 조향형 뉴런 탐색기, 모든 MLP 뉴런을 밀어 결과를 보관·탐색
RagPilot에 URL을 입력하면 크롤링·인덱싱 후 근거와 출처를 제시하며 방문자 질문에 정확히 답합니다
Give RagPilot a URL and it crawls, indexes, and answers your visitors with grounded, cited replies — no hallucinated prices, no wrong pitches, no forgetting the conversation.
개발 도구TypeScript · PythonGitHub @CodeWithUmair온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Multi-tenant RAG chatbot platform: FastAPI + LangGraph + pgvector backend, Next.js dashboard and embeddable widget
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Train a chatbot on any website in minutes, embed it with one script tag, and
let it answer visitors with grounded, streamed replies while capturing leads.
• Backend: FastAPI · SQLAlchemy 2.0 (async) · Postgres + pgvector · LangGraph · OpenAI-compatible models
• Frontend: Next.js dashboard + embeddable widget
• Live: coming soon at https://rag.umairamir.com (API docs at /docs)
• Project docs: docs/ — architecture, API contract, decisions, roadmap (start here)
The answering path is a LangGraph state machine (backend/app/rag/graph.py):README 전문 보기 ↗Train a chatbot on any website in minutes, embed it with one script tag, and let it answer visitors with grounded, streamed replies while capturing leads.
/docs)docs/ — architecture, API contract, decisions, roadmap (start here)flowchart LR
subgraph Training
A[Website URL] --> B[sitemap.xml + BFS crawl<br/>robots.txt, 5 concurrent]
B --> C[Strip nav/footer/cookie chrome<br/>heading-aware sections, FAQ pairing]
C --> D[Drop boilerplate + duplicate chunks<br/>BEFORE paying to embed]
D --> E[Batch embed<br/>text-embedding-3-small @1024d]
E --> F[(pgvector<br/>HNSW cosine index<br/>namespace = chatbot)]
end
subgraph "Answering (LangGraph)"
Q[Visitor question] --> G[recall → route → retrieve ⇄ rewrite → generate → capture_lead]
F --> G
G --> S[SSE token stream to widget]
end
The answering path is a LangGraph state machine (backend/app/rag/graph.py):
START → recall → route ─┬─ smalltalk ─────────────────────────────────┐
└─ knowledge → retrieve ─┬─ confident ────────┤
▲ ├─ weak follow-up → rewrite
└───────────────┘ (max 1 retry) │
generate → capture_lead → END
| Node | What it does | Problem it solves |
|---|---|---|
recall | Loads what we already know about the visitor (lead captured earlier) + details typed now | Bot re-asking for an email the visitor already gave |
route | Greetings/thanks skip retrieval | "hi" paying for an embedding and pulling random chunks into the prompt |
retrieve | pgvector top-40 → noise floor → hybrid rerank → dedupe → relative-score gate | Hallucination from footer/nav pollution; adjacent-topic bleed ("AI services" answered with blockchain offerings) |
rewrite | Turns a weak follow-up ("how much is it?") into a standalone query using the conversation, then retries retrieval once | Follow-ups embedded verbatim retrieve nothing, so the bot "forgets" what it just described |
generate | Streams tokens through LangGraph's stream writer → SSE | — |
capture_lead | Silently captures volunteered contact details; shows the form only on real intent, after a qualifying turn, when we still can't reach them | Form popping on the first message / asking for details just typed |
Each decision is a small node, unit-tested with fake models (tests/test_graph.py) — no API key or database needed.
Every chatbot gets a random 32-hex embed token that doubles as its knowledge
namespace. Every vector query filters by it, and every dashboard route checks
ownership (tests/integration/test_api.py::test_tenant_isolation).
backend/
app/
main.py FastAPI app, routers, lifespan
core/ settings (pydantic-settings), errors, dual CORS policy
auth/ Better-Auth-compatible auth: scrypt passwords, signed bearer sessions, Google OAuth
api/ routers: chat (SSE), chatbots, scrape (SSE), leads, analytics, users/admin
rag/ graph.py (LangGraph), retrieval.py, prompts.py, providers.py, vector_store.py
ingest/ crawler, HTML extraction/chunking, file parsing
services/ email, lead capture + forwarding (email / webhook / Google Sheet)
db/ SQLAlchemy models + async session
alembic/ migrations (idempotent initial schema — runs on the legacy DB too)
tests/ unit + graph tests; integration/ runs against real Postgres
frontend/ Next.js dashboard + widget
deploy/ nginx + VPS guide
docker compose -f docker-compose.dev.yml up -d # Postgres + pgvector on :5432
cd backend
cp .env.example .env # set OPENAI_API_KEY, AUTH_SECRET
uv sync
uv run alembic upgrade head
uv run fastapi dev app/main.py --port 4000 # http://localhost:4000/docs
cd ../frontend
cp .env.example .env.local
pnpm install && pnpm dev # http://localhost:3000
Tests:
cd backend
uv run pytest -q # unit + graph (integration auto-skips without a DB)
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/ragpilot uv run pytest -q tests/integration
Any OpenAI-compatible provider works: set OPENAI_BASE_URL, OPENAI_CHAT_MODEL
and an embedding model that returns 1024 dimensions.
One VPS, Docker Compose, nginx + certbot in front. See deploy/README.md.
Ingestion and the chat graph depend on the VectorStore protocol in
backend/app/rag/vector_store.py, not on pgvector. A Qdrant/Pinecone/Weaviate
backend is one class implementing upsert, search, delete_namespace and
count, with the namespace as the tenant filter.