| # λμ©λ 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 μ λ’°μ±**μ μ¦λͺ
νμμ΅λλ€. |
|
|