Coding/Study

[AI]LangChain 기본 이론&실습(1)

후__아 2024. 7. 30. 15:40

이번에 데이콘의 재정정보 검색 알고리즘 대회https://dacon.io/competitions/official/236295/overview/description에 참여하게 되어

 

재정정보 AI 검색 알고리즘 경진대회 - DACON

분석시각화 대회 코드 공유 게시물은 내용 확인 후 좋아요(투표) 가능합니다.

dacon.io

 

관련 기술인 LangChain과 RAG에 대해 공부하고 실습해보고자 한다

(1년 동안 쉰 백수는 너무나 빠르게 흘러간 AI를 뒤쫓기 바쁘다 흑흑)


 

※ Langchain

대규모 언어 모델(LLM)과 애플리케이션의 통합을 간소화하는 SDK

API를 노출하여 기본 LLM의 구현 세부 사항을 요약 => 코드를 크게 변경하지 않고도 모델 교체/대체 가능

≫ 언어모델 용도 변경, AI 개발 간소화, 개발자 지원

 

흐름도

1. 데이터 소스: LLM에 대한 PDF/웹페이지/CSV/관계형 DB 등 외부 소스로부터 데이터를 검색
2. 단어 임베딩

- 텍스트를 임베딩 모델에 전달하기 위해 벡터로 변환되어야 함

- LLM을 기반으로 최적의 임베딩 모델을 선정

3. 벡터 DB

- 생성된 임베딩은 유사성 검색을 위해 벡터 DB에 저장

- 다양한 소스에서 벡터를 쉽게 저장하고 검색할 수 있도록 지원

4. LLM: 오픈AI, Cohere, AI21, Hugging Face에서 지원하는 오픈소스 LLM 지원

 

※ 구성 요소

- 랭체인 라이브러리

- 랭체인 템플릿: 참조 아키텍처 모음

- 랭서브(LangServe): 랭체인 체인을 REST API로 배포할 수 있게 하는 라이브러리

- 랭스미스(LangSmith): LLM 프레임워크에 구축된 체인을 디버깅/테스트/평가/모니터

 

※ LLM 체인

- 구성요소: 프롬프트(Prompt, 사용자/시스템에서 제공하는 입력 → LLM에게 특정 작업 수행 요청) + LLM

- 작동방식: 프롬프트 생성 → LLM 처리 → 응답 반환


# 필요한 라이브러리 설치
!pip install langchain
!pip install openai
!pip install langchain-community langchain-core
!pip insall langchain-openai
!pip install tiktoken

# openAI API
import os
os.environ["OPENAI_API_KEY"] = ""
LangChain LLM
from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
llm.invoke("서울의 유명 관광지는?")

프롬프트 템플릿 적용

명령어의 템플릿을 만들어 input을 조절할 수 있음

from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("너는 여행객이다. 질문에 대답해라. {input}에서 가장 인기있는 관광지는? 그리고 그곳들의 특징은?")
llm = ChatOpenAI(model="gpt-3.5-turbo-0125")

chain = prompt | llm    # chain 연결(LCEL)
chain.invoke({"input": "한국"})

문자열 출력 파서

깔끔하게 출력받고 싶다면 문자열 parser를 활용하면 됨!

from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_template("너는 여행객이다. 질문에 대답해라. {input}에서 가장 인기있는 관광지는? 그리고 그곳들의 특징은?")
llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
output_parser = StrOutputParser()

chain = prompt | llm | output_parser
chain.invoke({"input": "한국"})

 

 Multi-Chain

체인 여러 개를 연결해서 원하는 답을 얻을 수도 있음

chain2의 입력값을 chain1으로 설정

from langchain.chat_models import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

prom1 = ChatPromptTemplate.from_template("단어사전에서 {input}의 뜻은 무엇인가?")
prom2 = ChatPromptTemplate.from_template("{sentence}을 영어로 번역해라.")
llm = ChatOpenAI(model = "gpt-3.5-turbo-0125")
output_parser = StrOutputParser()

chain1 = prom1 | llm | output_parser
chain2 = (
    {"sentence": chain1}
    | prom2
    | llm
    | output_parser
)

chain2.invoke({"input": "미래"})

 

 

cf)

https://wikidocs.net/231346

https://aws.amazon.com/ko/what-is/langchain/

https://www.samsungsds.com/kr/insights/what-is-langchain.html