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๊ธฐ์ค์ผ๋ก ํํฐ๋ง