2023. 11. 8. 08:40ㆍit
최근 사내 쳇봇을 만드는 과정에서 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 인덱스를 생성한다.
- 이때 주의사항은 임베딩한 리스트의 길이와 인덱스가 생성 시 지정하는 리스트의 길이가 동일해야 한다.
- 자세한 방법은 아래 글을 참고한다.
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를 만들어준다.
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"])
'it' 카테고리의 다른 글
SnowFlake 와 AWS Connetcion ( feat. SQL ) (0) | 2024.01.26 |
---|---|
주식 예측 AI 개발 노트 (0) | 2023.11.17 |
Object of type datetime is not JSON serializable (0) | 2023.07.14 |
[Python] AttributeError: module 'lib' has no attribute 'SSL_CTX_set_ecdh_auto' 에러 해결 방법 (0) | 2023.06.19 |
Windows에서 Vue.js 설치하기 ( Vue3 버전 ) (0) | 2023.06.12 |