본문 바로가기

KT에이블스쿨

[KT AIVLE SCHOOL] LangChain

LangChain이란?

 

Q)openai나 transformer을 쓰면 되지 왜 langchain을 쓸까?

A)체인으로 llm 사용을 조합하기 위해서 

사용자 질문으로 프롬프트 템플릿ㅡ> LLM호출 ㅡ>파싱ㅡ> DB저장ㅡ> 다음질문과 연결

 

이걸 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