2024년 4월 21일 일요일

랭체인과 임베딩 벡터 데이터베이스 아키텍처 및 알고리즘 분석

이 글은 랭체인과 임베딩 벡터 데이터베이스를 분석한 것이다. 이를 통해, LLM 서비스 개발에 필요한 라이브러리 및 데이터베이스 구조를 이해하고, 다양한 분야에 응용할 수 있다. 
이 글은 다음 라이브러리 및 플랫폼 아키텍처 및 알고리즘을 분석한다. 
  • 랭체인
  • 벡터 데이터베이스
  • OLLAMA
  • LLAMA2.c

이 글에 관련된 용어와 상세 개념은 다음 링크를 참고한다. 

Chroma(크로마)는 AI 지원 오픈소스 벡터 베이터베이스이다. RAG 처리할 때 필수적으로 사용되는 데이터베이스 중 하나이다. 크로마를 이용해 LLM 기반 다양한 앱(지식 서비스 등)을 개발할 수 있다. 
크로마는 임베딩 벡터를 메타데이터와 함께 저장하고, 질의를 통해 해당 임베딩 도큐먼트를 검색할 수 있다. 크로마는 서버로써 동작될 수 있다(데모). 

크로마는 해커 기질과 철학이 섞여 있는 Jeff Huber, Anton Troynikov가 공동 개발하였다. 이들은 이전에 3D computer vision, 로보틱스 분야에 일했던 경험이 있다. 현재, 크로마는 1,800만달러를 펀딩받았고, 다음 라운드를 준비하고 있다. 
공동 개발자 Jeff Huber, Anton Troynikov

크로마 설치는 다음과 같다. 
pip install chromadb

벡터 데이터베이스에 저장되는 단위는 다음과 같다. 
collection = client.create_collectoin(name='test', embedding_function=emb_fn)

collection.add(
    embeddings=[
        [1.1, 2.3, 3.2],
        [4.5, 6.9, 4.4],
        [1.1, 2.3, 3.2]
    ],
    metadatas=[
        {"uri": "img1.png", "style": "style1"},
        {"uri": "img2.png", "style": "style2"},
        {"uri": "img3.png", "style": "style1"}
    ],
    documents=["doc1", "doc2", "doc3"],
    ids=["id1", "id2", "id3"],
)

보는 것 같이, 벡터 좌표계에 위치할 임베딩 벡터, 벡터에 매달아 놓을 메타데이터와 도큐먼트, ID를 하나의 컬랙션 단위로 저장한다. 이를 통해, 벡터 간 유사도, 거리 등을 계산해, 원하는 도큐먼트, 메타데이터 등을 얻을 수 있다. 이때 임베딩 벡터는 미리 학습된 임베딩 모델을 사용할 수 있다. 

질의해 원하는 벡터를 얻으려면, 벡터 공간에서 거리계산이 필수적이다. 이때 사용하는 함수는 다음과 같다. 

컬렉션에 벡터 추가와 질의는 다음과 같다. 
collection.add(
    documents=["doc1", "doc2", "doc3", ...],
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    ids=["id1", "id2", "id3", ...]
)

collection.query(
    query_texts=["doc10", "thus spake zarathustra", ...],
    n_results=10,
    where={"metadata_field": "is_equal_to_this"},
    where_document={"$contains":"search_string"}
)

여기서, where의 metadata_field를 이용해 다음과 같은 조건 비교 연산이 가능하다.
  $eq, $ne, $gt, $gte, $lt, $lte
 
그리고, 논리 연산자인 $and, $or를 지원한다.

크로마는 향후, 워크플로우, 가시화, 질의 계획, 분석 기능을 준비하고 있다. 

Langchain 구조 분석
Langchain(랭체인)은 LLM에 원하는 결과를 얻을 수 있도록, RAG, 튜닝과 같은 기능을 제공하는 라이브러리다. 랭체인 설치는 다음과 같다(참고). 
pip install langchain

랭체인은 모델 입출력, 데이터 검색, 에이전트 지원, 체인, 컨텍스트 메모리 기능을 제공하며, LCEL(LangChain Expression Language)를 이용해 각 구성요소를 유기적으로 연결시킬 수 있다. 다음은 LCEL 예시를 보여준다. 

from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema import BaseOutputParser

# LCEL Example chain
chain = ChatPromptTemplate() | ChatOpenAI() | CustomOutputParser()

이와 더불어, 목적에 맞는 다양한 프롬프트 템플릿, 구조화된 출력을 제공한다.
from langchain.output_parsers.json import SimpleJsonOutputParser

# Create a JSON prompt
json_prompt = PromptTemplate.from_template(
    "Return a JSON object with `birthdate` and `birthplace` key that answers the following question: {question}"
)

# Initialize the JSON parser
json_parser = SimpleJsonOutputParser()

# Create a chain with the prompt, model, and parser
json_chain = json_prompt | model | json_parser

# Stream through the results
result_list = list(json_chain.stream({"question": "When and where was Elon Musk born?"}))

# The result is a list of JSON-like dictionaries
print(result_list)



LLamaIndex 구조 분석
LLamaIndex는 LLM 클라우드에서 원하는 LLM을 검색하여, 모델을 다운로드받고, 사용하기 전까지 필요한 단계를 자동화한 라이브러리이다. 

레퍼런스
부록: RAG 기반 SQL 코딩 에이전트 개발


댓글 없음:

댓글 쓰기