langchain / / 2024. 5. 22. 09:47

[LangChain] 랭체인은 무엇인가?

ChatGPT and LangChain: The Complete Developer's Masterclass 강좌의 일부를 요약한 내용이다.

랭체인(LangChain)은 무엇인가? 이것을 한마디로 설명하기는 어려운 주제이다. LangChain을 이해하기 위해서 pdf.ai 사이트의 동작을 이해하고 LangChain이 어떤 역할을 하는지를 파악하면 보다 이해하는 데 도움이 될 수 있다.

아래는 https://pdf.ai 이다. 이 사이트에서 하는 일은 pdf 파일을 업로드 하고 pdf 파일의 내용에 대해 chatgpt에게 물어보면 문서의 내용에 대해 친절하게 대답을 해준다. chatgpt에서 물어보는 것과 동일하게 문서의 내용에 대한 설명을 해준다는 것이다.

위의 사이트에서 왼쪽은 사용자가 업로드한 pdf 파일이고 우측은 pdf 파일에 대해 chatgpt에게 물어볼 수 있는 채팅창이다. 특정 질문을 날리면 문서의 내용을 거의 정확하게 찾아서 대답을 해준다. 결과에서 페이지 번호를 클릭하면 해당 페이지도 찾아간다.

이 사이트는 어떻게 동작하는 것일까? 만일 우리가 이와 동일한 사이트를 만든다면 어떻게 만들 수 있을까? 많은 방법이 있을 수 있지만 간단히 아래와 같은 두 가지 방법으로 생각해볼 수 있을 것이다.

1번째 방법)

  • ChatGPT에게 PDF의 모든 텍스트와 사용자 질문을 같이 보내어 답변을 요청한다.

이 경우 GPT가 원하는 질문을 찾아서 대답해 줄 것으로 기대가 되지만, 사실 그렇지 못하다.
왜냐하면 ChatGPT의 텍스트 전송 크기가 제한되어 있다. 그 이상을 보내면 에러가 발생한다. 만일 전체 텍스트를 보낼 수 있다고 해도 챗 모델은 많은 텍스트를 잘 처리하지 못한다. 실제 의미를 파악하는 데 많은 시간이 필요하고 짧은 메시지를 더 잘 처리한다.

그리고 ChatGPT에 텍스트 전송할 때 더 많은 비용이 든다는 것이다. 이런 이유로 1번째 방법은 좋은 방법이 아니다.

2번째 방법)

  1. PDF 업로드할 때 모든 텍스트 추출하고 청크(chunk)로 분리 (수백~수천개의 청크로 분리)
  2. 각 청크의 요약본을 저장 (임베딩)
  3. 사용자가 질문할 때 질문과 관련있는 청크를 찾는다. (관련있는 3~5개 정도)
  4. ChatGPT에게 보낼 때 가장 관련있는 청크와 사용자 질문을 ChatGPT에 보낸다.

효과적인 처리를 위한 텍스트 크기와 비용 측면에서 1번째 방법보다는 2번째 방법이 훨씬 나을 것이다.

그러면 chunk(청크)를 어떻게 나눠야 할까?

문서의 내용은 단락이나 절로 잘 쪼개져 있을 수도 있고 그렇지 않을 수도 있다. 특정 기준으로 chunk를 나눠야 하지만 일반적으로는 글자 수로 짜른다. 여기서는 1000자로 나눈다. 이 말은 청크의 단위로 1000글자가 존재한다는 것이다.

embedding(임베딩)은 무엇인가?

청크로 나눈 다음 임베딩 생성 알고리즘(Embedding Creation Algorithm)이라는 것을 한다.

위에서 "기분이 좋다"라는 글자를 embedding을 하게 되면 -1과 1사이의 배열이 생긴다. 여러 가지의 차원으로 생성되는 값인데 1536차원이 일반적이다.

Embedding(임베딩)은 주어진 텍스트가 무엇에 대해 말하고 있는지 절대적인 기준에 의해 나타내는 숫자 배열을 의미한다. 예를 들면 위의 "기분이 좋다"라는 텍스트가 있으면 얼마나 행복한가? 포테이토와 얼마나 관련이 있는지? 등산과의 연관성 등 여러가지 정보를 기록하여 관련성과 관련된 숫자이다. 이것이 1536가지가 있다는 것이다.

벡터 DB

위와 같이 텍스트를 임베딩한 결과를 데이터 베이스에 저장한다. 1000글자로 짜른 텍스트를 임베딩을 하고 그 결과를 저장한다는 것이다. 우리가 일반적으로 사용하는 RDB가 아닌 벡터DB에 저장한다. 물론 SQLite나 MySQL을 사용할 수도 있다.

다음으로 사용자가 질문했을 때 질문을 임베딩한 다음 벡터 저장소에서 질문을 임베딩 한 값과 가장 비슷한 청크를 찾는다. 그리고 ChatGPT에서 물어볼 때 검색된 청크와 함께 질문을 같이 보낸다. 그러면 해당 내용에서 결과를 잘 찾을 수 있을 것이다.

예를 들면 GPT에게 earth의 유래는 어디서 나왔어?라는 질문을 할 때 이에 대한 답을 벡터DB에서 검색하여 같이 GPT에게 물어본다는 뜻이다.

prompt의 내용은 아래와 같이 질문내용 + Vector DB 검색 결과(질문의 답을 찾을 수 있는 내용)로 구성이 된다.

earth의 유래는 고대 영어인 erode에서 현대 영어로 발전했다. <-- Vector DB 검색 결과
earth의 유래는 어디서 나왔어? <-- 질문 내용

위와 같이 질문하면 질문 내용에 답이 포함되어 있기 때문에 GPT가 쉽게 질문의 답을 찾을 수 있다.

이것이 pdf.ai 사이트의 전체 프로세스 내용이다.

랭체인의 목표

위와 같이 복잡한 프로세스가 있다. 사용자는 pdf를 읽고 청크로 나누는 방법도 모를 수 있다. 하지만 LangChain에서는 아래와 같이 간단하게 작성할 수 있다.

from langchain.document_loaders import unstructuredPDFLoader
loader = UnstructuredPDFLoader("earth.pdf")
data = loader.load()
print(data)

PDF 뿐만 아니라 HTML, Excel, Text, JSON 등 다양한 종류의 Loader도 지원한다.

그리고 다양한 벡터DB를 지원한다. Chroma, Pinecone, PGVector, Deep Lake, Weaviate, Redis 등 다양한 벡터DB를 사용할 수 있다. LangChain에서 지원하는 클래스를 사용함으로써 실제 구현부분을 완전히 감출 수 있게 한다.

아래 예는 다양한 벡터DB의 구현 내용이다.

[PGVector 구현]

from langchain.vectorstores.pgvector import PGVector

db = PGVector.from_documents(
    embedding=embeddings,
    documents=docs,
    collection_name="earth",
    connection_string=CONNECTION_STRING,
)
query = "earth의 유래는 어디에서 왔나?"
docs = db.similarity_search(query)

[Pinecone 구현]

from langchain.vectorstores.pgvector import PGVector

db = PGVector.from_documents(
    embedding=embeddings,
    documents=docs,
    index_name="earth",
)
query = "earth의 유래는 어디에서 왔나?"
docs = db.similarity_search(query)

[Redis 구현]

from langchain.vectorstores.pgvector import PGVector

db = PGVector.from_documents(
    embedding=embeddings,
    documents=docs,
    redis_url="redis://localhost:6379",
    index_name="earth",
)
query = "earth의 유래는 어디에서 왔나?"
docs = db.similarity_search(query)

[Weaviate 구현]

from langchain.vectorstores.pgvector import PGVector

db = PGVector.from_documents(
    embedding=embeddings,
    documents=docs,
    weaviate_url=weaviate_url,
)
query = "earth의 유래는 어디에서 왔나?"
docs = db.similarity_search(query)

랭체인의 목표는 아래와 같다.

LangChain은 텍스트 생성 파이프라인의 각 단계를 자동화하는 교체 가능한 도구를 제공한다.

  • 데이터 로딩, 파싱, 저장, 쿼리, ChatGPT로 전송할 수 있는 기능을 가지고 있다.
  • 다른 회사에서 제공하는 다양한 서비스와 통합할 수 있다.
  • ChatGPT외에 다른 서비스로 쉽게 교체할 수 있다.

참고

ChatGPT and LangChain: The Complete Developer's Masterclass

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유