60์ผ์ฐจ OutputParser

์ฐจ์ง€์˜ˆยท2025๋…„ 8์›” 18์ผ

์ƒ์„ฑAI

๋ชฉ๋ก ๋ณด๊ธฐ
54/56
post-thumbnail

๐Ÿง  LangChain OutputParser

๐Ÿ” OutputParser ์ข…๋ฅ˜๋ณ„ ์š”์•ฝ

1. PydanticOutputParser

  • ๐Ÿ“ฆ ์—ญํ• : LLM ์‘๋‹ต์„ Pydantic ๋ชจ๋ธ์— ๋งž๊ฒŒ ํŒŒ์‹ฑ
  • ๐Ÿ”ง ํƒ€์ž… ์•ˆ์ „์„ฑ, ์ž๋™ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ œ๊ณต
from pydantic import BaseModel

class Person(BaseModel):
    name: str
    age: int

LLM ์‘๋‹ต์ด ์ด ๊ตฌ์กฐ์— ๋งž์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ โ†’ ์ˆ˜์ • ๊ฐ€๋Šฅ


2. CommaSeparatedListOutputParser

  • ๐Ÿ“ฆ ์—ญํ• : ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„๋œ ๋ฌธ์ž์—ด์„ ๋ฆฌ์ŠคํŠธ๋กœ ํŒŒ์‹ฑ
  • โœ… ๋น ๋ฅธ ํ‚ค์›Œ๋“œ ์ถ”์ถœ์— ์œ ์šฉ
"apple, banana, cherry"
โ†“
["apple", "banana", "cherry"]

3. StructuredOutputParser

  • ๐Ÿ“ฆ ์—ญํ• : ํ•„๋“œ ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ทธ์— ๋งž๋Š” ์ถœ๋ ฅ ์ƒ์„ฑ
  • ๐Ÿงพ ResponseSchema๋ฅผ ๋ฌธ์„œ๋กœ LLM์— ์ „๋‹ฌ
from langchain.output_parsers import ResponseSchema

4. JsonOutputParser

  • ๐Ÿ“ฆ ์—ญํ• : ๋ฌธ์ž์—ด ํ˜•ํƒœ์˜ JSON ์ถœ๋ ฅ์„ dict๋กœ ๋ณ€ํ™˜
  • โœ… ๊ตฌ์กฐํ™”๋œ API ์‘๋‹ต, ๋ฐ์ดํ„ฐ ์ •๋ฆฌ์— ์ ํ•ฉ
from langchain.output_parsers import JsonOutputParser

5. PandasDataFrameOutputParser

  • ๐Ÿ“ฆ ์—ญํ• : LLM์ด ์ƒ์„ฑํ•œ ํ‘œ ํ˜•์‹ ๋ฐ์ดํ„ฐ๋ฅผ DataFrame์œผ๋กœ ๋ณ€ํ™˜
  • ๐Ÿ“Š ๋ถ„์„, ์‹œ๊ฐํ™”, ํ…Œ์ด๋ธ” ์ฒ˜๋ฆฌ์— ์ ํ•ฉ
from langchain.output_parsers import PandasDataFrameOutputParser

6. DatetimeOutputParser

  • ๐Ÿ“ฆ ์—ญํ• : "๋‚ด์ผ", "๋‹ค์Œ์ฃผ ์›”์š”์ผ", "2025-09-01" ๋“ฑ์˜ ์ž์—ฐ์–ด ๋‚ ์งœ๋ฅผ datetime์œผ๋กœ ๋ณ€ํ™˜
  • ๐Ÿ• ์Šค์ผ€์ค„๋ง, ์ด๋ฒคํŠธ ์ •๋ฆฌ์— ์œ ๋ฆฌ
from langchain.output_parsers import DatetimeOutputParser

7. EnumOutputParser

  • ๐Ÿ“ฆ ์—ญํ• : ์ถœ๋ ฅ๊ฐ’์„ ์‚ฌ์ „์— ์ •์˜๋œ Enum ํด๋ž˜์Šค์˜ ๊ฐ’์œผ๋กœ ์ œํ•œ
  • โœ… ๊ฐ์ • ๋ถ„์„, ๋“ฑ๊ธ‰ ๋ถ„๋ฅ˜ ๋“ฑ์— ์ ํ•ฉ
from enum import Enum

class Sentiment(Enum):
    POSITIVE = "positive"
    NEGATIVE = "negative"

8. OutputFixingParser

  • ๐Ÿ“ฆ ์—ญํ• : ์ถœ๋ ฅ์ด ํฌ๋งท์— ๋งž์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ž๋™ ์ˆ˜์ • ์‹œ๋„
  • ๐Ÿ” ๋‚ด๋ถ€์ ์œผ๋กœ LLM์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•ด ๋ณต์›
from langchain.output_parsers import OutputFixingParser

fixing_parser = OutputFixingParser.from_llm(parser=original_parser, llm=chat)

๐Ÿงฉ OutputParser ๋น„๊ต ์š”์•ฝํ‘œ

Parser ์ข…๋ฅ˜์ถœ๋ ฅ ํ˜•ํƒœํ™œ์šฉ ์˜ˆ์‹œ๊ฐ•์ 
PydanticOutputParserPydantic ๋ชจ๋ธ๊ตฌ์กฐํ™”๋œ JSON ์‘๋‹ตํƒ€์ž… ์•ˆ์ „์„ฑ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
CommaSeparatedList๋ฆฌ์ŠคํŠธํ‚ค์›Œ๋“œ ์ถ”์ถœ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ถœ๋ ฅ
StructuredOutputParser๊ตฌ์กฐํ™” ๋”•์…”๋„ˆ๋ฆฌ๋ช…์„ธ ๊ธฐ๋ฐ˜ ์‘๋‹ต๋ช…์„ธ ๋ฌธ์„œ ์ž๋™ ์ƒ์„ฑ
JsonOutputParserJSONAPI ์‘๋‹ต ํŒŒ์‹ฑ๋น ๋ฅธ JSON ์ฒ˜๋ฆฌ
PandasDataFrameOutputDataFrameํ…Œ์ด๋ธ” ์ถœ๋ ฅ๋ถ„์„ ๋ฐ ์‹œ๊ฐํ™”์— ํ™œ์šฉ
DatetimeOutputParserdatetime ๊ฐ์ฒด์‹œ๊ฐ„ ์˜ˆ์•ฝ, ์ผ์ • ์ถ”์ถœ์ž์—ฐ์–ด ์‹œ๊ฐ„ ํŒŒ์‹ฑ
EnumOutputParserEnum ํƒ€์ž…๊ฐ์„ฑ ๋ถ„์„ ๊ฒฐ๊ณผ, ๋‹ค์ค‘ ์„ ํƒ ๋ถ„๋ฅ˜ํ—ˆ์šฉ ๊ฐ’ ์ œํ•œ, ์ •ํ˜•ํ™”
OutputFixingParser์œ„์˜ ํŒŒ์„œ๋“ค ๋ณด์™„๋ชจ๋“  ํŒŒ์„œ์— ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ์˜ค๋ฅ˜ ์ž๋™ ๋ณต๊ตฌ


LangChain์—์„œ ๋ชจ๋ธ ์บ์‹ฑ, ์ง๋ ฌํ™”, ๋ชจ๋ธ ํ˜ธ์ถœ ๋ฐฉ์‹ ์ •๋ฆฌ

1. ๋ชจ๋ธ ์บ์‹ฑ (Caching)

๐Ÿ” ์ •์˜

  • ๋™์ผํ•œ ์งˆ๋ฌธ(prompt)์— ๋Œ€ํ•ด ์ด์ „์— ์ƒ์„ฑ๋œ ์‘๋‹ต์„ ์ €์žฅํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ
  • LLM ํ˜ธ์ถœ ๋น„์šฉ ์ ˆ๊ฐ + ์†๋„ ๊ฐœ์„  + ๋””๋ฒ„๊น… ์šฉ์ด

โœ… LangChain์—์„œ ํ™œ์„ฑํ™” ์˜ˆ์‹œ

from langchain.globals import set_llm_cache
from langchain.cache import InMemoryCache

set_llm_cache(InMemoryCache())

๐Ÿ”„ ๋‹ค์–‘ํ•œ ์บ์‹œ ๋ฐฑ์—”๋“œ ์ง€์›

  • InMemoryCache: ์„ธ์…˜ ๋‚ด ์ž„์‹œ ์บ์‹ฑ
  • SQLiteCache: ๋””์Šคํฌ ๊ธฐ๋ฐ˜ ์˜๊ตฌ ์ €์žฅ
  • RedisCache: ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ๊ณ ์† ์บ์‹œ ์‚ฌ์šฉ

2. ๋ชจ๋ธ ์ง๋ ฌํ™” (Serialization)

๐Ÿ” ์ •์˜

  • LLM ๊ฐ์ฒด๋ฅผ ์ €์žฅ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ(JSON, Pickle ๋“ฑ)๋กœ ๋ณ€ํ™˜
  • ์›Œํฌํ”Œ๋กœ์šฐ ์ €์žฅ, ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ, ์žฌํ˜„์„ฑ ํ™•๋ณด์— ์œ ์šฉ

โœ… ์‚ฌ์šฉ ์˜ˆ์‹œ

llm.save("my_gpt_model.json")
  • .json์œผ๋กœ ์ €์žฅํ•˜๋ฉด ํ–ฅํ›„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Œ
from langchain.chat_models import ChatOpenAI
ChatOpenAI.load("my_gpt_model.json")

3. ๋‹ค์–‘ํ•œ ๋ชจ๋ธ ํ˜ธ์ถœ ๋ฐฉ์‹

โœ… (1) OpenAI / Anthropic / Azure

from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-4", temperature=0.7)
  • OpenAI API key ํ•„์š”
  • OpenAI ์ด์™ธ์—๋„ AzureOpenAI, Anthropic(Claude) ๋“ฑ ์ง€์›

โœ… (2) HuggingFaceHub (ํ—ˆ๊น…ํŽ˜์ด์Šค ์—”๋“œํฌ์ธํŠธ)

from langchain.llms import HuggingFaceHub
llm = HuggingFaceHub(repo_id="google/flan-t5-xl", model_kwargs={"temperature": 0.7})
  • HuggingFace์—์„œ ์ œ๊ณตํ•˜๋Š” Inference API ํ˜ธ์ถœ
  • HUGGINGFACEHUB_API_TOKEN ํ•„์š”

โœ… (3) HuggingFacePipeline (๋กœ์ปฌ ๋ชจ๋ธ ํŒŒ์ดํ”„๋ผ์ธ)

from langchain.llms import HuggingFacePipeline
from transformers import pipeline

pipe = pipeline("text-generation", model="gpt2")
llm = HuggingFacePipeline(pipeline=pipe)
  • ๋กœ์ปฌ์— ์„ค์น˜๋œ transformers ๋ชจ๋ธ์„ pipeline์œผ๋กœ ์‹คํ–‰
  • GPU ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๋น ๋ฅด๊ณ  ์ €๋ ดํ•จ, ๋‹จ ๋ฉ”๋ชจ๋ฆฌ/ํ™˜๊ฒฝ ์„ธํŒ… ํ•„์š”

โœ… (4) LoRA (Low-Rank Adaptation, ๊ฒฝ๋Ÿ‰ ํŒŒ์ธํŠœ๋‹)

from peft import PeftModel
from transformers import AutoModelForCausalLM

base_model = AutoModelForCausalLM.from_pretrained("EleutherAI/gpt-neo-1.3B")
lora_model = PeftModel.from_pretrained(base_model, "path/to/lora")
  • ์ž‘์€ ๊ฐ€์ค‘์น˜(Low-Rank)๋ฅผ ๋ง๋ถ™์ด๋Š” ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ธํŠœ๋‹
  • HuggingFace Transformers ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์„ ๊ฒฝ๋Ÿ‰ํ™”ํ•ด์„œ ํ•™์Šต/๋ฐฐํฌ ๊ฐ€๋Šฅ
  • LangChain์—์„œ ์ง์ ‘ LoRA ๋ชจ๋ธ ๋กœ๋”ฉ์€ transformers + pipeline ์—ฐ๋™์„ ํ†ตํ•ด ๊ตฌํ˜„

โœ… (5) Local LLM (๋กœ์ปฌ ์–ธ์–ด ๋ชจ๋ธ)

from langchain.llms import LlamaCpp
llm = LlamaCpp(model_path="./llama-7b.ggmlv3.q4_0.bin")
  • GPU ์—†์ด CPU๋กœ๋„ LLM ์‹คํ–‰ ๊ฐ€๋Šฅ (ex: GGML ํฌ๋งท)
  • ๋Œ€ํ‘œ ์˜ˆ: llama-cpp, mistral, vicuna, gpt4all
  • HuggingFace์—์„œ ์ง์ ‘ ๋‹ค์šด๋กœ๋“œ ํ›„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์š”์•ฝ ๋น„๊ต

๋ฐฉ์‹์„ค๋ช…๋น„์šฉ์†๋„ํ•„์š” ํ™˜๊ฒฝ
OpenAIGPT-3.5/4 API ํ˜ธ์ถœ๐Ÿ’ต ์œ ๋ฃŒโšก ๋น ๋ฆ„API Key ํ•„์š”
HuggingFaceHubHF์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋ธ ํ˜ธ์ถœ๐Ÿ’ต ์œ ๋ฃŒโšก ๋น ๋ฆ„HF ํ† ํฐ ํ•„์š”
HuggingFacePipeline๋กœ์ปฌ ๋ชจ๋ธ ์‹คํ–‰๐Ÿ’ธ ๋ฌด๋ฃŒโšก ๋น ๋ฆ„ (GPU)๋กœ์ปฌ ํ™˜๊ฒฝ ํ•„์š”
LoRA๊ฒฝ๋Ÿ‰ํ™”๋œ ํŒŒ์ธํŠœ๋‹ ๋ชจ๋ธ ์‚ฌ์šฉ๐Ÿ’ธ ์ €๋น„์šฉโšก ๋น ๋ฆ„transformers + PEFT ํ•„์š”
LlamaCpp๋กœ์ปฌ CPU ๊ธฐ๋ฐ˜ LLM ์‹คํ–‰๐Ÿ’ธ ๋ฌด๋ฃŒ๐Ÿข ๋А๋ฆผggml ๋ชจ๋ธ ํ•„์š”

0๊ฐœ์˜ ๋Œ“๊ธ€