NLP | LLM

[LangChain] 1. LangChain의 모든 것

삐롱K 2025. 6. 17. 14:48
728x90
반응형

LangChain

  • LLM을 활용한 애플리케이션 개발을 위한 오픈소스 프레임워크
  • LLM과의 상호작용, 메모리 관리, 체인 실행, 데이터 처리 등을 통해 복잡한 AI 애플리케이션을 효율적으로 구축할 수 있음.
  • LangGraph: 그래프 기반 모델링을 도와주는 패키지로, 여러 작업을 동시에 처리하거나 특정 조건에 따라 작업을 분기하는 복잡한 애플리케이션을 설계할 수 있음.
  • LangSmith: LLM 애플리케이션을 디버킹, 테스트, 평가, 모니터링할 수 있는 개발자 플랫폼
  • LangServe: REST API 배포를 도와주는 패키지, 랭체인의 체인을 REST API로 간편하게 배포할 수 있음.
  • 장점: 특정 작업을 수행할 때 원하는 기능을 손쉽게 사용할 수 있어 프로젝트의 복잡성을 줄이고 개발 효율을 극대화 함
    • 모듈성: 모든 기능을 독립적으로 제공 
    • 통합의 용이성: 다양한 외부 시스템과 쉽게 연동 
    • 커뮤니티와 지원  

 

Why LangChain?

  • OpenAI API로 AI 애플리케이션을 충분히 개발할 수 있지만, 랭체인을 활용하면 모든 기능을 모듈 단위로 나눠 제공하기 때문에 개발자가 원하는 기능을 필요할 때 수비게 추가하거나 교체할 수 있음.
  • 다양한 외부 시스템과 연동할 수 있는 표준 인터페이스를 제공

 

LLM 파라미터

  • temperature: 생성 응답의 다양성을 조정. 0~1 사이의 값으로 값이 작을 수록 예측 가능하고 일관된 출력을 생성, 값이 클수록 다양하고 창의적인 출력을 생성
  • max tokens: 생성할 최대 토큰 수를 지정하여 생성할 텍스트의 길이를 제한
  • Top P: 생성 과정에서 특정 확률 분포 내에서 상위 P%의 토큰만을 고려하는 방식. 출력의 다양성 조절
  • Frequency Penalty: 0~1. 값이 클수록 이미 등장한 단어나 구절이 다시 등장할 확률을 감소시킴. 텍스트의 다양성 증가
  • Presence Penalty: 텍스트 내에서 단어의 존재 유무에 따라 해당 단어의 선택 확률을 조정. 0~1. 값이 클수록 아직 텍스트에 등장하지 않은 새로운 단어 사용 장려
  • Stop Sequences: 특정 단어나 구절이 등장할 경우 생성을 멈추도록 설정하여 특정 포인트에서 종료하고자 할 때 사용

 

표현 언어

  • 러너블(runnable): 랭체인에서 작업을 실행할 수 있는 단위로, 이들을 서로 연결하여 연속적인 작업을 처리할 수 있음
- invoke(): 단일 입력을 처리하여 결과를 반환하는 동기 메서드
- batch(): 여러 입력을 동시에 처리하는 동기 메서드
- stream(): 결과를 스트리밍 방식으로 반환하는 동기 메서드
- ainvoke(): invoke()의 비동기 버전
- abatch(): batch()의 비동기 버전
- astream(): stream()의 비동기 버전
- astream_log(): 중간 단계와 최종 결과를 비동기적으로 스트리밍
- astream_events(): 체인에서 발생하는 이벤트를 비동기적으로 스트리밍

 

1) 라이브러리 불러오기

from dotenv import load_dotenv
import os
from langchain_openai import OpenAI

load_dotenv("/content/.env") # .env 파일에서 환경 변수 로드
api_key = os.getenv("OPENAI_API_KEY") # 환경 변수에서 API 키 가져오기
llm = OpenAI() # 오픈AI 대규모 언어 모델 초기화

 

2) 호출

# 라이브러리 불러오기
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 오픈AI의 대규모 언어 모델 설정
model = ChatOpenAI(model="gpt-4o-mini")

# 프롬프트 템플릿 정의: 주어진 주제에 대한 설명 요청
prompt = ChatPromptTemplate.from_template("주제 {topic}에 대해 짧게 설명을 해주세요")

# 출력 파서 정의: AI 메시지의 출력 내용을 추출
parser = StrOutputParser()

# 프롬프트, 모델, 출력 파서를 체인으로 연결
chain = prompt | model | parser

# 응답을 호출
chain.invoke({"topic":"더블딥"})
chain.batch([{"topic": "더블딥"}, {"topic": "인플레이션"}])

 

  • 토큰 단위로 호출
# 응답을 토큰 단위로 스트리밍하여 출력
for token in chain.stream({"topic":"더블딥"}):
# 스트리밍된 내용을 출력, 각 내용을 붙여서 출력하며, 버퍼를 즉시 플러시하여 실시간으로 보여줌
print(token, end="", flush=True)

 

3) 프롬프트 템플릿
- 문자열 프롬프트

from langchain_core.prompts import PromptTemplate

prompt_template = PromptTemplate.from_template("주제 {topic}에 대해 금융 관련 짧은 조언을 해주세요")
prompt_template.invoke({"topic": "투자"})

 

- 챗 프롬프트

from langchain_core.prompts import ChatPromptTemplate

# 챗 프롬프트 템플릿 정의: 사용자와 시스템 간의 메시지를 포함
prompt_template = ChatPromptTemplate.from_messages([
		("system", "당신은 유능한 금융 조언가입니다."),
		("user", "주제 {topic}에 대해 금융 관련 조언을 해주세요")
		])

prompt_template.invoke({"topic": "주식"})
  • system: AI 역할을 정의하여, AI가 어떤 종류의 응답을 제공해야 하는지 명확하게 함
  • user: 사용자가 요청하는 내용을 포함하여, AI에게 특정 정보를 요청

 

4) 대화 관리

  • 기본적인 대화 이력 전달
  • 대화 이력 관리 및 처리
  • 자동 대화 이력 관리
  • 대화 이력 요약 및 트리밍
  • 대화 요약 활용

 



Last Updated. 2025.06.24

🔖 참고 자료
RAG 마스터_github

728x90
반응형