LangChain과 MongoDB 연동 (feat. sentence_transformers )

2023. 11. 8. 08:40it

반응형

 
 
최근 사내 쳇봇을 만드는 과정에서 LangChain 공부과정을 정리하겠다. 
 
나는 현재 사내 정보를 MongoDB에 저장해 사용할 예정이다. 
 
그리고 데이터를 임베딩하기 위해 sentence_transformers를 사용할 것이다. 
 
sentence_transformers 에서도 다국어 처리를 위한 distiluse-base-multilingual-cased-v1를 사용했다. 
 
chatbot에 사용되는 LLM 모델은 OpenAI의 GPT를 사용할 예정이다.
 
해당 자료는 찾지 못해, 내가 만들었다. 
 
1. langchain에 필요한 임베딩 클레스를 만들어야 한다. 

from sentence_transformers import SentenceTransformer, util

# OpenAIEmbeddings 클래스와 호환성을 맞추는 새로운 클래스를 정의합니다.
class SentenceTransformerEmbeddings():
    def __init__(self, sentence_transformer_model):
        self.model = sentence_transformer_model

    def encode(self, text):
        # SentenceTransformer 모델을 사용하여 텍스트를 임베딩합니다.
        embeddings = self.model.encode(text)
        return embeddings.tolist()  # 결과를 리스트로 변환하여 반환
    
    def embed_query(self, query):
        # 'encode' 메서드를 사용하여 쿼리를 임베딩합니다.
        return self.encode(query)

 
해당 클래스는 뒤에 나올 MongoDBAtlasVectorSearch에서 사용하기 위한 클래스이다.  
 
사용방법은 다음과 같다. 클래스는 sentence_transformers 의 모델을 받아서 사용된다. 
 
 

model = SentenceTransformer('distiluse-base-multilingual-cased-v1')
entence_transformer_embeddings = SentenceTransformerEmbeddings(model)

 
 
2. openAi의 키를 입력한다. 

import openai

openai.api_key = '<---key--->'

 
 
3. MongoDB의 Vector 서치를 연결한다. 
[ 사전작업 ] 
- 먼저 vector 인덱스를 생성한다. 
- 이때 주의사항은 임베딩한 리스트의 길이와 인덱스가 생성 시 지정하는 리스트의 길이가 동일해야 한다. 
- 자세한 방법은 아래 글을 참고한다. 
 

반응형

 
https://urame.tistory.com/entry/MongoDB-Atlas-search-Index-Knn-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95-%EB%B9%84%EC%8A%B7%ED%95%9C-%EB%AC%B8%EC%84%9C-%EC%B0%BE%EA%B8%B0

MongoDB Atlas search Index Knn 사용방법 ( 비슷한 문서 찾기 )

비슷한 문서를 찾는 여러가지 방법이 있는데, 그중 뭐 가장 심플한 방식이 knn 분석이다. 다양한 데이터베이스에서 knn 을 지원하고, mongodb도 해당 인덱스가 있는지 찾아보니, 존재한다. 심플한 로

urame.tistory.com

 
 

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import MongoDBAtlasVectorSearch


MongoDB_Connction = 'localhost'
MongoDB_DataBase   = "chatbot" 
MongoDB_Collection = "info" 

vector_search = MongoDBAtlasVectorSearch.from_connection_string(
    MongoDB_Connction,
    MongoDB_DataBase + "." + MongoDB_Collection,
    entence_transformer_embeddings,
    index_name="test"
)

 
 
4. MongodbBectorSearch를 활용해서 retriever 를 만들어준다. 

qa_retriever = vector_search.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 10}
)

 
 
5. prompt_template를 만들어준다. 
 

728x90

 

from langchain.prompts import PromptTemplate


prompt_template = """Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.

{context}

Question: {question}
"""
PROMPT = PromptTemplate(
    template=prompt_template, input_variables=["context", "question"]
)

 
 
6. retriever 와 prompt_template를 활용해 qa를 만든다. 

from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
from langchain.llms import OpenAI



qa = RetrievalQA.from_chain_type(
    llm=OpenAI(),
    chain_type="stuff",
    retriever=qa_retriever,
    return_source_documents=True,
    chain_type_kwargs={"prompt": PROMPT},
)

 
 
7. 질문을 날려본다. 

docs = qa({"query": "펌프 교체 작업 시간 알려줘"})

print(docs["result"])

 
 
8. 결과를 받아본다. 

 
 
 
9. 해당 답변의 결과를 만들어낸 원본 데이터가 궁금하면 다음과 같다. 

print(docs["source_documents"])
반응형