lily_fast_api / HISTORY.md
gbrabbit's picture
Fresh start for HF Spaces deployment
526927a
|
raw
history blame
6.59 kB
# Lily LLM RAG ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ ํžˆ์Šคํ† ๋ฆฌ
## ๐Ÿ“‹ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
- **๋ชฉํ‘œ**: PDF ๋ฌธ์„œ์˜ ์ˆ˜ํ•™ ๋ฌธ์ œ ํ•ด์„ ๋ฐ ํ•ด๊ฒฐ์„ ์œ„ํ•œ RAG ์‹œ์Šคํ…œ ๊ตฌ์ถ•
- **ํ™˜๊ฒฝ**: CPU ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ (GPU ์„œ๋ฒ„ ๋ฐฐํฌ ์ „ ํ…Œ์ŠคํŠธ)
- **์ ‘๊ทผ ๋ฐฉ์‹**: ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ RAG โ†’ ์ž‘์€ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ๋น ๋ฅธ ๊ฒ€์ฆ
## ๐Ÿ”„ ์ฃผ์š” ์ž‘์—… ํ๋ฆ„
### 1๋‹จ๊ณ„: ๊ธฐ์กด ๋ฌธ์ œ ๋ถ„์„
- **๋ฌธ์ œ**: Kanana ๋ชจ๋ธ์˜ ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ์ฒ˜๋ฆฌ์—์„œ ํ† ํฐ ID ์‘๋‹ต ๋ฌธ์ œ
- **์›์ธ**: CPU ํ™˜๊ฒฝ์—์„œ Kanana ๋ชจ๋ธ์˜ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ํ•œ๊ณ„
- **๊ฒฐ์ •**: ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ RAG๋กœ ์ „ํ™˜ํ•˜์—ฌ ์•ˆ์ •์„ฑ ํ™•๋ณด
### 2๋‹จ๊ณ„: ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ RAG ์‹œ์Šคํ…œ ๊ตฌ์ถ•
#### 2.1 PDF ํ…์ŠคํŠธ ์ถ”์ถœ ๊ฐœ์„ 
**ํŒŒ์ผ**: `lily_llm_core/document_processor.py`
```python
# ๋ณ€๊ฒฝ ์ „: ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜ OCR ์ฒ˜๋ฆฌ
def process_document(self, file_path: str) -> List[Document]:
if self.get_file_type(file_path) == 'pdf':
return self._process_pdf_as_images(file_path) # ์ด๋ฏธ์ง€ ๋ณ€ํ™˜
# ๋ณ€๊ฒฝ ํ›„: ํ…์ŠคํŠธ ์ง์ ‘ ์ถ”์ถœ
def process_document(self, file_path: str) -> List[Document]:
# ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ (๋ชจ๋“  ํŒŒ์ผ ํ˜•์‹)
documents = self.load_document(file_path)
split_docs = self.split_documents(documents)
return split_docs
```
#### 2.2 RAG ํ”„๋กœ์„ธ์„œ ๋‹จ์ˆœํ™”
**ํŒŒ์ผ**: `lily_llm_core/rag_processor.py`
```python
# ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ์ฒ˜๋ฆฌ ์ œ๊ฑฐ, ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹จ์ˆœํ™”
def generate_rag_response(self, user_id: str, document_id: str, query: str,
llm_model=None, image_files: List[str] = None) -> Dict[str, Any]:
# 1. ์œ ์‚ฌํ•œ ๋ฌธ์„œ ๊ฒ€์ƒ‰
similar_docs = vector_store_manager.search_similar(
user_id, document_id, query, k=self.max_search_results
)
# 2. ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์‘๋‹ต ์ƒ์„ฑ
return self._generate_text_response(query, similar_docs, llm_model, image_files)
```
#### 2.3 LLM ์—†์ด๋„ ์ž‘๋™ํ•˜๋Š” ๊ตฌ์กฐํ™”๋œ ์‘๋‹ต
```python
def _generate_text_response(self, query: str, text_docs: List[Document],
llm_model, image_files: List[str] = None) -> Dict[str, Any]:
# ์ปจํ…์ŠคํŠธ ๊ตฌ์„ฑ (์ž‘์€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๊ธธ์ด ์ œํ•œ)
context = self._build_context(text_docs)
if len(context) > 2000:
context = context[:2000] + "..."
# LLM ๋ชจ๋ธ์ด ์žˆ์œผ๋ฉด ์‘๋‹ต ์ƒ์„ฑ, ์—†์œผ๋ฉด ์ปจํ…์ŠคํŠธ๋งŒ ๋ฐ˜ํ™˜
if llm_model:
response = self._generate_with_llm_simple(prompt, llm_model)
else:
# ๊ตฌ์กฐํ™”๋œ ํ…์ŠคํŠธ ์‘๋‹ต ์ƒ์„ฑ
response = f"""๋ฌธ์„œ์—์„œ ๊ฒ€์ƒ‰๋œ ๊ด€๋ จ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ต๋ณ€๋“œ๋ฆฝ๋‹ˆ๋‹ค:
๐Ÿ“‹ ๊ฒ€์ƒ‰๋œ ๋‚ด์šฉ:
{context}
โ“ ์งˆ๋ฌธ: {query}
๐Ÿ’ก ๋‹ต๋ณ€: ์œ„ ๊ฒ€์ƒ‰๋œ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์ฐพ์•„๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค."""
```
### 3๋‹จ๊ณ„: ํ…Œ์ŠคํŠธ ์‹œ์Šคํ…œ ๊ตฌ์ถ•
#### 3.1 ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๋ฐ ๋ฌธ์„œ ์—…๋กœ๋“œ ํ…Œ์ŠคํŠธ
**ํŒŒ์ผ**: `test_simple_rag.py`
```python
def test_server_connection():
response = requests.get("http://localhost:8001/health", timeout=10)
return response.status_code == 200
def test_document_upload():
response = requests.post(
"http://localhost:8001/document/upload",
files=files,
data=data,
timeout=120
)
```
#### 3.2 ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ RAG ํ…Œ์ŠคํŠธ
**ํŒŒ์ผ**: `test_text_only_rag.py`
```python
def test_text_only_rag():
test_queries = [
"1๋ฒˆ ๋ฌธ์ œ",
"2๋ฒˆ ๋ฌธ์ œ",
"3๋ฒˆ ๋ฌธ์ œ",
"์ˆ˜ํ•™ ๋ฌธ์ œ"
]
for query in test_queries:
rag_data = {
'user_id': 'test_user',
'document_id': document_id,
'query': query
}
response = requests.post(
f"{base_url}/rag/generate",
data=rag_data,
timeout=60
)
```
#### 3.3 ๊ตฌ์ฒด์ ์ธ ์ˆ˜ํ•™ ๋ฌธ์ œ ์งˆ๋ฌธ ํ…Œ์ŠคํŠธ
**ํŒŒ์ผ**: `test_specific_questions.py`
```python
test_queries = [
"23๋ฒˆ ๋ฌธ์ œ์˜ ๋‹ต์€ ๋ฌด์—‡์ธ๊ฐ€์š”?",
"24๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์ฃผ์„ธ์š”",
"15๋ฒˆ ๋ฌธ์ œ์˜ ๋‹ต์„ ๊ตฌํ•ด์ฃผ์„ธ์š”",
"23๋ฒˆ ๋ฌธ์ œ์—์„œ 5๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ์ผ๋ ฌ๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š”?",
"24๋ฒˆ ๋ฌธ์ œ์—์„œ P(B)์˜ ๊ฐ’์€?"
]
```
### 4๋‹จ๊ณ„: ์„ฑ๊ณผ ํ™•์ธ
#### 4.1 ์„ฑ๊ณตํ•œ ๊ธฐ๋Šฅ๋“ค
- โœ… **PDF ํ…์ŠคํŠธ ์ถ”์ถœ ์™„๋ฒฝ**: ์‹ค์ œ ์ˆ˜ํ•™ ๋ฌธ์ œ ๋‚ด์šฉ ์ •ํ™•ํžˆ ์ถ”์ถœ
- โœ… **๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์™„๋ฒฝ**: ๊ด€๋ จ ๋ฌธ์ œ๋“ค์„ ์ •ํ™•ํžˆ ์ฐพ์•„๋ƒ„
- โœ… **๋น ๋ฅธ ์ฒ˜๋ฆฌ**: ์ฆ‰์‹œ ์‘๋‹ต (LLM ์—†์ด๋„ ์ž‘๋™)
- โœ… **๊ตฌ์กฐํ™”๋œ ์‘๋‹ต**: ๋ฌธ์ œ ๋ถ„์„๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ œ์‹œ
- โœ… **์ •ํ™•ํ•œ ๋ฌธ์ œ ๋งค์นญ**: 23๋ฒˆ, 24๋ฒˆ, 15๋ฒˆ ๋ฌธ์ œ ์ •ํ™•ํžˆ ์ฐพ์Œ
#### 4.2 ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ
- **๋ฌธ์„œ ์—…๋กœ๋“œ**: 12๊ฐœ ์ฒญํฌ ์„ฑ๊ณต
- **๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ**: 5๊ฐœ์”ฉ ์ •ํ™•ํžˆ ๋ฐ˜ํ™˜
- **์‘๋‹ต ์‹œ๊ฐ„**: ์ฆ‰์‹œ (ํ† ํฐ ID ๋ฌธ์ œ ํ•ด๊ฒฐ๋จ)
- **๋ฌธ์ œ ์ธ์‹**: ์‹ค์ œ ์ˆ˜ํ•™ ๋ฌธ์ œ ๋‚ด์šฉ ์ •ํ™•ํžˆ ์ถ”์ถœ
## ๐ŸŽฏ ์ตœ์ข… ์„ฑ๊ณผ
### ํ•ด๊ฒฐ๋œ ๋ฌธ์ œ๋“ค
1. โœ… **ํ† ํฐ ID ๋ฌธ์ œ**: ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด๊ฒฐ
2. โœ… **PDF ํ…์ŠคํŠธ ์ถ”์ถœ**: ์‹ค์ œ ๋ฌธ์ œ ๋‚ด์šฉ ์ถ”์ถœ ์„ฑ๊ณต
3. โœ… **๋น ๋ฅธ ๊ฒ€์ฆ**: ์ž‘์€ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ์„ฑ๊ณต
4. โœ… **๊ตฌ์กฐํ™”๋œ ์‘๋‹ต**: ๋ฌธ์ œ ๋ถ„์„๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ํฌํ•จ
### ํ˜„์žฌ ์ƒํƒœ
**"์ž‘์€ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ๋น ๋ฅธ ๊ฒ€์ฆ"** ๋ชฉํ‘œ ๋‹ฌ์„ฑ!
- CPU ํ™˜๊ฒฝ์—์„œ๋„ ๋น ๋ฅด๊ฒŒ ์ž‘๋™
- ์‹ค์ œ ์ˆ˜ํ•™ ๋ฌธ์ œ ๋‚ด์šฉ ์ •ํ™•ํžˆ ์ถ”์ถœ
- ๊ฒ€์ƒ‰๊ณผ ์ปจํ…์ŠคํŠธ ๋ฐ˜ํ™˜ ์™„๋ฒฝ ์ž‘๋™
- ๊ตฌ์กฐํ™”๋œ ์‘๋‹ต ์ƒ์„ฑ
**๋‹ค์Œ ๋‹จ๊ณ„**: ์„œ๋ฒ„์— ์˜ฌ๋ ค์„œ GPU๋กœ ์‹ค์‚ฌ์šฉ ์ค€๋น„ ์™„๋ฃŒ
## ๐Ÿ“ ์ฃผ์š” ์ˆ˜์ • ํŒŒ์ผ๋“ค
### Core ํŒŒ์ผ๋“ค
- `lily_llm_core/document_processor.py`: PDF ํ…์ŠคํŠธ ์ถ”์ถœ ๊ฐœ์„ 
- `lily_llm_core/rag_processor.py`: RAG ํ”„๋กœ์„ธ์„œ ๋‹จ์ˆœํ™”
- `lily_llm_api/app_v2.py`: ์—”๋“œํฌ์ธํŠธ ์ˆ˜์ •
### ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋“ค
- `test_simple_rag.py`: ๊ธฐ๋ณธ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ
- `test_text_only_rag.py`: ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ RAG ํ…Œ์ŠคํŠธ
- `test_specific_questions.py`: ๊ตฌ์ฒด์  ์งˆ๋ฌธ ํ…Œ์ŠคํŠธ
- `test_llm_rag.py`: LLM ํฌํ•จ ํ…Œ์ŠคํŠธ
## ๐Ÿ”ง ๊ธฐ์ˆ ์  ๊ฐœ์„ ์‚ฌํ•ญ
### 1. PDF ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ๋ณ€๊ฒฝ
- **์ด์ „**: ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜ OCR โ†’ ํ† ํฐ ID ๋ฌธ์ œ
- **ํ˜„์žฌ**: ํ…์ŠคํŠธ ์ง์ ‘ ์ถ”์ถœ โ†’ ์•ˆ์ •์  ์ฒ˜๋ฆฌ
### 2. RAG ํ”„๋กœ์„ธ์„œ ๋‹จ์ˆœํ™”
- **์ด์ „**: ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ๋ณต์žกํ•œ ์ฒ˜๋ฆฌ
- **ํ˜„์žฌ**: ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋‹จ์ˆœ ์ฒ˜๋ฆฌ
### 3. ์‘๋‹ต ๊ตฌ์กฐ ๊ฐœ์„ 
- **์ด์ „**: ํ† ํฐ ID ์‘๋‹ต
- **ํ˜„์žฌ**: ๊ตฌ์กฐํ™”๋œ ํ…์ŠคํŠธ ์‘๋‹ต
## ๐Ÿš€ ๋‹ค์Œ ๋‹จ๊ณ„ ์ œ์•ˆ
1. **GPU ์„œ๋ฒ„ ๋ฐฐํฌ**: ํ˜„์žฌ CPU ํ…Œ์ŠคํŠธ ์™„๋ฃŒ
2. **LLM ํ†ตํ•ฉ ๊ฐœ์„ **: ํ† ํฐ ๋””์ฝ”๋”ฉ ๋ฌธ์ œ ํ•ด๊ฒฐ
3. **์‹ค์ œ ๋ฌธ์ œ ํ•ด๊ฒฐ**: ์ˆ˜ํ•™ ๋ฌธ์ œ ํ’€์ด ๋Šฅ๋ ฅ ํ–ฅ์ƒ
4. **์„ฑ๋Šฅ ์ตœ์ ํ™”**: ๋” ํฐ ๋ฐ์ดํ„ฐ์…‹ ์ฒ˜๋ฆฌ