chroma ( 크로마 ) 활용한 자연어 유사도 분석 (No Embedding )

2023. 5. 30. 23:27it

반응형

자연어를 조회하거나 활용할 때, 임베딩이 반드시 들어간다. 이때, 벡터 데이터베이스를 활용해 해당 문서를 조회하거나 찾는다. 벡터 데이터베이스라고 하면 낮설지만, 우리 주변에서 손쉽게 볼 수 있는 서비스로는 지도 서비스가 있다. 지도의 경우 위도, 경도라는 2D 벡터를 활용해 자신의 위치, 근처 맛집 등을 찾아주는 서비스이다. 이렇듯 우리 주변에서 쉽게 찾아 볼 수 있는 서비스지만, 낯선 기술이기도 한 벡터 데이터베이스와 임베딩에 대해 알아보겠다.

 

1. 임베딩이란?

임베딩(embedding)은 자연어 처리(Natural Language Processing) 분야에서 매우 중요한 개념이다. 간단히 말하면, 임베딩은 텍스트나 단어를 수치화된 벡터로 변환하는 기술이다.

 

자연어는 사람들이 의사소통하기 위해 사용하는 언어로, 단어나 문장은 사람에게는 의미가 있지만, 컴퓨터가 이해하기 어렵다. 따라서 자연어 처리 작업을 수행하기 위해서는 자연어를 컴퓨터가 이해할 수 있는 형태로 변환해야하는데, 이때 하는 작업이 임베딩이다.

 

이 처럼 사람이 말하는 단어를 컴퓨터가 알아 듣기 쉬운 수치로 변경하는 작업이다. 이러한 작업은 귀찮기도 하고, 정확한 결과값을 추출하기 위해서는 방대한 사전이 필요하다. 즉, 반복 작업 많이 필요한 작업이라는 것이다. 그래서 생각했다. 

 

임베딩 없이 데이터를 찾을 수 있는 방법이 없을까?

 

그래서 찾은 게 크로마(Chroma)이다. 

 

2. 크로마(Chroma)란?

크로마(Chroma)란 오픈소스 임베딩 데이터베이스이다. python과 javascript LLM 앱을 빌드할 때 매우 편하다. 특히, 사용해본 결과 매우 심플함에 감탄하게 된다. 임베딩하거나, 벡터를 조정하거나, 조회 쿼리를 작성하거나 하는 작업이 최소화 되어있다. 그냥 데이터를 넣고, 조회하는게 다 라고 할정도 단순하고, 편리하게 만들어졌다. 

 

3. 크로마(Chroma) 설치

 

pip install chromadb

 

4.  크로마(Chroma) 예제

 

반응형

 

import chromadb
client = chromadb.Client()
collection = client.create_collection("all-my-documents")

collection.upsert(
    documents= [
            """Question: In what areas is Donghwa Group's open recruitment of new and experienced employees?" \nAnswer: Donghwa Group's new employees will be selected in 12 areas, including sales, accounting and tax, legal affairs, and IT, while experienced employees will be recruited in 13 areas, including overseas management, personnel, and educational culture.""",
            """Question: How does Donghwa Group's recruitment process go? \nAnswer: The recruitment process is conducted in the order of document screening, personality test, job interview, personality interview, and final interview. Applications for documents can be made through the Donghwa Group website until 5 p.m. on October 17. """,
            """Question: What companies does Donghwa Group have as affiliates? Also, is it possible to work abroad? \nAnswer: Donghwa Group has affiliates such as Donghwa Enterprise, a global wood company, M-Park, the nation's largest used car sales complex, and the Hankook Ilbo and The Korea Times. In addition, you can work overseas in Vietnam, Australia, Malaysia, etc., where there are overseas subsidiaries.""",
            """Question: What company did Donghwa acquire to secure a stake in electrolyte maker Panax Etec? \nAnswer: Donghwa acquired 10.863,430 shares of electrolyte maker Panax Etec for KRW 117.9 billion.""",
            """Question: Why did Donghwa Enterprise acquire Panax Etec? \nAnswer: Donghwa expects the secondary battery market to grow, and the secondary battery market is expected to reach 120 trillion won by 2025 based on increased demand for electric vehicles and energy storage systems""",
            """Question: In what countries does Panax Etech operate factories? \nAnswer: Panax Etec operates plants in Malaysia and China, as well as in Korea. In addition, the Chinese plant will be expanded in September and will enter the European market in the future.""",
            """Question: What is the goal of Donghwa Enterprise through the acquisition of Panax Etech?" \n Answer: Donghwa plans to expand electrolyte production capacity through the expansion of Panax Etech's plant and find additional deals with major battery and automotive companies at home and abroad, as well as its main client, Samsung SDI. Through this, Donghwa companies want to diversify their growth engines into the chemical sector and have new growth engines in the future."""      
    ], # we handle tokenization, embedding, and indexing automatically. You can skip that and add your own embeddings as well
    metadatas=[{"source": "sample"},{"source": "sample"},{"source": "sample"},{"source": "sample"},{"source": "sample"},{"source": "sample"},{"source": "sample"}], # filter on these!
    ids=["doc1", "doc2", "doc3", "doc4", "doc5", "doc6", "doc7"], # unique for each doc
)

results = collection.query(
    query_texts=["Tell me about the recruitment process for Dongwha Enterprise"],
    n_results=2,
    # where={"metadata_field": "is_equal_to_this"}, # optional filter
    # where_document={"$contains":"search_string"}  # optional filter
)

print( results )

 

일부러 영어로 만들었다. 한글로도 되는데, 조회 정확도가 떨어진다. 상대적으로 영어가 매우 조회 성능이 좋다. 소스코드 설명 이후, 아래 한글 예제도 보여주겠다. 

 

 

4-1. 클라인어트 연결 & 컬랙션 생성

import chromadb

client = chromadb.Client()
collection = client.create_collection("all-my-documents")

해당 코드는 말 그대로 클라이언트랑 연결하고, 컬랙션을 생성하는 것이다. 음, 컬랙션이란 데이터베이스로 따지면, 테이블이라고 생각하면 된다. 

 

4-2. 데이터 입력

collection.upsert(
    documents= [
            """Question: In what areas is Donghwa Group's open recruitment of new and experienced employees?" \nAnswer: Donghwa Group's new employees will be selected in 12 areas, including sales, accounting and tax, legal affairs, and IT, while experienced employees will be recruited in 13 areas, including overseas management, personnel, and educational culture.""",
            """Question: How does Donghwa Group's recruitment process go? \nAnswer: The recruitment process is conducted in the order of document screening, personality test, job interview, personality interview, and final interview. Applications for documents can be made through the Donghwa Group website until 5 p.m. on October 17. """,
            """Question: What companies does Donghwa Group have as affiliates? Also, is it possible to work abroad? \nAnswer: Donghwa Group has affiliates such as Donghwa Enterprise, a global wood company, M-Park, the nation's largest used car sales complex, and the Hankook Ilbo and The Korea Times. In addition, you can work overseas in Vietnam, Australia, Malaysia, etc., where there are overseas subsidiaries.""",
            """Question: What company did Donghwa acquire to secure a stake in electrolyte maker Panax Etec? \nAnswer: Donghwa acquired 10.863,430 shares of electrolyte maker Panax Etec for KRW 117.9 billion.""",
            """Question: Why did Donghwa Enterprise acquire Panax Etec? \nAnswer: Donghwa expects the secondary battery market to grow, and the secondary battery market is expected to reach 120 trillion won by 2025 based on increased demand for electric vehicles and energy storage systems""",
            """Question: In what countries does Panax Etech operate factories? \nAnswer: Panax Etec operates plants in Malaysia and China, as well as in Korea. In addition, the Chinese plant will be expanded in September and will enter the European market in the future.""",
            """Question: What is the goal of Donghwa Enterprise through the acquisition of Panax Etech?" \n Answer: Donghwa plans to expand electrolyte production capacity through the expansion of Panax Etech's plant and find additional deals with major battery and automotive companies at home and abroad, as well as its main client, Samsung SDI. Through this, Donghwa companies want to diversify their growth engines into the chemical sector and have new growth engines in the future."""      
    ], # we handle tokenization, embedding, and indexing automatically. You can skip that and add your own embeddings as well
    metadatas=[{"source": "sample"},{"source": "sample"},{"source": "sample"},{"source": "sample"},{"source": "sample"},{"source": "sample"},{"source": "sample"}], # filter on these!
    ids=["doc1", "doc2", "doc3", "doc4", "doc5", "doc6", "doc7"], # unique for each doc
)

 

728x90

 

데이터는 위와 같이 입력한다. 임베딩을 하는 작업 없이 그냥 데이터를 넣으면 된다.

documents : text로 이루어진 데이터를 list 형태로 넣은면 된다. list 하나당 하나의 문서가 들어간다고 생각하면 된다.

metadatas : 해당 소스의 필요한 추가 정보들을 입력하면 된다. 예를 들어, 데이터의 출처라든가, 데이터의 관한 정보를 넣어주면 된다.

ids : 문서별 고유 아이디이다. 해당 아이디는 문서의 수와 동일해야 한다. 위 예제에서는 7개의 문서를 넣었기 때문에 7개의 아이디를 생성했다. 

 

4-3. 조회 

results = collection.query(
    query_texts=["Tell me about the recruitment process for Dongwha Enterprise"],
    n_results=2,
    # where={"metadata_field": "is_equal_to_this"}, # optional filter
    # where_document={"$contains":"search_string"}  # optional filter
)

print( result )

 

자신이 묻고 싶은 것을 질문하면 된다. Tell me about the recruitment process for Dongwha Enterprise 라고 질문하면 해당 문서와 비슷한 데이터를 찾아 준다.  n_results=2 의 의미는 유사도가 비슷한 문서 2개를 찾아달라는 의미이다. 

 

 

5. 결과 

{'ids': [['doc2', 'doc1']],
 'embeddings': None,
 'documents': [["Question: How does Donghwa Group's recruitment process go? \nAnswer: The recruitment process is conducted in the order of document screening, personality test, job interview, personality interview, and final interview. Applications for documents can be made through the Donghwa Group website until 5 p.m. on October 17. ",
   'Question: In what areas is Donghwa Group\'s open recruitment of new and experienced employees?" \nAnswer: Donghwa Group\'s new employees will be selected in 12 areas, including sales, accounting and tax, legal affairs, and IT, while experienced employees will be recruited in 13 areas, including overseas management, personnel, and educational culture.']],
 'metadatas': [[{'source': 'sample'}, {'source': 'sample'}]],
 'distances': [[0.5658209323883057, 0.7528408169746399]]}

 

"Question: How does Donghwa Group's recruitment process go?

  Answer: The recruitment process is conducted in the order of document screening, personality test, job interview, personality interview, and final interview. Applications for documents can be made through the Donghwa Group website until 5 p.m. on October 17"

 

[ 번역 ]

질문: 동화그룹 채용절차는 어떻게 진행되나요?

답변: 채용절차는 서류전형, 인적성검사, 직무면접, 인성면접, 최종면접 순으로 진행됩니다. 10월 17일 오후 5시까지 동화그룹 홈페이지를 통해 진행됩니다.",

 

"Question: In what areas is Donghwa Group\'s open recruitment of new and experienced employees?"

  Answer: Donghwa Group\'s new employees will be selected in 12 areas, including sales, accounting and tax, legal affairs, and IT, while experienced employees will be recruited in 13 areas, including overseas management, personnel, and educational culture."

 

[ 번역 ]

질문: 동화그룹의 신입사원 및 경력사원 공개채용은 어떤 분야인가요?'

답변: 동화그룹 신입사원은 영업, 회계세무, 법무, IT 등 총 12개 분야에서 선발됩니다. , 해외경영, 인사, 교육문화 등 13개 분야에서 경력사원을 채용한다.

 

문서 조회 결과는 위와 같다. 임베딩이 없이도 매우 유사한 문서를 잘 추출해 온다. 생각보다 매우 잘 만들어진 서비스 같다. 

 


 

그럼 크로마에 한글로 데이터를 넣어서 한글로 조회하면 어떻게 될까? 

 

소스코드는 그대로 두고, 데이터와 조회 쿼리만 바꿔서 조회해 보겠다.

import chromadb

client = chromadb.Client()
collection = client.create_collection("all-my-documents")

collection.upsert(
    documents= [
          "질문: 동화그룹의 신입 및 경력사원 공개 채용은 어떤 분야에서 이뤄지나요? \n답변: 동화그룹의 신입사원은 영업, 회계ㆍ세무, 법무, IT 등 12개 분야에서 선발되며, 경력사원은 해외 경영관리, 인사, 교육문화 등 13개 분야에서 모집됩니다.",
          "질문: 동화그룹의 채용절차는 어떻게 진행되나요? \n답변: 채용절차는 서류전형, 인적성검사, 직무면접, 인성면접, 최종면접 순으로 진행됩니다. 서류 접수는 10월 17일 오후 5시까지 동화그룹 홈페이지를 통해 가능합니다.",
          "질문: 동화그룹은 어떤 회사들을 계열사로 두고 있나요? 또한, 해외근무도 가능한가요? \n답변: 동화그룹은 글로벌 목재 전문기업인 동화기업, 국내 최대 중고차 매매단지인 엠파크, 언론사인 한국일보와 코리아타임스 등을 계열사로 두고 있습니다. 또한, 해외법인이 있는 베트남, 호주, 말레이시아 등에서도 해외근무가 가능합니다.",
          "질문: 동화기업은 어떤 회사를 인수하여 전해액 제조 업체인 파낙스이텍의 지분을 확보했나요? \n답변: 동화기업은 전해액 제조 업체인 파낙스이텍의 지분 1,086만3,430주를 1,179억원에 인수하여 확보했습니다.",
          "질문: 동화기업은 왜 파낙스이텍을 인수했나요? \n답변: 동화기업은 2차전지 시장의 성장세를 기대하고 있으며, 전기차와 에너지 저장 시스템 등의 수요 증가를 바탕으로 2차전지 시장이 현재 30조원에서 2025년에는 120조원으로 예측되고 있기 때문에 파낙스이텍을 인수하여 전해액 생산능력을 확대하고자 했습니다.",
          "질문: 파낙스이텍은 어떤 국가에서 공장을 운영하고 있나요? \n답변: 파낙스이텍은 국내를 비롯해 말레이시아와 중국에서 공장을 운영하고 있습니다. 또한, 중국 공장은 오는 9월에 증설되고 향후 유럽 시장에도 진출할 계획입니다.",
          "질문: 동화기업은 파낙스이텍 인수를 통해 어떤 목표를 가지고 있나요? \n답변: 동화기업은 파낙스이텍의 공장 증설을 통해 전해액 생산 능력을 확대하고, 주 거래처인 삼성SDI뿐만 아니라 국내외의 주요 배터리 및 자동차 업체와의 거래를 추가로 발굴할 계획입니다. 이를 통해 동화기업은 화학 분야로도 성장 엔진을 다각화하고 미래의 신성장 동력을 갖추고자 합니다."
        
    ], # we handle tokenization, embedding, and indexing automatically. You can skip that and add your own embeddings as well
    metadatas=[{"source": "sample"},{"source": "sample"},{"source": "sample"},{"source": "sample"},{"source": "sample"},{"source": "sample"},{"source": "sample"}], # filter on these!
    ids=["doc1", "doc2", "doc3", "doc4", "doc5", "doc6", "doc7"], # unique for each doc
)

results = collection.query(
    query_texts=["동화기업 채용절차 알려줘"],
    n_results=2,
    # where={"metadata_field": "is_equal_to_this"}, # optional filter
    # where_document={"$contains":"search_string"}  # optional filter
)

 

조회 결과는 아래와 같다. 

 

질문: 동화그룹의 신입 및 경력사원 공개 채용은 어떤 분야에서 이뤄지나요?

답변: 동화그룹의 신입사원은 영업, 회계ㆍ세무, 법무, IT 등 12개 분야에서 선발되며, 경력사원은 해외 경영관리, 인사, 교육문화 등 13개 분야에서 모집됩니다.


질문: 동화기업은 어떤 회사를 인수하여 전해액 제조 업체인 파낙스이텍의 지분을 확보했나요?

답변: 동화기업은 전해액 제조 업체인 파낙스이텍의 지분 1,086만3,430주를 1,179억원에 인수하여 확보했습니다.

 

첫번째의 경우, 해당 데이터를 매우 잘 찾아 온 것으로 보이지만, 두번째 문장의 경우, 채용과 전혀 관련 없는 자료를 찾을 것을 볼 수 있다. 임베딩을 하는 서비스가 대부분 그렇지만, 한글로 조회를 할 경우, 정확도가 떨어지는 것을 확인 할 수 있다. 그 이유는 아마, 한글로 만들어진 사전이 영어 대비 약하기 때문으로 추정된다. 

 

반응형