AI

[AI] 랭체인(LangChain) 개념 및 사용방법

usingsystem 2024. 5. 8. 12:17
728x90

랭체인(LangChain) 라이브러리는 자연어 처리(NLP)와 관련된 다양한 기능을 제공하는 파이썬 라이브러리입니다.
이 라이브러리의 주요 목적은 대화형 AI 시스템을 구축하고 연구하는 데 있어 유용한 도구를 제공하는 것입니다.

 

랭체인은 LLM모델을 직접적으로 만드는 것 이 아닌 이미 만들어져있는 LLM모델을 API등으로 연동하여 실제 어플리케이션으로 묶어주는 역활을 수행한다.

랭체인 특징

1. 챗봇 구축: LangChain은 챗봇과 대화형 AI 시스템을 구축하기 위한 도구를 제공합니다. 이를 통해
사용자는 자신만의 챗봇을 쉽게 만들 수 있습니다.
2. 다양한 자연어처리(NLP) 기능: 이 라이브러리는 텍스트 생성, 요약, 번역과 같은 다양한 자연어 처리 기능
포함하고 있습니다.
3. 플러그 앤 플레이 아키텍처: 사용자는 LangChain을 사용하여 기존의 NLP 모델이나 시스템과 쉽게
통합할 수 있습니다. 이를 통해 다양한 언어 모델과 기능을 손쉽게 결합할 수 있습니다. 허깅페이스와 연동이 쉽다.
4. 확장성 및 커스터마이징: LangChain은 사용자가 자신의 요구사항에 맞게 시스템을
커스터마이즈하고 확장할 수 있도록 설계되었습니다. 이는 연구자나 개발자들에게 매우 유용한
특징입니다.
5. 연구 및 개발 지원: LangChain은 연구자와 개발자들이 새로운 대화형 AI 모델을 실험하고 개발하는
데 도움을 줍니다.

LangChain을 통해 사용자는 복잡한 NLP 시스템을 보다 쉽게 구축하고 실험할 수 있습니다.

LLM에 외부 데이터 소스를 연동하는 방법

  1. Fine-Tuning : 외부 새로운 지식에 관한 텍스트 데이터 소스를 이용해서 LLM의 파라미터를 Fine-Tuning합니다.
  2. Retrieval-Augmented Generation (RAG) : 랭체인을 이용한 접근 방식으로 새로운 지식에 관한 텍스트 데이터 소스를 Embedding해서 Vector stores에 저장하고, 프롬프트 구성을 진행할때 외부 데이터 소스로부터 가져온 텍스트 데이터를 함께 이용해서 프롬프트를 구성한뒤 LLM으로 부터 답변을 얻어냅니다. 즉 LLM의 재학습 없이 그냥 외부 텍스트를 프롬프트 단에 묶어줘서 결과 생성 

랭체인 순서

Load -> Transform -> Embed -> Store -> vectorStore -> Retrieval-Augmented Generation

Load

랭체인을 이용하여 외부 텍스트 소스를 가져와서 LLM과 연동하기 위한 과정이다.

https://python.langchain.com/v0.1/docs/modules/data_connection/document_loaders/

 

Document loaders | 🦜️🔗 LangChain

Head to Integrations for documentation on built-in document loader integrations with 3rd-party tools.

python.langchain.com

  1. WebBaseLoader
  2. CSV
  3. File Directory
  4. HTML
  5. JSON
  6. Markdown
  7. PDF
from langchain.document_loaders import PyPDFLoader

# url을 통해서 pdf 정보 가져오기
loader = PyPDFLoader("https://snuac.snu.ac.kr/2015_snuac/wp-content/uploads/2015/07/asiabrief_3-26.pdf")
pages = loader.load_and_split()
pages[0]

Transform

document-loaders 모듈로 불러온 텍스트를 하나의 긴 텍스트로 되어있기 때문에 트랜스포메이션 변환 과정을 사용하여 좀 더 사용하기 쉽게 변환하는 과정이다. 즉 좀 더 작은 단위로 변환하는 과정이다.

 

https://python.langchain.com/v0.1/docs/modules/data_connection/document_transformers/

 

Text Splitters | 🦜️🔗 LangChain

Once you've loaded documents, you'll often want to transform them to better suit your application. The simplest example

python.langchain.com

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size = 100,
    chunk_overlap  = 20,
    length_function = len,
    add_start_index = True,
)

기본으로 사용하는 Text splitter는 RecursiveCharacterTextSplitter이다.

기본적으로 사용하는 구분 기호는 ["\n\n", "\n", " ", ""]이다.

  1. length_function : chunk의 길이를 계산하는 방법을 지정하며 기본값으로는 문자의 길이로 지정하지만 토큰의 개수로 지정하는 경우도 흔합니다.
  2. chunk_size :  chunk의 최대 크기 (length_function에서 정의한 기준에 따른다)
  3. chunk_overlap : chunk 간에 최대 중복 크기 자연스러운 연결을 위해서 적절한 길이의 중복이 있는 것이 좋습니다.
  4. add_start_index : 원본 문서내에서 chunk의 시작위치를 metadata에 포함할지 말지를 결정합니다.

Embed

복잡한 지식 영역을 이해하는 데 사용하는 실제 객체를 수치로 표현한 것입니다.

이렇게 임베딩한 vector 모듈을 저장하는게 vector store에 저장한다. 저장한 vector store를 쿼리로 불러 다시 호출한다.

vector store에는 chromadb가 있다.

 

from langchain.docstore.document import Document

sample_texts = [
        "안녕!",
        "빨간색 공",
        "파란색 공",
        "붉은색 공",
        "푸른색 공"
]

documents =  []
for item in range(len(sample_texts)):
    page = Document(page_content=sample_texts[item])
    documents.append(page)

documents
query = "빨간 공"
docs = db.similarity_search(query)
print(docs[0].page_content)

vectorStore 

이미 임베딩된 결과값을 저장하는 용도

from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings

vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings(openai_api_key=OPENAI_KEY)) # text-embedding-ada-002
retriever = vectorstore.as_retriever()

Retrieve

LLM 모듈과 연동해서 Vector Store에 저장된 내용을 쿼리 스트링으로 질문에 대한 프롬프트를 주면 리트리버가 벡터 스토어에서 유사한 텍스트 를 찾아주고 리스폰스로 넘어온 chunk 텍스트를 토대로 최종적으로 LLM이 그 리턴된 텍스트랑 질문을 종합하여 최종 답변을 만들어주는 역활을 한다.

retrieved_docs = retriever.invoke(
    "질문넣는 곳"
)
print(retrieved_docs[0].page_content)

Chain - Retrieve (RAG)

랭체인을 이용하여 LLM을 학습시키는 방식으로 LLM의 재학습 없이 그냥 외부 텍스트를 프롬프트 단에 묶어줘서 결과를 도출하는 것 

from langchain.prompts import PromptTemplate

template = """다음과 같은 맥락을 사용하여 마지막 질문에 대답하십시오.
만약 답을 모르면 모른다고만 말하고 답을 지어내려고 하지 마십시오.
답변은 최대 세 문장으로 하고 가능한 한 간결하게 유지하십시오.
항상 '질문해주셔서 감사합니다!'라고 답변 끝에 말하십시오.
{context}
질문: {question}
도움이 되는 답변:"""
rag_prompt_custom = PromptTemplate.from_template(template)
# GPT-3.5 trurbo를 이용해서 LLM 설정
from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0, openai_api_key=OPENAI_KEY)
# RAG chain 설정
from langchain.schema.runnable import RunnablePassthrough

rag_chain = {"context": retriever, "question": RunnablePassthrough()} | rag_prompt_custom | llm
rag_chain.invoke("물어볼 텍스트")

 

 

 

 

참고 - https://www.samsungsds.com/kr/insights/the-concept-of-langchain.html

 

랭체인(LangChain)의 개념과 이해 | 인사이트리포트 | 삼성SDS

랭체인은 언어 모델 기반의 애플리케이션을 개발하는 프레임워크입니다. 랭체인을 사용해 챗봇 또는 개인 비서를 만들고, 문서 또는 구조화된 데이터에 대한 Q&A를 요약, 분석, 생성하고, 코드를

www.samsungsds.com

728x90