LangChain이란?
Q)openai나 transformer을 쓰면 되지 왜 langchain을 쓸까?
A)체인으로 llm 사용을 조합하기 위해서
이걸 LangChain은 한 줄로 연결해서 관리 가능하기 때문에
Framework는 "너가 필요한거 다 줄게 너가 하고싶은 거 다 해!" 느낌
LLM을 가지고 AI서비스를 만들기 위한것이 LangChain
like 공구상자
Prompt
GPT와의 대화를 예를 들자면
나: 난 ㅇㅇ이야.
GPT: 안녕 ㅇㅇ아
나: 내 이름 뭐라고?
이 대화 전체가 Prompt. 자세히 말하자면 내가 말한 모든 정보들이 prompt이고, 이전 기억들은 메모리에 담아둔다(gpt대답)
🍈 LangChain에서의 프롬프트
- PromptTemplate : 변수 기반 동적 프롬프트
- ChatPromptTemplate : 여러 메시지를 구조화하여 대화 설계
PromptTemplate
🍈 틀을 잡고 질문을 던진다.
# 프롬프트 템플릿
prompt = PromptTemplate(
input_variables=["text", "language"], # 변수 이름 정의
template="{language} 언어로 번역해 : {text}"
)
# LLM 연결
llm = ChatOpenAI(model_name = 'gpt-4o-mini' ,temperature = 0)
chain = LLMChain(prompt=prompt, llm=llm)
🍈답변의 다양성과 무작위성 제어
Temperature
단어 후보마다 얼마나 나오는지 보고 이를 softmax 함수로 확률 변환
Temperature은 "th" 같이 확률분포가 작은 부분들을 조절하여 날카롭게(0) 또는 넓게 (1) 조절
- 0 : 확률 높은 단어 고름 ㅡ>일관되고 예측 가능한 결과
- 1 : 낮은 확률 단어도 고를 가능 성 있도록 ㅡ> 창의적
🍈 참고
- top_k : 확률이 높은 k개 단어만 후보로 삼음
- top_p : 누적확률이 p 이하가 될때까지의 단어를 모아 후보로 삼음
ChatPromptTemplate
시스템 메시지, 사용자 메시지, ai 메시지 등 역할 구분
다중 메시지 기반의 프롬프트 흐름을 구성할 수 있도록 도와주는 템플릿
SystemMessage : AI에게 역할/성격을 지정
HumanMessage : 사용자 질문 또는 요청
AIMessage : AI응답
s_msg = "너는 친절하고 유머 있는 상담사야."
h_msg = "요즘 너무 지치고 의욕이 없어. 어떻게 하면 좋을까?"
chat_prompt = ChatPromptTemplate.from_messages([
("system", s_msg),
("human", h_msg),
])
llm = ChatOpenAI(temperature=1.1, model_kwargs={"top_p": 0.95})
messages = chat_prompt.format_messages() # 실제 메시지 객체 리스트를 생성
response = llm(messages)
print(response.content)
Output Praser
지금까지 LLM에게 어떻게 질문할 것인가를 다뤘다면, 이제 LLM이 반환한 답을 어떻게 정리하고 쓸 수 있는가에 집중해보면
왜 OutputPraser이 필요하지?
- LLM은 기본적으로 string을 반환
- 하지만 우리가 원하는 건 구조화된 데이터(리스트, 딕셔너리, json)
- outputpraser은 이런 텍스트를 우리가 원하는 형태로 가공해주는 도구
그래서 OutputPraser은 출력을 딱 우리가 원하는 상태로 규정해야하고 , 그 출력 결과를 json결과로 다뤄야 한다 .
🍈 대표적인 Output Praser : PydanticOutputParser
- Pydantic : 데이터를 정의하고 타입이 맞는지 자동으로 검증해줌
- basemodel은 구조에 대한 모델로, 틀 담고 있는 모델이라고 생각하자.
- 상속받아서 선언
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
BookInfo 결과를 받아올 틀을 정의. 이걸 틀로 잡아서 파서 생성
# 1. Pydantic 모델 정의
class BookInfo(BaseModel):
title: str
author: str
year: int
# 2. 파서 생성
parser = PydanticOutputParser(pydantic_object=BookInfo)
프롬프트 안에 BookInfo를 설명하는 것을 넣기. BookInfo 형태로 나오도록 format_instruction 구성
# 3. 프롬프트 구성 (ChatPromptTemplate 사용)
prompt = ChatPromptTemplate.from_messages([
("system", "너는 책 추천 전문가야."),
("human", "좋은 책 하나만 추천해줘. 제목과 저자, 출판년도를 알려줘."),
("system", "{format_instructions}") # 파서가 제공한 응답 형식 가이드
])
# 4. 메시지 생성
messages = prompt.format_messages(
format_instructions=parser.get_format_instructions() #BookInfo 형태로 나오도록.
)
parser.parse 하는 이유는 BookInfo형태로 저장하도록
# 5. LLM 호출 및 파싱
llm = ChatOpenAI(model_name = 'gpt-4o-mini', temperature=0.5, model_kwargs={"top_p": 0.95})
response = llm.invoke(messages)
book = parser.parse(response.content)
# 6. 결과 출력
print(book)
LangChainㅡMemory
자주사용되는 메모리 종류
메모리 | 특징 |
ConversationBufferMemory | 모든 대화를 전부 순차적으로 저장. 짧은 대화에 유용 |
ConversationSummaryMemory | 대화를 요약해서 저장 |
ConversationBufferWindowMemory | 최근 N턴만 기억 |
🍈ConversationBufferMemory
모든 대화 내용을 그대로 저장
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
# 메모리 포함 체인 생성
memory = ConversationBufferMemory()
llm = ChatOpenAI(model_name = 'gpt-4o-mini' ,temperature = 0.5)
chain = ConversationChain(llm=llm, memory=memory)
# 대화 시작
print(chain.run("안녕? 나는 기영이야."))
print(chain.run("내 이름이 뭐라고?"))
🍈ConversationSummaryMemory
- 긴 대화를 나눌 때 적합
- 대화를 요약해서 저장
from langchain.memory import ConversationSummaryMemory
# 요약 메모리 생성 (요약용 LLM 필요)
memory = ConversationSummaryMemory(llm = llm)
# 체인 구성
chain = ConversationChain(llm = llm, memory = memory)
# 대화
print(chain.run("오늘은 운동하고, 친구랑 밥도 먹고, 강의도 들었어."))
🍈ConversationBufferWindowMemory
최근 N턴의 대화만 기억
K=숫자 : 메모리 용량 조절 가능
from langchain.memory import ConversationBufferWindowMemory
# 최근 2턴만 기억하는 메모리(테스트 해보면 실제로는 k+1턴까지 기억)
memory = ConversationBufferWindowMemory(k=2)
chain = ConversationChain(llm=llm, memory=memory)
# 대화
print(chain.run("나는 기영이야."))
memory.load_memory_variables({})
'KT에이블스쿨' 카테고리의 다른 글
[KT AIVLE SCHOOL] AGENT (0) | 2025.04.27 |
---|---|
[KT AIVLE SCHOOL] RAG (1) | 2025.04.23 |
[KT AIVLE SCHOOL] LLM (0) | 2025.04.18 |
[KT AIVLE SCHOOL] 1차 미니프로젝트 (1) | 2025.04.15 |
[KT AIVLE SCHOOL] 자연어 처리 (1) | 2025.04.11 |