NIRVANA

[LangChain] LangChain 노트 CH01 정리 (+ env파일에서 API KEY 읽기) 본문

AI/LangChain

[LangChain] LangChain 노트 CH01 정리 (+ env파일에서 API KEY 읽기)

녜잉 2024. 7. 4. 22:55

CH01 LangChain 시작하기 

LangChain(랭체인)이란? 

언어 모델을 활용하여 다양한 어플리케이션을 개발할 수 있는 프레임워크. 해당 프레임워크를 통해 언어 모델은 다음의 기능을 수행할 수 있다. 

  • 문맥을 인식하는 기능: LangChain은 언어 모델을 프롬포트 지시사항, 소수의 예시, 응답에 근거한 내용 등 다양한 문맥 소스와 연결 
    • 이를 통해 모델은 제공된 정보를 기반으로 더 정확하고 관련성 높은 답변을 생성 
  • 추론하는 기능: 언어 모델은 주어진 문맥을 바탕으로 답변을 제공하거나, 어떤 조치를 취해야할 지 스스로 추론을 진행

따라서 랭체인을 활용하면 검색 증강 생성(RAG) 어플리케이션 제작, 구조화된 데이터 분석, 챗봇 등을 제작 가능 

 

 

구성

  • LangChain 라이브러리: 다양한 컴포넌트의 인터페이스 통합, 컴포넌트를 체인과 에이전트로 결합하는 기본 런타임, 즉시 사용 가능한 체인과 에이전트의 구현을 포함 
  • LangChain 템플릿: 다양한 작업을 위해 쉽게 배포할 수 있는 참조 아키텍처 모음
  • LangServe: LangChain 체인을 REST API로 배포하기 위한 라이브러리 
  • LangSmith: 어떤 LLM 프레임워크에서 구축된 체인이든지, 디버그, 테스트, 평가, 모니터링할 수 있게 해며 LangChain과 원할하게 통합되는 개발자 플랫폼
  • LangGraph: LLM을 사용한 상태 유지가 가능한 다중 액터 애플리케이션을 구축하기 위한 라이브러리, LangChain 위에 구축 되었으며 LangChain과 함께 사용되도록 설계됨. 여러 계산 단계에서 다중 체인(혹은 액터)을 순환 방식으로 조정할 수 있는 능력을 LangChain 표현 언어에 추가 

 

주요 모듈

모델 I/O

프롬포트 관리, 최적화 및 LLM과의 일반적인 인터페이스와 작업을 위한 유틸리티를 포함 

 

검색

데이터 강화 생성에 초점을 맞춘 모듈. 생성 단계에서 필요한 데이터를 외부 데이터 소스에서 가져오는 작업을 담당 

 

에이전트

언어 모델이 어떤 조치를 취할지 결정하고, 해당 조치를 실행하며, 관찰하고, 필요한 경우 반복하는 과정을 포함 

 

→ LangChain을 활용할 경우, 언어 모델 기반 애플리케이션 개발을 보다 쉽게 시작할 수 있고, 필요에 맞게 기능을 설정하고, 다양한 데이터 소스와 통합하여 복잡한 작업 처리가 가능 

 


 

01. OPEN AI 키 발급 및 테스트 

import os
from dotenv import load_dotenv
load_dotenv()

print(os.environ.get("OPENAI_API_KEY"))

 

키를 발급 받은 후, .env 파일에 OPEN AI KEY를 선언한 뒤 다음과 같이 불러올 수 있다. 

(야호 하드 코딩 했던 나날 안녕...)

 

 


02. LangSmith 추적 설정 

LangSmtih

LLM 애플리케이션 개발, 모니터링 및 테스트를 위한 플랫폼 

 

LangSmith의 추적 기능 

추적은 LLM 애플리케이션 동작을 이해하기 위한 가장 강력한 도구로, 다음과 같은 문제를 추적하는데 도움을 줄 수 있다. 

  • 예상치 못한 최종 결과
  • 에이전트가 루핑되는 이유
  • 체인이 예상보다 느린 이유
  • 에이전트가 각 단계에서 사용한 토큰 수 

LangSmith 키를 발급 받은 후, env파일에 다음을 추가해준다. 

LANGCHAIN_TRACING_V2: "true" 로 설정하면 추적을 시작
LANGCHAIN_ENDPOINT: https://api.smith.langchain.com 
LANGCHAIN_API_KEY: 이전 단계에서 발급받은 키입력
LANGCHAIN_PROJECT: 프로젝트 이름

 

# -*- encoding: euc-kr-*-
import os
from dotenv import load_dotenv
from langchain_teddynote import logging

load_dotenv()

logging.langsmith("lang_study")
#logging.langsmith("lang_study", set_enable=False)
#print(os.environ.get("OPENAI_API_KEY"))

 

 


03. OpenAI API 사용(GTP-4o 멀티 모달)

 

# -*- encoding: euc-kr-*-
import os
from dotenv import load_dotenv
from langchain_teddynote import logging

#API KEY 정보로드 
load_dotenv()

logging.langsmith("CH01-Basic")

 

ChatOpenAI

  • openAI 사의 채팅 전용 LLM
  • 객체를 생성할 때, 다음의 옵션 값 지정 가능 

Temperature

  • 사용할 샘플링 온도, 0~2사이에서 선택
  • 0.8과 같은 높은 값은 출력을 더 무작위로 만들고, 0.2와 같이 낮은 값은 출력을 더 집중 되고 결정론적으로 만듦 

max_token

  • 채팅 완성에서 생성할 토큰의 최대 개수 

 

modal_name

  • 적용 가능한 모델 리스트 
    • gpt-3.5-turbo
    • gpt-4-turbo
    • gpt-4o
pip install -U langchain-openai
# -*- encoding: euc-kr-*-
import os
from dotenv import load_dotenv
from langchain_teddynote import logging
from langchain_openai import ChatOpenAI

#API KEY 정보로드 
load_dotenv()
#logging.langsmith("CH01-Basic")

llm = ChatOpenAI(
    temperature=0.1,
    model_name = "gpt-3.5-turbo",
)

question = "대한민국의 수도는 어디인가요? "

print(f"[답변]: {llm.invoke(question)}")

 

 

답변 형식 살펴보기 

1) content

'대한민국의 수도는 서울입니다.'

 

2) response_metadata

{'token_usage': {'completion_tokens': 15, 'prompt_tokens': 25, 'total_tokens': 40}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}

 

 

 

LogProb 활성화

  • 주어진 텍스트에 대한 모델의 토큰 확률의 로그 값

✨ 토큰: 문장을 구성하는 개별 단어, 문자 등의 요소

✨ 확률: 모델이 토큰을 예측할 확률 

 

# -*- encoding: euc-kr-*-
import os
from dotenv import load_dotenv
from langchain_teddynote import logging
from langchain_openai import ChatOpenAI

#API KEY 정보로드 
load_dotenv()
#logging.langsmith("CH01-Basic")

llm_with_logprob = ChatOpenAI(
    temperature=0.1,
    max_tokens=2048, 
    model_name = "gpt-3.5-turbo",
)

question = "대한민국의 수도는 어디인가요? "

response = llm_with_logprob.invoke(question)

print(response.response_metadata)

 

{'token_usage': {'completion_tokens': 15, 'prompt_tokens': 25, 'total_tokens': 40}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}

 

출력이 잘 안 된 것 같음..

 

 

스트리밍 출력

스트리밍 옵션은 질의에 대한 답변을 실시간으로 받을 때 유용하게 사용됨 

# -*- encoding: euc-kr-*-
import os
from dotenv import load_dotenv
from langchain_teddynote import logging
from langchain_openai import ChatOpenAI

#API KEY 정보로드 
load_dotenv()
#logging.langsmith("CH01-Basic")
llm = ChatOpenAI(
    temperature=0.1,  # 창의성 (0.0 ~ 2.0)
    model_name="gpt-4o",  # 모델명
)

answer = llm.stream("대한민국의 아름다운 관강지 10곳과 주소를 알려주세요.")

# 스트리밍 방식으로 각 토큰을 출력
for token in answer:
    print(token.content, end="", flush=True)

 

 

멀티 모달 모델(이미지 인식) 

멀티모달

  • 여러 가지 형태의 정보(모달)를 통합하여 처리하는 기술, 접근 방식
  • 다음과 같은 다양한 데이터 유형을 포함할 수 있음
    • 텍스트: 문서, 책, 웹 페이지 등의 글자로 된 정보
    • 이미지: 사진, 그래픽, 그림 등 시각적 정보
    • 오디오: 음성, 음악, 소리, 효과 등의 청각적 정보
    • 비디오: 동영상 클립, 실시간 스트리밍 등 시각적 및 청각적 정보의 결합 
# -*- encoding: euc-kr-*-
import os
from dotenv import load_dotenv
from langchain_teddynote import logging
from langchain_openai import ChatOpenAI
from langchain_teddynote.models import MultiModal
from langchain_teddynote.messages import stream_response

#API KEY 정보로드 
load_dotenv()
#logging.langsmith("CH01-Basic")
llm = ChatOpenAI(
    temperature=0.1,  # 창의성 (0.0 ~ 2.0)
    max_tokens=2048,
    model_name="gpt-4o",  # 모델명
)

multimodal_llm = MultiModal(llm)

IMAGE_URL = "https://t3.ftcdn.net/jpg/03/77/33/96/360_F_377339633_Rtv9I77sSmSNcev8bEcnVxTHrXB4nRJ5.jpg"

# 이미지 파일로 부터 질의
answer = multimodal_llm.stream(IMAGE_URL)
# 스트리밍 방식으로 각 토큰을 출력합니다. (실시간 출력)
stream_response(answer)

 

System, User 프롬포트 수정 

# -*- encoding: euc-kr-*-
import os
from dotenv import load_dotenv
from langchain_teddynote import logging
from langchain_openai import ChatOpenAI
from langchain_teddynote.models import MultiModal
from langchain_teddynote.messages import stream_response

#API KEY 정보로드 
load_dotenv()
#logging.langsmith("CH01-Basic")
llm = ChatOpenAI(
    temperature=0.1,  # 창의성 (0.0 ~ 2.0)
    max_tokens=2048,
    model_name="gpt-4o",  # 모델명
)

system_prompt = """당신은 표(재무제표) 를 해석하는 금융 AI 어시스턴트 입니다. 
당신의 임무는 주어진 테이블 형식의 재무제표를 바탕으로 흥미로운 사실을 정리하여 친절하게 답변하는 것입니다."""

user_prompt = """당신에게 주어진 표는 회사의 재무제표 입니다. 흥미로운 사실을 정리하여 답변하세요."""

# 멀티모달 객체 생성
multimodal_llm_with_prompt = MultiModal(
    llm, system_prompt=system_prompt, user_prompt=user_prompt
)

IMAGE_PATH_FROM_FILE = "https://storage.googleapis.com/static.fastcampus.co.kr/prod/uploads/202212/080345-661/kwon-01.png"

# 이미지 파일로 부터 질의(스트림 방식)
answer = multimodal_llm_with_prompt.stream(IMAGE_PATH_FROM_FILE)

# 스트리밍 방식으로 각 토큰을 출력합니다. (실시간 출력)
stream_response(answer)

 


 

04. LangChain Expression Language(LCEL)

기본예시: 프롬프트 + 모델 + 출력 파서 

  • 가장 기본적이고 일반적인 사용 사례는 prompt 템플릿과 모델을 함께 연결하는 것
  • 어떻게 작동하는지 보기 위해, 각 나라별 수도를 물어보는 chin 생성 진행 

 

프롬프트 템플릿의 활용

Prompt Template

  • 사용자의 입력 변수를 사용하여 완전한 프롬프트 문자열을 만드는데 사용되는 템플릿
  • 사용법
    • template: 템플릿 문자열. 해당 문자열 내에서 중괄호는 {}는 변수를 나타냄
    • input_variables: 중괄호 안에 들어갈 변수의 이름을 리스트로 정의 

 

input_variables

  • 프롬프트 템플릿에서 사용되는 변수의 이름을 정의하는 리스트 

 

 

Chain 생성

 

다음과 같이 구성되어 있을 때, LCEL을 사용하여 다양한 구성 요소를 단일 체인으로 결합 가능 

 

chain = prompt | model | output_parser

 

  • | 기호는 unix 파이프 연산자와 유사한 역할, 서로 다른 구성 요소를 연결하고 한 구성 요소의 출력을 다음 구성 요소의 입력으로 전달
    • 체인에서 사용자 입력은 프롬프트 템플릿으로 전달 되고, 프롬프트 템플릿의 출력은 모델로 전달이 되게 됨 
    • 이때, 각 구성 요소를 개별적으로 살펴보면 무슨 일이 일어나는 지 이해 가능 

 

invoke() 호출 

  • python 딕셔너리 형태로 입력값을 전달
  • invoke() 함수 호출 시, 입력값을 전달 

 


 

 

05. LCEL 인터페이스 

LCEL 인터페이스 

Runnable 프로토콜 

  • 표준 인터페이스, 사용자 정의 체인을 정의하고 표준 방식으로 호출하는 것을 쉽게 만듦 
  • 표준 인터페이스에는 다음이 포함된다. 
    • stream: 응답의 청크를 스트리밍함
    • invoke: 입력에 대해 체인을 호출함
    • batch: 입력 목록에 대해 체인을 호출 
  • 비동기 메서드
    • astream: 비동기적으로 응답의 청크를 스트리밍
    • ainvoke: 비동기적으로 입력에 대해 체인을 호출
    • abatch: 비동기적으로 입력 목록에 대해 체인을 호출
    • astream_log: 최종 응답뿐만이 아니라 발생하는 중간 단계를 스트리밍

 

Stream: 실시간 출력

chain.stream

  • 주어진 토픽에 대한 데이터 스트림을 생성하고, 스트림을 반복하여 각 데이터의 내용을 즉시 출력
  • end=""인자는 출력 후 줄바꿈을 하지 않도록 설정
  • flush=True 인자는 출력 버퍼를 즉시 비우도록 함 

 

invoke: 호출

invoke

  • 주제를 인자로 받아 해당 주제에 대한 처리를 수행 

 

batch: 배치 (실행 단위)

chain.batch

  • 여러 개의 딕셔너리를 포함하는 리스트를 인자로 받음
  • 각 딕셔너리에 있는 topic 키의 값을 사용하여 일괄 처리 수행 
  • max_concurrency: 동시 요청 수를 설정하는 매개변수
  • config 딕셔너리: max_concurrency 키를 통해 동시에 처리할 수 있는 최대 작업 수를 설정

 

async stream: 비동기 스트림 

chain.astream

  • 비동기 스트림 생성, 주어진 토픽에 대한 메시지를 비동기적으로 처리 
  • 비동기 for 루프를 사용하여 스트림에서 메시지를 순차적으로 받아오고, pring함수를 통해 메시지의 내용을 즉시 출력
  • end=""인자는 출력 후 줄바꿈을 하지 않도록 설정
  • flush=True 인자는 출력 버퍼를 즉시 비우도록 함 

 

async invoke: 비동기 호출

chain.invoke

  • 비동기적으로 주어진 인자를 사용하여 작업 수행
  • topic과 NVDA(엔비디아의 티커)라는 값을 가진 딕셔너리를 인자로 전달 
  • 특정 토픽에 대한 처리를 비동기적으로 요청할 때 사용 

 

async batch: 비동기 배치 

  • 함수 abatch는 비동기적으로 일련의 작업을 일괄 처리 
  • 해당 예시에서는 chain 객체의 abatch 메서드를 사용, topic에 대한 작업을 비동기적으로 처리 

 

Parallel: 병렬성

  • LCEL은 RunnableParallel을 사용할 떄, 각 요소를 병렬로 실행

 

배치에서의 병렬 처리 

  • 병렬 처리는 다른 실행 가능한 코드와 결합 가능
  • 배치와 병렬 처리를 함께 사용 가능 

 

 


06. Runnable

데이터를 효과적으로 전달하는 방법

  • RunnablePassthrough는 입력을 변경하지 않거나 추가 키를 더하여 전달 가능
  • RunnablePassthrough()가 단독으로 호출되면, 단순히 입력을 받아 그대로 전달 가능
  • RunnablePassthrough.assifn(...) 방식으로 호출 될 경우, 입력을 받아 assign함수에 전달된 추가 인수를 추가 

 

RunnablePassthrough는 runnable 객체이고, runnable 객체는 invoke() 메서드를 사용하여 별도 실행 가능 

 

 

 

해당 강의를 읽고 정리하였습니다!

https://wikidocs.net/book/14314

 

<랭체인LangChain 노트> - LangChain 한국어 튜토리얼🇰🇷

**추천**은 공유할 수 있는 무료 전자책을 집필하는데 정말 큰 힘이 됩니다. **추천** 한 번씩만 부탁 드리겠습니다🙏🙏 ✅ **랭체인 한국어 튜토리얼 강의** …

wikidocs.net

 

 

 

 

 

 

 

 

 

'AI > LangChain' 카테고리의 다른 글

[LangChain] LangChain노트 CH04 정리  (0) 2024.07.12
[LangChain] LangChain 노트 CH03 정리  (0) 2024.07.12
[LangChain] LangChain 노트 CH02 정리  (0) 2024.07.05