๐ง 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 ์ข
๋ฅ | ์ถ๋ ฅ ํํ | ํ์ฉ ์์ | ๊ฐ์ |
|---|
PydanticOutputParser | Pydantic ๋ชจ๋ธ | ๊ตฌ์กฐํ๋ JSON ์๋ต | ํ์
์์ ์ฑ, ์ ํจ์ฑ ๊ฒ์ฌ |
CommaSeparatedList | ๋ฆฌ์คํธ | ํค์๋ ์ถ์ถ | ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ ์ถ๋ ฅ |
StructuredOutputParser | ๊ตฌ์กฐํ ๋์
๋๋ฆฌ | ๋ช
์ธ ๊ธฐ๋ฐ ์๋ต | ๋ช
์ธ ๋ฌธ์ ์๋ ์์ฑ |
JsonOutputParser | JSON | API ์๋ต ํ์ฑ | ๋น ๋ฅธ JSON ์ฒ๋ฆฌ |
PandasDataFrameOutput | DataFrame | ํ
์ด๋ธ ์ถ๋ ฅ | ๋ถ์ ๋ฐ ์๊ฐํ์ ํ์ฉ |
DatetimeOutputParser | datetime ๊ฐ์ฒด | ์๊ฐ ์์ฝ, ์ผ์ ์ถ์ถ | ์์ฐ์ด ์๊ฐ ํ์ฑ |
EnumOutputParser | Enum ํ์
| ๊ฐ์ฑ ๋ถ์ ๊ฒฐ๊ณผ, ๋ค์ค ์ ํ ๋ถ๋ฅ | ํ์ฉ ๊ฐ ์ ํ, ์ ํํ |
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์์ ์ง์ ๋ค์ด๋ก๋ ํ ์ฌ์ฉ ๊ฐ๋ฅ
์์ฝ ๋น๊ต
| ๋ฐฉ์ | ์ค๋ช
| ๋น์ฉ | ์๋ | ํ์ ํ๊ฒฝ |
|---|
| OpenAI | GPT-3.5/4 API ํธ์ถ | ๐ต ์ ๋ฃ | โก ๋น ๋ฆ | API Key ํ์ |
| HuggingFaceHub | HF์์ ์ ๊ณตํ๋ ๋ชจ๋ธ ํธ์ถ | ๐ต ์ ๋ฃ | โก ๋น ๋ฆ | HF ํ ํฐ ํ์ |
| HuggingFacePipeline | ๋ก์ปฌ ๋ชจ๋ธ ์คํ | ๐ธ ๋ฌด๋ฃ | โก ๋น ๋ฆ (GPU) | ๋ก์ปฌ ํ๊ฒฝ ํ์ |
| LoRA | ๊ฒฝ๋ํ๋ ํ์ธํ๋ ๋ชจ๋ธ ์ฌ์ฉ | ๐ธ ์ ๋น์ฉ | โก ๋น ๋ฆ | transformers + PEFT ํ์ |
| LlamaCpp | ๋ก์ปฌ CPU ๊ธฐ๋ฐ LLM ์คํ | ๐ธ ๋ฌด๋ฃ | ๐ข ๋๋ฆผ | ggml ๋ชจ๋ธ ํ์ |