AI-Π°Π³Π΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π°ΡΡΠ΅Π½ΡΠΈΡΠ½ΠΎ ΠΈΠ³ΡΠ°Π΅Ρ ΡΠΎΠ»Ρ ΠΊΠ°ΡΡΠΈΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ White Star Line Π² Π°ΠΏΡΠ΅Π»Π΅ 1912 Π³ΠΎΠ΄Π°. ΠΠΎΡ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΏΠ°ΡΡΠ°ΠΆΠΈΡΠ°ΠΌ Π·Π°Π±ΡΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ Π±ΠΈΠ»Π΅ΡΡ Π½Π° ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ΅ΠΉΡ "Π’ΠΈΡΠ°Π½ΠΈΠΊΠ°", ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠΎΠ³ΡΡΠΆΠ°ΡΡΡ Π² ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΡΠΏΠΎΡ ΠΈ.
- ΠΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ²: LangGraph-based Π³ΡΠ°Ρ ΠΏΡΠΈΠ½ΡΡΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ
- RAG ΡΠΈΡΡΠ΅ΠΌΠ°: Retrieval-Augmented Generation Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΡΠ΅ΡΡΠΈΠ΅ΠΉ
- ΠΠ½ΠΎΠ³ΠΎΡΡΠΎΠ²Π½Π΅Π²Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°: ΠΠ΅ΡΠ΅ΠΊΡΠΎΡ Π°Π½Π°Ρ ΡΠΎΠ½ΠΈΠ·ΠΌΠΎΠ² + ΠΊΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΈΠ½ΡΠ΅Π½ΡΠΎΠ²
- ΠΠΎΠ½ΡΠ΅ΠΊΡΡΠ½Π°Ρ ΠΏΠ°ΠΌΡΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³Π°: Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΡΡΠΎΡΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅ΡΡΠΈΠΈ
- ΠΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π±Π°Π·Π° Π·Π½Π°Π½ΠΈΠΉ: 1,500+ ΡΠ°ΠΊΡΠΎΠ² ΠΎ Π’ΠΈΡΠ°Π½ΠΈΠΊΠ΅, ΡΠ΅Π½Π°Ρ , ΠΌΠ°ΡΡΡΡΡΠ°Ρ
graph TD
A[Frontend<br/>Vanilla JS] -->|HTTP/JSON| B[FastAPI Backend]
B --> C{LangGraph Router}
C -->|1. Anachronism Check| D[Anachronism Guard]
D -->|Detected| E[Simple Response]
D -->|Clean| F[Intent Classifier]
F -->|Complex Query| G[RAG Pipeline]
F -->|Simple Query| E
G --> H[ChromaDB<br/>Vector Store]
G --> I[OpenAI GPT-3.5]
subgraph "RAG Components"
G --> J[History-Aware Retriever]
J --> K[Contextual Compressor]
K --> L[LLM Chain Extractor]
end
B --> M[Session Memory Store]
style C fill:#f96,stroke:#333,stroke-width:4px
style G fill:#9cf,stroke:#333,stroke-width:2px
# Π£ΠΏΡΠΎΡΠ΅Π½Π½Π°Ρ ΡΡ
Π΅ΠΌΠ° Π³ΡΠ°ΡΠ° ΠΏΡΠΈΠ½ΡΡΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ
StateGraph:
1. Entry Point β Anachronism Guard
2. Anachronism Guard β {
- If anachronism detected β Simple Response
- Else β Intent Classifier
}
3. Intent Classifier β {
- price/schedule/greeting β Simple Response
- complex/capacity β RAG Node
}
4. Response Generation β End
- Framework: FastAPI 0.111.1
- AI/ML:
- LangChain 0.3.25 (ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ)
- LangGraph 0.3.2 (Π³ΡΠ°Ρ ΠΏΡΠΈΠ½ΡΡΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ)
- OpenAI GPT-3.5-turbo (ΡΠ·ΡΠΊΠΎΠ²Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ)
- Vector Database: ChromaDB 0.4.15
- Session Management: In-memory chat history store
# ΠΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π½Π° Π°Π½Π°Ρ
ΡΠΎΠ½ΠΈΠ·ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ
class AnachronismCheck(BaseModel):
is_anachronism: bool = Field(
description="True Π΅ΡΠ»ΠΈ Π²ΠΎΠΏΡΠΎΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π°Π½Π°Ρ
ΡΠΎΠ½ΠΈΠ·ΠΌΡ"
)
# ΠΠ»Π°ΡΡΠΈΡΠΈΡΠΈΡΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΡ ΠΏΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ
class QueryClassifier(BaseModel):
intent_type: Literal[
"price", "schedule", "greeting",
"small_talk", "safety", "capacity",
"off_topic", "complex"
]
- Embeddings: OpenAI text-embedding-ada-002
- Retrieval: History-aware Ρ ΠΏΠ΅ΡΠ΅ΡΠΎΡΠΌΡΠ»ΠΈΡΠΎΠ²ΠΊΠΎΠΉ Π·Π°ΠΏΡΠΎΡΠΎΠ²
- Compression: LLMChainExtractor Π΄Π»Ρ ΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΎΡΠ²Π΅ΡΠΎΠ²
- Context Window: ΠΠΎ 10 ΡΠ΅Π»Π΅Π²Π°Π½ΡΠ½ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ²
- Π‘ΡΠΈΠ»ΠΈΠ·Π°ΡΠΈΡ: ΠΡΡΠ΅Π½ΡΠΈΡΠ½ΡΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ ΡΠΏΠΎΡ ΠΈ 1912 Π³ΠΎΠ΄Π°
- ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ:
- ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² ΠΈΠ· RAG
- ΠΠ΄Π°ΠΏΡΠΈΠ²Π½ΡΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½
- Python 3.9+
- OpenAI API Key
- 2GB ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ (Π΄Π»Ρ ChromaDB)
# ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
git clone https://github.com/spqr-86/titanic-booking-ai.git
cd titanic-booking-ai
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
python -m venv venv
source venv/bin/activate # ΠΠ»Ρ Windows: venv\Scripts\activate
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
pip install -r backend/requirements.txt
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
cp .env.example .env
# ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π²Π°Ρ OPENAI_API_KEY Π² .env ΡΠ°ΠΉΠ»
# ΠΠ°ΠΏΡΡΠΊ backend
cd backend
uvicorn main:app --reload --port 8000
# Π Π½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅ - Π·Π°ΠΏΡΡΠΊ frontend
cd frontend
python -m http.server 3000
OPENAI_API_KEY=your_api_key_here
USE_LANGGRAPH_ROUTER=True # ΠΠΊΠ»ΡΡΠΈΡΡ LangGraph ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ
ENVIRONMENT=development # ΠΈΠ»ΠΈ production
PORT=8000 # ΠΠΎΡΡ Π΄Π»Ρ backend
ΠΠ΅ΡΡΠΈΠΊΠ° | ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ | ΠΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ |
---|---|---|
ΠΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠΎΡΠ½ΠΎΡΡΡ | 87% | Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° 60+ ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ°ΠΊΡΠ°Ρ |
ΠΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ Π°Π½Π°Ρ ΡΠΎΠ½ΠΈΠ·ΠΌΠΎΠ² | 92% | 100+ ΡΠ΅ΡΡΠΎΠ²ΡΡ ΡΠ»ΡΡΠ°Π΅Π² |
ΠΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΡΠΎΠ½Π°ΠΆΠ° | 95% | ΠΠ½Π°Π»ΠΈΠ· 200+ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ² |
Π‘ΠΊΠΎΡΠΎΡΡΡ ΠΎΡΠ²Π΅ΡΠ° (RAG) | ~2.5 ΡΠ΅ΠΊ | Π‘ΡΠ΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Ρ ΠΏΠΎΠΈΡΠΊΠΎΠΌ |
Π‘ΠΊΠΎΡΠΎΡΡΡ ΠΎΡΠ²Π΅ΡΠ° (Simple) | ~0.8 ΡΠ΅ΠΊ | ΠΠ΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ RAG |
π data/knowledge/
βββ titanic_specifications.txt (8.2 KB)
βββ cabin_details.txt (7.5 KB)
βββ historical_facts.txt (6.8 KB)
βββ anachronism_guard_prompt.txt (2.1 KB)
βββ ...
Total: ~45 KB ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΡ
Π΄Π°Π½Π½ΡΡ
# ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅/Π²ΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ LangGraph ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΠΈ
USE_LANGGRAPH_ROUTER = os.getenv("USE_LANGGRAPH_ROUTER", "True")
# ΠΡΠΈ False ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΡΠΌΠΎΠΉ RAG Π±Π΅Π· ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΠΈ
# LLM Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
llm_classifier = ChatOpenAI(
model="gpt-4o-mini",
temperature=0
)
# LLM Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΎΡΠ²Π΅ΡΠΎΠ²
llm_generation = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.8
)
# ΠΠ°ΠΏΡΡΠΊ ΡΠ΅ΡΡΠΎΠ²
cd backend
pytest tests/
# Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΎΡΠ½ΠΎΡΡΠΈ
pytest tests/historical_accuracy/
# Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ API endpoints
pytest tests/test_api.py
- ΠΠΎΠ±Π°Π²ΠΈΡΡ streaming responses Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΠ»Π°Π²Π½ΠΎΠ³ΠΎ UX
- ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ Π½Π° ΠΏΠ΅ΡΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΡΠ΅ΡΡΠΈΠΉ (Redis) Π΄Π»Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠ΅ΡΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ² ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ΅
- Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ multi-agent ΡΠΈΡΡΠ΅ΠΌΡ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΡΠΎΠ»Π΅ΠΉ ΡΠΊΠΈΠΏΠ°ΠΆΠ°
- ΠΠΎΠ±Π°Π²ΠΈΡΡ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠ°ΡΡ ΠΈ ΠΏΠ°Π»ΡΠ±
- ΠΠ½Π΅Π΄ΡΠΈΡΡ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ²
- Π Π°ΡΡΠΈΡΠΈΡΡ Π±Π°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΡΠΎΡΠΎΠ³ΡΠ°ΡΠΈΡΠΌΠΈ
- ΠΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π³ΠΎΠ»ΠΎΡΠΎΠ²ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
- Encyclopedia Titanica