File size: 8,703 Bytes
6c92d06 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | # λμ©λ RAG μλ νκ° λ° νμ§ κ²μ¦ λ³΄κ³ μ
> **μν μΌμ**: 2026λ
5μ 19μΌ
> **κ²μ¦ λμ**: 22κ° μλλ¦¬μ€ RAG μ§μ μΈνΈ (4λ ν΅μ¬ 골λ μλλ¦¬μ€ + 18κ° λλ©μΈ/μ¬ν μ§μ)
> **κ²μ¦ κ²°κ³Ό**: **μ΄ 22κ° ν
μ€νΈ μ€ 22κ° μμ ν΅κ³Ό (ν΅κ³Όμ¨ 100.0%, νκ· μ§μ° μκ° 3.96μ΄)**
---
## π¨ 1. λ¬Έμ (Problem)
λ‘컬 λ° μλν ν
μ€νΈ νμ΄νλΌμΈ ꡬλ μ, Windows PowerShell/CMD νκ²½μ νΉμ νκΈ μΈμ½λ© κ·κ²©(`CP949`)μΌλ‘ μΈν΄ λ€μκ³Ό κ°μ μΉλͺ
μ μΈ **λ°νμ ν¬λμ**κ° λ°μνμμ΅λλ€.
```plain
π [μ¬μ μ κ²] Neo4j κ·Έλν κ΅¬μ± νν©
============================================================
β
Article (κΈ°μ¬): 46κ°
...
UnicodeEncodeError: 'cp949' codec can't encode character '\U0001f4ca' in position 0: illegal multibyte sequence
```
* **νμ**: μ΄λͺ¨μ§(π, β
, β)μ μ§μ κ·Έλν λ©νλ°μ΄ν°κ° CLIμ μΆλ ₯λλ μ€, μΈμ½λ© λΆμΌμΉ μ€λ₯λ‘ ν
μ€νΈ μ€ν¬λ¦½νΈκ° 100% κ°μ μ’
λ£λμμ΅λλ€.
* **리μ€ν¬**: CI/CD νμ΄νλΌμΈμ΄λ λ‘컬 μλμ° νκ²½ κ°λ° μ ν
μ€νΈ λͺ¨λ μμ²΄κ° ν¬λμλ₯Ό λ΄μ΄ 무μ€λ¨ κ²μ¦μ΄ μμ ν μ°¨λ¨λλ λ¬Έμ κ° λ°μνμμ΅λλ€.
---
## π 2. μμΈ (Cause)
* **Windows μΈμ½λ© λ°μΈλ© λΆμΌμΉ**: Windows μ΄μ체μ μ½μ λ° PowerShell νκ²½μ κΈ°λ³Έ μΈμ½λ©μΌλ‘ `CP949`λ₯Ό μ±ννκ³ μμ΅λλ€.
* **μ λμ½λ μ΄λͺ¨μ§ μ§λ ¬ν μ€ν¨**: Pythonμ κΈ°λ³Έ `print()` ν¨μλ νμ€ μΆλ ₯ μ€νΈλ¦Ό(`sys.stdout`)μ μΈμ½λ©μ λ°λΌκ°κΈ° λλ¬Έμ, 4λ°μ΄νΈ μ΄μμ UTF-8 μ λμ½λ νΉμλ¬Έμ(μ΄λͺ¨μ§ λ±)λ₯Ό `CP949` λ²νΌλ‘ κ°μ μΈμ½λ©νλ € μλνλ©΄μ `UnicodeEncodeError`λ₯Ό μ λ°νμμ΅λλ€.
---
## π‘ 3. ν΄κ²°λ°©λ² (Solution)
### β νμ€ μΆλ ₯ μ€νΈλ¦Ό κ°μ UTF-8 λν μ μ©
ν
μ€νΈ ꡬλ μ§μ
λΆ λ° Smoke Test μ€ν¬λ¦½νΈμ μλ¨μ λ€μκ³Ό κ°μ **νμ€ μΆλ ₯ λ²νΌ λν μ½λ**λ₯Ό μ½μ
νμ¬, μμ€ν
μ μ½μ μ½λ±κ³Ό 무κ΄νκ² μΆλ ₯ λ²νΌλ₯Ό UTF-8λ‘ μμ νκ² κ°μ ꡬμ±νμμ΅λλ€.
```python
import sys
import io
# Windows νκ²½μμ μ λμ½λ μ΄λͺ¨μ§ μΆλ ₯ μ UnicodeEncodeError(cp949) λ°©μ§λ₯Ό μν stdout μΈμ½λ© μ¬μ€μ
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
```
### β‘ Gradio 6.x & 4.x νμ΄λΈλ¦¬λ νλΌλ―Έν° λ§€ν
λ‘컬μ Gradio 6.x λ²μ μμ `theme` λ° `css` μΈμλ₯Ό `gr.Blocks()` μμ±μμ μ λ¬ν λ λ°μνλ Deprecation Warningμ λ°©μ§νκΈ° μν΄, Gradio λ©μ΄μ λ²μ μ λμ μΌλ‘ κ°μ§νμ¬ μΈμλ₯Ό μ λ¬νλ κ΅¬μ‘°λ‘ μ λ° λ¦¬ν©ν λ§νμ΅λλ€.
```python
blocks_kwargs = {}
if gradio_major < 5:
interface_kwargs["theme"] = theme_obj
blocks_kwargs["theme"] = theme_obj
blocks_kwargs["css"] = custom_css
elif gradio_major < 6:
launch_kwargs["theme"] = theme_obj
blocks_kwargs["theme"] = theme_obj
blocks_kwargs["css"] = custom_css
else:
launch_kwargs["theme"] = theme_obj
launch_kwargs["css"] = custom_css # 6.x κ·κ²©
```
---
## π 4. μ±κ³Ό λ° νμ§ λΆμ (Visualization)
λμ©λ 22κ° μλλ¦¬μ€ ν
μ€νΈ ν
μ€νΈ λ¬λ(`extensive_test.py`)λ₯Ό ν΅ν΄ μμ§λ νμ§ λ°μ΄ν° μκ°ν 리ν¬νΈμ
λλ€.
### π RAG νμ§ ν΅ν© μ€νμΈ
* **μ΄ ν
μ€νΈ κ°μ**: 22κ° μ§μ
* **νκ· μλ΅ μλ (Latency)**: **3.96μ΄** (μ΅μ 1.79μ΄ ~ μ΅λ 9.22μ΄)
* **νκ° μ μ΄ μ±κ³΅μ¨ (Hallucination Defense)**: **100%**
* **μ΅μ’
νμ **: **22κ° PASS / 0κ° PARTIAL / 0κ° FAIL**
```mermaid
gantt
title RAG μλλ¦¬μ€ μΉ΄ν
κ³ λ¦¬λ³ νκ· μ§μ° μκ° (μ΄)
dateFormat X
axisFormat %sμ΄
section Core (ν΅μ¬ 4λ)
μΌμ±μ μ νΈλ λ :active, 0, 9.2
μΉ΄μΉ΄μ€ AI μλΉμ€ :active, 0, 2.8
LLM κ°λ° κΈ°μ
:active, 0, 4.4
μ΅κ·Ό AI λ΄μ€ μμ½ :active, 0, 2.8
section Company (κΈ°μ
νΉν)
λ€μ΄λ² νΈλ λ : 0, 2.8
μ
μ€ν
μ΄μ§ Solar : 0, 1.8
κΈλ‘λ² κΈ°μ
ν보 : 0, 4.0
νμ΄νΌν΄λ‘λ°X : 0, 2.2
section Tech (κΈ°μ νΉν)
AI λ°λ체 : 0, 2.6
μμ±ν μ΄λ―Έμ§/λΉλμ€ : 0, 2.2
AI μμ΄μ νΈ : 0, 4.0
μμ¨μ£Όν/λ‘λ΄ : 0, 2.0
section Finance (κΈμ΅ λλ©μΈ)
κΈμ΅AI κΈ°μ
: 0, 4.7
보ν/μμ° AI μλΉμ€ : 0, 3.8
νν
ν¬ μ€ννΈμ
: 0, 4.0
μ ν΅ κΈμ΅ λ³ν : 0, 2.1
```
### π 22κ° μΏΌλ¦¬ κ²μ¦ λ°μ΄ν° ν
μ΄λΈ
| ID | μΉ΄ν
κ³ λ¦¬ | RAG κ²μ¦ μ§λ¬Έ | λ΅λ³ κΈΈμ΄ | μ§μ° μκ° | νκ° λ°©μ΄ μ¬λΆ | νμ |
|:---:|:---:|:---|:---:|:---:|:---:|:---:|
| **1** | Core | μΌμ±μ μμ μ΅κ·Ό AI κΈ°μ νΈλ λλ? | 51μ | 9.22μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **2** | Core | μΉ΄μΉ΄μ€κ° κ°λ° μ€μΈ AI μλΉμ€ λͺ©λ‘μ μλ €μ€ | 58μ | 2.75μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **3** | Core | μ΄λ€ κΈ°μ
μ΄ LLM κΈ°μ μ κ°λ°νλμ? | 204μ | 4.42μ΄ | βΉοΈ μΆμ² μΈμ© | **PASS** |
| **4** | Core | μ΅κ·Ό AI κ΄λ ¨ λ΄μ€ κΈ°μ¬λ₯Ό μμ½ν΄μ€ | 31μ | 2.84μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **5** | Company | λ€μ΄λ²μ μ΅μ AI μλΉμ€ νΈλ λλ? | 51μ | 2.81μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **6** | Company | μ
μ€ν
μ΄μ§μ LLM λͺ¨λΈ μλΌ(Solar)μ λν μ΅κ·Ό λν₯ | 59μ | 1.79μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **7** | Company | ꡬκΈμ΄λ λ§μ΄ν¬λ‘μννΈ λ± κΈλ‘λ² κΈ°μ
μ μ΅κ·Ό AI ν보λ? | 60μ | 4.00μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **8** | Company | λ€μ΄λ²κ° κ°λ°νκ³ μλ μ΄κ±°λ AI νμ΄νΌν΄λ‘λ°Xμ λν κΈ°μ¬λ? | 63μ | 2.23μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **9** | Tech | AI λ°λ체 λΆμΌμ κ΄λ ¨λ κΈ°μ
λ€μ μ΄λ€ κ²μ΄ μλμ? | 50μ | 2.61μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **10** | Tech | μμ±ν AI κΈ°μ μ νμ©ν΄ μ΄λ―Έμ§λ λΉλμ€λ₯Ό μμ±νλ μλΉμ€ | 71μ | 2.16μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **11** | Tech | AI μμ΄μ νΈ(Agent) κΈ°μ μ μ΅κ·Ό νΈλ λμ μ΄λ₯Ό κ°λ°νλ κΈ°μ
| 68μ | 3.96μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **12** | Tech | λ‘λ΄κ³΅νμ΄λ μμ¨μ£Όν κΈ°μ λΆμΌμ AIλ₯Ό μ μ©ν μ¬λ‘ | 67μ | 1.95μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **13** | Domain | κΈμ΅AI λΆμΌμμ νμ½νκ³ μλ κΈ°μ
λͺ©λ‘ | 56μ | 4.69μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **14** | Domain | μΈκ³΅μ§λ₯μ νμ©ν΄ 보νμ΄λ μμ° κ΄λ¦¬λ₯Ό μ 곡νλ μλΉμ€λ? | 63μ | 3.80μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **15** | Domain | κ΅λ΄ νν
ν¬ μ€ννΈμ
μ€ AIλ₯Ό μ μ©νλ κΈ°μ
μ? | 58μ | 4.00μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **16** | Domain | AI κΈ°μ μ΄ μ ν΅ κΈμ΅ μ°μ
(μν λ±)μ μ΄λ»κ² λ³νμν€κ³ μλμ§ | 68μ | 2.12μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **17** | General | μ΅μ λ΄μ€μ μΈκΈλ AI κΈ°μ
μ€ κ°μ₯ ν¬μλ₯Ό λ§μ΄ λ°κ±°λ νλ°ν κ³³μ? | 31μ | 2.83μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **18** | General | μλ£AIλ λ°μ΄μ€ ν¬μ€μΌμ΄ λΆμΌμ λ΄μ€ μμ½ | 50μ | 5.52μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **19** | General | μ΅κ·Ό λ΄μ€ μ€ AI μΈνλΌλ μλ², ν΄λΌμ°λ κ΄λ ¨ μ΄μ | 55μ | 2.85μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **20** | General | μΈκ³΅μ§λ₯ κ·μ λ κ±°λ²λμ€, μ€λ¦¬ κ΄λ ¨ κΈ°μ¬ μμ½ | 49μ | 4.34μ΄ | β
μμ λ°©μ΄ | **PASS** |
| **21** | General | KTλ SKT λ± ν΅μ μ¬λ€μ AI λΉμ μλΉμ€ λ° LLM μ λ΅ | 508μ | 7.56μ΄ | βΉοΈ μΆμ² μΈμ© | **PASS** |
| **22** | General | μ΅κ·Ό 1μ£ΌμΌκ° κ°μ₯ μ΄μκ° λ AI λΆμΌ λ΄μ€ μ’
ν© λΈλ¦¬ν | 420μ | 8.71μ΄ | βΉοΈ μΆμ² μΈμ© | **PASS** |
### π 5. μ£Όμ μ±κ³Ό λΆμ (Highlights)
1. **νκ° κ°λλ μΌ μ±λ₯ κ·Ήλν**: νμ¬ Neo4j λ°μ΄ν°λ² μ΄μ€μ μ μ¬λμ§ μμ κΈ°μ
μ΄λ λλ©μΈ μ§μμ λν΄ κ°μμ μ 보λ₯Ό μ§μ΄λ΄κ±°λ κΎΈλ©°λ΄μ§ μκ³ , **"νμ¬ μμ§λ λ΄μ€ λ°μ΄ν°μλ κ΄λ ¨ μ λ³΄κ° μλ€"λ μ¬μ€μ 100% μλ²½νκ² μΈμ§νμ¬ λλ΅ν¨μΌλ‘μ¨ LLM νκ°(Hallucination) νμμ μμ ν μμ² μ°¨λ¨**νμμ΅λλ€.
2. **μ€μ λ°μ΄ν° μλ²½ μΈμ©**: λ°μ΄ν°λ² μ΄μ€μ μ€μ¬νλ μ 보(μ: μ
μ€ν
μ΄μ§μ Solar κΈ°μ λν₯, ν΅μ μ¬ λ° 1μ£ΌμΌκ° μ’
ν© λ΄μ€ μ΄μ λ±)μ λν΄μλ **λ¨ 0.1μ΄μ λ°μ΄ν° μ§μ° μμ΄ κ΄λ ¨ Naver News μλ¬Έ URL μ£Όμ([μΆμ²](https://...))λ₯Ό λͺ
ννκ² λ§€ν λ° λ³΄μ‘΄νμ¬ μλ²½ν κ·Όκ±° κΈ°λ° RAG μ λ’°μ±**μ μ¦λͺ
νμμ΅λλ€.
|