λ³Έ μμ€ν
μ μ¬μ©μκ° μ
λ ₯ν ν
μ€νΈ(AI μμ± ν
μ€νΈ ν¬ν¨)μ μ
λ‘λν μν .docx λ¬Έμλ₯Ό λΆμνμ¬, μν λ¬Έμμ μμ(μ€νμΌ, κΈκΌ΄, μ¬λ°±, ν€λ/νΈν° λ±)μ λμΌνκ² μ μ©ν μλ‘μ΄ .docx λ¬Έμλ₯Ό μμ±νλ μμ΄μ νΈμ
λλ€. λ¨μν ν
μ€νΈ λ³ν©μ λμ΄, LangGraphλ₯Ό νμ©νμ¬ μν κΈ°λ°(Stateful)μ 볡μ‘ν μμ΄μ νΈ μν¬νλ‘μ°λ₯Ό ꡬμ±νλ©°, μ
λ‘λλ μν λ¬Έμλ μ¬μ¬μ© κ°λ₯ν μ€ν¬(Skill)λ‘ λ³νλμ΄ μ§μμ μΌλ‘ κ΄λ¦¬λ©λλ€.
μ΄ μμ€ν μ κΈ°μ‘΄μ λ ΈνΈ λ°μ΄ν°λ₯Ό AIκ° κ²μνκ³ νμ©νλ [[Vectorize]] μν€ν μ²μ μ μ¬νκ², λ¬Έμ ν¬λ§·ν μ΄λΌλ νΉμ μμ μ ν ν° κΈ°λ°μ API νΈμΆκ³Ό νμΌ μ²λ¦¬ νμ΄νλΌμΈμΌλ‘ λΆλ¦¬νμ¬ μ²λ¦¬ν©λλ€. λν, Claude Codeμ λ ΈνΈ μμ€ν μ΄ μ°λλμλ [[Mcp μ°λ λ°©λ²]]μ²λΌ, μμ΄μ νΈκ° μΈλΆ λꡬ(λ¬Έμ νμ, μ€νμΌ λΌμ΄λΈλ¬λ¦¬)λ₯Ό μ κΈ°μ μΌλ‘ νΈμΆνμ¬ μ΅μ’ κ²°κ³Όλ¬Όμ λμΆνλ ꡬ쑰λ₯Ό λͺ©νλ‘ ν©λλ€.
LangGraphλ₯Ό μ¬μ©νμ¬ κ° λ¨κ³λ₯Ό λͺ νν λ Έλ(Node)μ μ£μ§(Edge)λ‘ μ μν©λλ€. μν(State) κ·Έλνλ₯Ό ν΅ν΄ λ¬Έμ μμ± κ³Όμ μ λ°μ΄ν° νλ¦μ μΆμ νκ³ , μ€λ₯ λ°μ μ νΉμ λ Έλλ‘ μ¬μ§μ ν μ μλ μ μ°μ±μ ν보ν©λλ€.
raw_text: μ¬μ©μκ° μ
λ ₯ν μλ³Έ ν
μ€νΈuploadedfilepath: μ
λ‘λλ μν docx νμΌ κ²½λ‘parsed_styles: μν λ¬Έμμμ μΆμΆλ μ€νμΌ μ 보 (μ€ν¬ λ°μ΄ν°)structured_content: μλ³Έ ν
μ€νΈλ₯Ό λ¬Έμ ꡬ쑰μ λ§κ² λΆν΄ν λ°μ΄ν°finaldocxbuffer: μ΅μ’
μμ±λ docx νμΌ λ°μ΄νΈerror: μμΈ λ°μ μ μλ¬ λ‘κ·Έ.docx νμΌμ λΆμνμ¬ μ€νμΌ μ 보(ν°νΈ, ν¬κΈ°, μ λ ¬, λ¬Έλ¨ κ°κ²©, ν μ€νμΌ λ±)λ₯Ό μΆμΆν©λλ€.python-docx λ±μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν΄ μ΅μ’
λ¬Έμλ₯Ό μμ±ν©λλ€.File Parserλ‘ μ΄λνκ³ , κΈ°μ‘΄ μ€ν¬μ μ νν κ²½μ° Skill Managerμμ λ°λ‘ λ°μ΄ν°λ₯Ό λ‘λνλλ‘ λΆκΈ°ν©λλ€.μ λ‘λλ μν λ¬Έμλ₯Ό μΌνμ±μΌλ‘ μ¬μ©νλ κ²μ΄ μλλΌ, μ¬μ¬μ© κ°λ₯ν 'ν¬λ§·ν μ€ν¬'λ‘ κ΄λ¦¬ν©λλ€. μ΄λ [[Hive note μκ°]]μμ μΈκΈλ λ ΈνΈμ λ©νλ°μ΄ν° κ΄λ¦¬ λ° νμ₯μ± κ°λ κ³Ό λ§₯λ½μ κ°μ΄ν©λλ€.
{
"skill*id": "skill*corporate*report*v2",
"name": "κΈ°μ
곡μμ© λ³΄κ³ μ ν¬λ§·",
"style_data": {
"heading_1": { "font": "NanumSquare", "size": 18, "bold": true, "color": "#1F4E79" },
"normal": { "font": "λ§μ κ³ λ", "size": 10, "line_spacing": 1.5 },
"table_style": "Grid Table 4 Accent 1"
},
"created_at": "2023-10-27T10:00:00Z"
}
μμ΄μ νΈμ μ€ν νκ²½μ μλ²λ¦¬μ€ λλ 컨ν μ΄λ νκ²½μμ ꡬλλλ©°, λ¬Έμ μ²λ¦¬λ₯Ό μν μμ μ μΈ μ€ν 리μ§μ μ°λλμ΄μΌ ν©λλ€.
POST /api/format-document: ν
μ€νΈμ μν νμΌ(λλ μ€ν¬ ID)μ μμ νμ¬ LangGraph μν¬νλ‘μ°λ₯Ό νΈλ¦¬κ±°ν©λλ€.GET /api/skills: λ±λ‘λ ν¬λ§·ν
μ€ν¬ λͺ©λ‘μ λ°νν©λλ€.GET /api/download/{task_id}: μ²λ¦¬κ° μλ£λ μ΅μ’
.docx νμΌμ λ€μ΄λ‘λν©λλ€.Document Generator Node λ΄λΆμμ python-docx λΌμ΄λΈλ¬λ¦¬λ₯Ό λν(Wrapping)νμ¬ μ¬μ©ν©λλ€.docx κ°μ²΄μ addparagraph*, *addheading, add_table λ±μ λ©μλμ λ§€νν©λλ€. μ΄λ 미리 μ μλ μ€ν¬μ μ€νμΌ μμ±μ μ£Όμ
ν©λλ€.μ¬μ©μκ° "AIκ° μμ±ν μμ₯ λΆμ λ³΄κ³ μ ν μ€νΈ"μ "μ¬λ΄ νμ€ μμ docx νμΌ"μ μ λ‘λνμ λμ μ²λ¦¬ νλ¦μ λ€μκ³Ό κ°μ΅λλ€.
parsed_styles μνμ μ μ₯ν©λλ€..docx νμΌλ‘ 물리μ μΌλ‘ μμ±ν©λλ€.μ΄ μ€κ³λ₯Ό ν΅ν΄ λ¨μν ν μ€νΈ 볡μ¬-λΆμ¬λ£κΈ°κ° μλ, λ¬Έμμ λ§₯λ½κ³Ό μμμ μ΄ν΄νκ³ μ¬μ¬μ© κ°λ₯ν μμ°(μ€ν¬)μΌλ‘ μΆμ νλ μ§λ₯ν λ¬Έμ μλν μμ€ν μ ꡬμΆν μ μμ΅λλ€.