ํ์ผ ๊ด๋ฆฌ ๋ฐ ์๋ํ๋ฅผ ์ํ AI ๊ธฐ๋ฐ ๊ท์น ์์ฑ ์์คํ ์ ๋๋ค. ์ฌ์ฉ์์ ์์ฐ์ด ์ ๋ ฅ์ ํตํด ํ์ผ ์ฒ๋ฆฌ ์กฐ๊ฑด๊ณผ ์ก์ ์ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.
์ฌ์ฉ์ ์
๋ ฅ
โ
์ ๋ณด ์ถฉ๋ถ์ฑ ์ฒดํฌ (Claude 3.5 Sonnet)
โ โ
๋ถ์กฑ์: ์ถ๊ฐ ์ง๋ฌธ ์์ฑ ์ถฉ๋ถ์: ๋ฒกํฐ ๊ฒ์ ์์
โ โ
์ฌ์ฉ์ ์๋ต ๋๊ธฐ pgvector + Titan ์๋ฒ ๋ฉ
โ
๊ด๋ จ ์กฐ๊ฑด/์ก์
๊ฒ์
โ
์์ ํ ๊ท์น ์์ฑ (JSON)
โ
์ธ์
์๋ฃ & ์๋ต ๋ฐํ
Filient2/
โโโ ๐ณ docker-compose.yml # Redis + PostgreSQL + pgvector
โโโ ๐ requirements.txt # Python ํจํค์ง ์์กด์ฑ
โโโ ๐ .env # ํ๊ฒฝ ๋ณ์ ์ค์
โโโ ๐ main.py # FastAPI ๋ฉ์ธ ์๋ฒ (๊ฐ์ ๋ ํ๋ก์ฐ)
โ
โโโ โ๏ธ config.py # ์ค์์ง์ค์ ์ค์ ๊ด๋ฆฌ (์ ๊ท)
โโโ ๐ ๏ธ utils.py # ๊ณตํต ์ ํธ๋ฆฌํฐ ํจ์ (์ ๊ท)
โโโ ๐ rule_data.py # ์กฐ๊ฑด/์ก์
๋ฐ์ดํฐ ์ ์
โโโ ๐ vector_loader.py # ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ก๋ (๊ฐ์ )
โ
โโโ ๐ database/
โ โโโ models.py # SQLAlchemy ๋ชจ๋ธ ์ ์
โ โโโ connection.py # ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ค์
โ
โโโ ๐ services/
โ โโโ session_service.py # ์ธ์
/๋ํ ๊ด๋ฆฌ (LangChain ๋ฉ๋ชจ๋ฆฌ)
โ โโโ rule_service.py # ๊ท์น ์์ฑ ๋ก์ง (์์ ์ฌ์์ฑ)
โ โโโ retriever_service.py # ๋ฒกํฐ ๊ฒ์ ์๋น์ค (๊ฐ์ )
โ
โโโ ๐ api/
โโโ schemas.py # Pydantic ์คํค๋ง ์ ์
- Backend: FastAPI, Python 3.8+
- AI/ML: AWS Bedrock Claude 3.5 Sonnet, Titan Embeddings V2
- Database: PostgreSQL with pgvector extension
- Cache: Redis
- Vector Search: LangChain + PGVector
- Infrastructure: Docker Compose
ํ๊ฒฝ ๋ณ์ ์ค์ (.env ํ์ผ ์์ฑ):
# .env ํ์ผ ์์ฑ
touch .env
.env ํ์ผ ๋ด์ฉ:
# AWS ์ค์ (Bedrock ์๋น์ค ์ ๊ทผ์ฉ)
AWS_ACCESS_KEY_ID=your_aws_access_key
AWS_SECRET_ACCESS_KEY=your_aws_secret_key
AWS_DEFAULT_REGION=ap-northeast-2
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
DATABASE_URL=postgresql://filient_user:filient_password@localhost:5432/filient
# Redis ์ค์
REDIS_URL=redis://localhost:6379/0
Python ๊ฐ์ํ๊ฒฝ ๋ฐ ํจํค์ง ์ค์น:
# ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ํ์ฑํ
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# ํจํค์ง ์ค์น
pip install -r requirements.txt
# Docker Compose๋ก PostgreSQL, Redis ์คํ
docker-compose up -d
# ์๋น์ค ์ํ ํ์ธ
docker-compose ps
# PostgreSQL์ pgvector ํ์ฅ ์ค์น ํ์ธ
psql -h localhost -U filient_user -d filient -c "CREATE EXTENSION IF NOT EXISTS vector;"
# ๊ท์น ๋ฐ์ดํฐ๋ฅผ ๋ฒกํฐ DB์ ๋ก๋ (ํ์)
python vector_loader.py
์ด ๋จ๊ณ๋ AI๊ฐ ์ฌ์ฉ์ ์์ฒญ์ ๋ง๋ ์กฐ๊ฑด๊ณผ ์ก์ ์ ์ฐพ๊ธฐ ์ํด ๋ฐ๋์ ํ์ํฉ๋๋ค.
# FastAPI ์๋ฒ ์์
python main.py
# ๋๋ uvicorn ์ง์ ์คํ
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
์๋ฒ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์๋๋ฉด http://localhost:8000์์ ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.
์๋ฒ ์คํ ํ ๋ค์ URL์์ ์๋ ์์ฑ๋ API ๋ฌธ์๋ฅผ ํ์ธํ ์ ์์ต๋๋ค:
- Swagger UI:
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc
GET /health
POST /chat
Content-Type: application/json
{
"user_uuid": "550e8400-e29b-41d4-a716-446655440000",
"session_id": null,
"message": "pdf ํ์ผ๋ค์ Documents ํด๋๋ก ์ฎ๊ฒจ์ค",
"session_name": "PDF ์ ๋ฆฌ ๊ท์น"
}
GET /users/{user_uuid}/sessions
GET /sessions/{session_id}/messages
Filient2๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ ๋ณด ์ถฉ๋ถ์ฑ์ ๋จผ์ ์ฒดํฌํ๊ณ , ์ ๋ณด๊ฐ ๋ถ์กฑํ๋ฉด ์ง๋ฌธ์ ์์ฑํ๊ณ , ์ถฉ๋ถํ๋ฉด ๋ฐ๋ก ๊ท์น์ ์์ฑํฉ๋๋ค.
์์ 1: ์ ๋ณด ๋ถ์กฑ ์ ์ง๋ฌธ ์์ฑ
curl -X POST "http://localhost:8000/chat" \
-H "Content-Type: application/json" \
-d '{
"user_uuid": "user123",
"message": "PDF ํ์ผ๋ค์ ์ ๋ฆฌํด์ค"
}'
์๋ต:
{
"session_id": "abc123-def456",
"response": "ํ์ผ ์๋ํ ๊ท์น์ ๋ง๋ค๊ธฐ ์ํด ์ถ๊ฐ ์ ๋ณด๊ฐ ํ์ํฉ๋๋ค:\n\nโข PDF ํ์ผ๋ค์ ์ด๋๋ก ์ด๋ํ๊ฑฐ๋ ๋ฐฐ์นํ๊ณ ์ถ์ผ์ ๊ฐ์?\nโข ํน์ ์กฐ๊ฑด(๋ ์ง, ํฌ๊ธฐ ๋ฑ)์ด ์๋์?\n\n๋ ๊ตฌ์ฒด์ ์ผ๋ก ์๋ ค์ฃผ์๋ฉด ์ ํํ ๊ท์น์ ๋ง๋ค์ด๋๋ฆด๊ฒ์!",
"rule": null,
"needs_clarification": true
}
์์ 2: ์ ๋ณด ์ถฉ๋ถ ์ ์ฆ์ ๊ท์น ์์ฑ
curl -X POST "http://localhost:8000/chat" \
-H "Content-Type: application/json" \
-d '{
"user_uuid": "user123",
"session_id": "abc123-def456",
"message": "PDF ํ์ผ๋ค์ Documents ํด๋๋ก ์ด๋ํด์ค"
}'
์ต์ข ์๋ต (์์ฑ๋ ๊ท์น):
{
"session_id": "abc123-def456",
"response": "โ
ํ์ผ ์๋ํ ๊ท์น์ด ์์ฑ๋์์ต๋๋ค!\n\nPDF ํ์ผ๋ค์ Documents ํด๋๋ก ์๋ ์ด๋ํฉ๋๋ค.",
"rule": {
"conditions": [
{
"condition_type": "extension",
"condition_details": {
"extensions": ["pdf"],
"groups": ["๋ฌธ์"],
"match_mode": "any"
}
}
],
"actions": [
{
"action_type": "move",
"action_details": {
"destination": "Documents",
"create_folder": true,
"conflict_resolution": "rename"
},
"execution_order": 1
}
]
},
"session_completed": true,
"needs_clarification": false
}
# ์๋ฒ ์ํ ํ์ธ
curl http://localhost:8000/health
# ๊ฐ๋จํ ๋ํ ํ
์คํธ
curl -X POST "http://localhost:8000/chat" \
-H "Content-Type: application/json" \
-d '{"user_uuid": "test", "message": "ํ
์คํธ ๋ฉ์์ง"}'
- ๊ฐ๋จํ ํ์ผ ์ด๋: "์ด๋ฏธ์ง ํ์ผ๋ค์ Pictures ํด๋๋ก ์ฎ๊ฒจ์ค"
- ๋ ์ง ๊ธฐ๋ฐ ์ ๋ฆฌ: "์ต๊ทผ 7์ผ ์ด๋ด์ ๋ง๋ ๋ฌธ์๋ค์ ๋ ์ง๋ณ๋ก ์ ๋ฆฌํด์ค"
- ํฌ๊ธฐ ๊ธฐ๋ฐ ํํฐ๋ง: "100MB๋ณด๋ค ํฐ ๋น๋์ค ํ์ผ์ '๋์ฉ๋' ํ๊ทธ ์ถ๊ฐํด์ค"
- ๋ณตํฉ ์กฐ๊ฑด: "ํ์ผ๋ช ์ 'temp'๊ฐ ๋ค์ด์๋ ํ์ผ๋ค์ ์ญ์ ํด์ค"
- ๋ชจ๋ ์ค์ ๊ฐ์ ์ค์์ง์ค์ ๊ด๋ฆฌ
- ํ๊ฒฝ๋ณ์ ๊ธฐ๋ฐ ์ค์ ๋ก๋
- AI ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ ๋ฐ ํ๋กฌํํธ ํ ํ๋ฆฟ ๊ด๋ฆฌ
- ์ ๋ณด ์ถฉ๋ถ์ฑ ์ฒดํฌ: ์ฌ์ฉ์ ์ ๋ ฅ ๋ถ์์ผ๋ก ์ถ๊ฐ ์ง๋ฌธ ํ์ ์ฌ๋ถ ํ๋จ
- ์ง๋ฌธ ์์ฑ: ๋ถ์กฑํ ์ ๋ณด ์นดํ ๊ณ ๋ฆฌ์ ๋ํ ๋ง์ถคํ ์ง๋ฌธ ์์ฑ
- ๊ท์น ์์ฑ: ๋ฒกํฐ ๊ฒ์ ๊ฒฐ๊ณผ์ ํจ๊ป ์์ ํ ๊ท์น JSON ์์ฑ
- PGVector ๊ธฐ๋ฐ ์ ์ฌ๋ ๊ฒ์: ์กฐ๊ฑด/์ก์ ๋ณ ๋ถ๋ฆฌ๋ ๊ฒ์
- ์ปจํ ์คํธ ์์ถ: LLM ๊ธฐ๋ฐ ์์ถ์ผ๋ก ์ ํ๋ ํฅ์
- ํตํฉ ๊ฒ์: ์กฐ๊ฑด๊ณผ ์ก์ ์ ๋์์ ๊ฒ์ํ์ฌ ๊ฒฐํฉ๋ ๊ฒฐ๊ณผ ์ ๊ณต
- Redis ๊ธฐ๋ฐ LangChain ๋ฉ๋ชจ๋ฆฌ: ์ค์๊ฐ ๋ํ ์ปจํ ์คํธ ๊ด๋ฆฌ
- PostgreSQL ์๊ตฌ ์ ์ฅ: ๋ชจ๋ ๋ํ ํ์คํ ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ
- ์ธ์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ: ์์ฑ, ์ ๋ฐ์ดํธ, ์๋ฃ ์ํ ์ถ์
์ฌ์ฉ์ ์
๋ ฅ โ AI ๋ถ์ โ ์ ๋ณด ์ถฉ๋ถ์ฑ ํ๋จ
โ โ
๋ถ์กฑ์: ์ถ๊ฐ ์ง๋ฌธ ์์ฑ ์ถฉ๋ถ์: ๊ท์น ์์ฑ์ผ๋ก ์งํ
์ฌ์ฉ์ ์๊ตฌ์ฌํญ โ Titan ์๋ฒ ๋ฉ โ pgvector ์ ์ฌ๋ ๊ฒ์
โ
๊ด๋ จ ์กฐ๊ฑด/์ก์
๊ท์น ๊ฒ์ โ AI์ ์ปจํ
์คํธ ์ ๊ณต
์ถฉ๋ถํ ์ ๋ณด + ๊ฒ์๋ ์ปจํ
์คํธ โ Claude 3.5 Sonnet
โ
์์ ํ ํ์ผ ์๋ํ ๊ท์น JSON ์์ฑ โ ์ฌ์ฉ์์๊ฒ ๋ฐํ
๋ฌธ์ : "You don't have access to the model"
ํด๊ฒฐ: AWS ์ฝ์ โ Bedrock โ Model access์์ Claude ๋ฐ Titan ๋ชจ๋ธ ํ์ฑํ
ํด๊ฒฐ: docker-compose down -v && docker-compose up -d
ํด๊ฒฐ: AWS ์๊ฒฉ์ฆ๋ช ๋ฐ ๋ฆฌ์ (ap-northeast-2) ํ์ธ
| ๋ณ์๋ช | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
AWS_DEFAULT_REGION |
AWS ๋ฆฌ์ | ap-northeast-2 |
AWS_ACCESS_KEY_ID |
AWS ์ก์ธ์ค ํค | - |
AWS_SECRET_ACCESS_KEY |
AWS ์ํฌ๋ฆฟ ํค | - |
DATABASE_URL |
PostgreSQL ์ฐ๊ฒฐ URL | postgresql://localhost:5432/filient |
REDIS_URL |
Redis ์ฐ๊ฒฐ URL | redis://localhost:6379/0 |
- Extension: ํ์ผ ํ์ฅ์/์ข ๋ฅ ๊ธฐ๋ฐ (PDF, ์ด๋ฏธ์ง, ๋์์ ๋ฑ)
- Name: ํ์ผ๋ช ํจํด ๊ธฐ๋ฐ ํํฐ๋ง
- Date: ์์ฑ/์์ ๋ ์ง ๊ธฐ๋ฐ ํํฐ๋ง
- Size: ํ์ผ ํฌ๊ธฐ ๊ธฐ๋ฐ ํํฐ๋ง
- Tag: macOS ํ๊ทธ ๊ธฐ๋ฐ ํํฐ๋ง
- Move: ํ์ผ/ํด๋ ์ด๋
- Copy: ํ์ผ/ํด๋ ๋ณต์ฌ
- Delete: ํ์ผ ์ญ์ (ํด์งํต ๋๋ ์์ ์ญ์ )
- Rename: ํ์ผ๋ช ๋ณ๊ฒฝ
- Sort: ๋ ์ง๋ณ/์ข ๋ฅ๋ณ ์๋ ์ ๋ฆฌ
- Tags: ํ๊ทธ ์ถ๊ฐ/์ ๊ฑฐ
- ์๋ฒ ๋ฉ ๋ชจ๋ธ: AWS Titan Text Embeddings V2 (1024์ฐจ์)
- AI ๋ชจ๋ธ: AWS Bedrock Claude 3.5 Sonnet
- ๋ฒกํฐ ๊ฒ์: ~100-200ms (pgvector ์ต์ ํ)
- AI ์๋ต ์์ฑ: ~2-5์ด
- ๋์ ์ฌ์ฉ์: AWS ํ ๋น๋ ๋ด ๋ฌด์ ํ
rule_data.py์ ์ ๊ท์น ๋ฐ์ดํฐ ์ ์python vector_loader.py์คํํ์ฌ ๋ฒกํฐ DB ์ ๋ฐ์ดํธconfig.py์PromptTemplates์ ๊ด๋ จ ํ๋กฌํํธ ์ถ๊ฐ
config.py์์ ๋ชจ๋ธ ID ์ค์ - ๊ฐ ์๋น์ค์์ ๋ชจ๋ธ๋ณ ํ๋ผ๋ฏธํฐ ์กฐ์
- ํ๋กฌํํธ ํ ํ๋ฆฟ ๋ชจ๋ธ๋ณ ์ต์ ํ
๊ฐ๋ฐ์: Claude + Human Collaboration
๋ฒ์ : 1.0.0
๋ผ์ด์ ์ค: MIT