| # QP Search System |
|
|
| ๋ฐ๋์ฒด ์ ์กฐ ๊ณต์ ๋ฌธ์(QP) ๊ฒ์์ ์ํ ๋ฉํฐ๋ชจ๋ฌ RAG ํ์ดํ๋ผ์ธ. LangGraph ๊ธฐ๋ฐ StateGraph๋ก ๊ตฌํ๋๋ฉฐ, ๋ณต์ก๋ ๊ธฐ๋ฐ ์ ๋ต ๋ถ๊ธฐ โ ๋ฉํฐ์ฟผ๋ฆฌ ์์ฑ โ ํ
์คํธ/๋น์ ๋ณ๋ ฌ ๊ฒ์ โ ๋์ ๊ฐ์ค์น ์ตํฉ โ Answerability ํ๊ฐ โ ์กฐ๊ฑด๋ถ ์ฌ์ฒ๋ฆฌ์ ํ์ดํ๋ผ์ธ์ ๋ฐ๋ฅธ๋ค. |
|
|
| ## ์ธํ๋ผ |
|
|
| | ์ญํ | ์ฃผ์ | ๋น๊ณ | |
| |------|------|------| |
| | Search API (ํ
์คํธ) | `10.150.6.47:4275/search/text` | collection: `page` | |
| | Search API (์ด๋ฏธ์ง/ColQwen3.5) | `10.150.6.47:4275/search/text/colqwen35` | collection: `colqwen35` | |
| | Search API (์ด๋ฏธ์ง/Tomoro) | `10.150.6.47:4275/search/text/tomoro` | collection: `tomoro` | |
| | ๋จ์ด์ฌ์ API | `10.150.6.47:4276/search` | ๋๋ฉ์ธ ์ฝ์ด/์ฉ์ด ๊ฒ์ | |
| | Qwen3-VL-235B | `10.150.6.160:8000` | ๋ฉํฐ๋ชจ๋ฌ LLM | |
|
|
| ๊ฒ์ API ๊ณตํต ํ๋ผ๋ฏธํฐ: `query` (string), `top_k` (int). ํํฐ ํ๋(์ ํ): `apply_region`, `apply_product`, `document_type`, `dept_name` โ `filters` ๊ฐ์ฒด๋ก ์ ๋ฌ, AND ์กฐ๊ฑด. |
|
|
|
|
| > ๋ชจ๋ ์๋ฒ๋ Air-gapped ํ์๋ง ํ๊ฒฝ์ด๋ฉฐ ์ธ๋ถ ์ธํฐ๋ท ์ ๊ทผ ๋ถ๊ฐ. |
|
|
| ## ํต์ฌ ํ์ผ |
|
|
| - `qp_rag_pipeline.py` โ LangGraph StateGraph ๋ฉ์ธ ํ์ดํ๋ผ์ธ (797์ค) |
| - Jupyter ๊ฒ์ฆ ๋
ธํธ๋ถ (31์
) โ ํ์ดํ๋ผ์ธ ๋จ๊ณ๋ณ ํ
์คํธ์ฉ |
|
|
| ## ๋๋ฉ์ธ ์ปจํ
์คํธ |
|
|
| ๋ฐ๋์ฒด ๊ณต์ ์ฝ์ด๋ ์ฟผ๋ฆฌ ์ดํด์ ํต์ฌ์ ์ด๋ค: DSP, DSG, EPI, LAP, CMP, STI. ์ด ์ฝ์ด๋ค์ด ํฌํจ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋จ์ด์ฌ์ API(`4276/search`)๋ฅผ ๋ฐ๋์ ๋จผ์ ํธ์ถํ ๊ฒ. |
|
|
| ## ์ํคํ
์ฒ ๊ท์น |
|
|
| ### ํ์ดํ๋ผ์ธ ํ๋ฆ |
| ์ฟผ๋ฆฌ ์
๋ ฅ โ ์ฟผ๋ฆฌ ๋ถ์ โ ์ฟผ๋ฆฌ ์์ฑ โ ๊ฒ์(ํ
์คํธ/๋น์ ๋ณ๋ ฌ) โ ๊ฒฐ๊ณผ ์ตํฉ ๋ฐ ํ๊ฐ โ (์ฌ์ฒ๋ฆฌ or ์ถ๋ ฅ) |
|
|
| ### 1. ์ฟผ๋ฆฌ ๋ถ์ |
| - ๋ณต์ก๋(High/Medium/Low)์ ์ฟผ๋ฆฌ ์ ํ(Text/Vision/Hybrid)์ ๋ถ๋ฅ |
| - ๋ณต์ก๋์ ๋ฐ๋ผ ์ฟผ๋ฆฌ ์์ฑ ์ ๋ต์ด ๋ฌ๋ผ์ง |
| - ์ฟผ๋ฆฌ ์ ํ์ ๋ฐ๋ผ ์ตํฉ ๊ฐ์ค์น `alpha` ๊ฒฐ์ : Text=0.8, Vision=0.4, Hybrid=0.6 |
|
|
| ### 2. ์ฟผ๋ฆฌ ์์ฑ |
| - ๋ณต์ก๋๋ณ ์ ๋ต: High โ ์๋ณธ+ํ์ฅ+์ฌํด์+Text-HyDE / Medium โ ์๋ณธ+ํ์ฅ+์ฌํด์ / Low โ ์๋ณธ+๊ฒฝ๋ ์ฌํด์ |
| - ์ฝ์ด ํฌํจ ์ฟผ๋ฆฌ๋ ๋จ์ด์ฌ์ API(`4276`)๋ก ์ฝ์ด ํ์ด์ฐ๊ธฐ ํ ๋ฆฌ๋ผ์ดํธ |
| - ์์ฑ๋ `query_set`๊ณผ `alpha`๋ฅผ ๊ฒ์ ๋ชจ๋์ ์ ๋ฌ |
|
|
| ### 3. ๊ฒ์ |
| - Track 1 (ํ
์คํธ): BGE-M3 ํ์ด๋ธ๋ฆฌ๋ โ Top-50 โ Cross-Encoder ๋ฆฌ๋ญํน โ Top-30 |
| - Track 2 (๋น์ ): VLM ๊ธฐ๋ฐ VRAG โ Top-30 (๋ฆฌ๋ญํน ์๋ต) |
| - ๋ ํธ๋์ ๋ณ๋ ฌ ์คํ |
|
|
| ### 4. ๊ฒฐ๊ณผ ์ตํฉ ๋ฐ ํ๊ฐ |
| - ๋์ ๊ฐ์ค์น ์ ํ ๊ฒฐํฉ: `S_final = alpha * S_text + (1 - alpha) * S_vision` |
| - ์ตํฉ ๊ฒฐ๊ณผ ์์ 10๊ฐ ์ด๋ฏธ์ง์ ๋ํด VLM์ผ๋ก Answerability Score ์ฐ์ถ |
| - `S_avg < threshold` ์ด๊ณ `retry_count < 1`์ด๋ฉด ์ฌ์ฒ๋ฆฌ ๋ฐ๋ |
| - ์ฌ์ฒ๋ฆฌ: Top-K ์ด๋ฏธ์ง VLM ๋ถ์ โ Vision-HyDE ์ฟผ๋ฆฌ ์์ฑ โ ์ฟผ๋ฆฌ ์์ฑ ๋ชจ๋๋ก ํ๊ท |
| - ์ฌ์ฒ๋ฆฌ๋ ์ต๋ 1ํ๋ก ์ ํ โ reducer ๊ฒฐ๊ณผ ๋์ ๋ฒ๊ทธ ์ฃผ์, ๊ฐ iteration๋ง๋ค ์ด๊ธฐํํ ๊ฒ |
|
|
| ### ๋ชจ๋ ๊ฐ ๋ฐ์ดํฐ ํ๋ฆ |
| - ์ฟผ๋ฆฌ ๋ถ์ โ ์ฟผ๋ฆฌ ์์ฑ: `complexity`, `query_type`, `alpha` |
| - ์ฟผ๋ฆฌ ์์ฑ โ ๊ฒ์: `query_set`, `alpha` |
| - ๊ฒ์ โ ์ตํฉ/ํ๊ฐ: `text_results`, `vision_results`, `alpha` |
| - ์ตํฉ/ํ๊ฐ โ ์ฟผ๋ฆฌ ์์ฑ (์ฌ์ฒ๋ฆฌ): `enhanced_query`, `alpha`, `retry_count + 1` |
| - ์ตํฉ/ํ๊ฐ โ ์ถ๋ ฅ: `fused_results`, `S_avg`, `retrieval_retried` |
|
|
| ## ์ฝ๋ ์คํ์ผ |
|
|
| - Python 3.10+, type hint ํ์ |
| - async/await ํจํด ์ฌ์ฉ (FastAPI ์ฐ๋) |
| - ๋ก๊น
์ `loguru` ์ฌ์ฉ, print ๊ธ์ง |
| - ํ๊ธ ์ฃผ์ ํ์ฉ, docstring๋ ํ๊ธ๋ก ์์ฑ |
|
|
| ## ํ
์คํธ & ๊ฒ์ฆ |
| - Milvus ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ `relevance_score >= 0.7` ๊ธฐ์ค์ผ๋ก ํํฐ๋ง |
|
|
|
|
|
|