OpenAI API 없이 데이터에 대한 자체 채팅 인터페이스 구축

May 04 2023
OpenAI의 모델로 할 수 있는 것은 매력적입니다. 또한 LangChain 및 llama-index와 같은 도구를 사용하면 몇 줄의 코드로 기본적인 ChatGPT와 같은 시스템을 쉽게 구축하고 실행할 수 있습니다.

OpenAI의 모델로 할 수 있는 것은 매력적입니다. 또한 LangChain 및 llama-index 와 같은 도구를 사용하면 몇 줄의 코드로 기본적인 ChatGPT와 같은 시스템을 쉽게 구축하고 실행할 수 있습니다. 그러나 대부분의 예제는 데이터를 클라우드로 보낼 수 없거나 돈을 쓸 수 없기 때문에 모든 경우에 실용적이지 않은 OpenAI의 API를 기반으로 합니다 .

OpenAI 없이 자신의 데이터에 대해 ChatGPT와 같은 방식으로 시스템을 쿼리합니다.

최근에 Databrick의 돌리를 사용하여 기본 시스템을 실행하려고 했고 약간의 시행착오가 필요했기 때문에 여기에서 맞춤형 개방형 LLM을 사용하여 자신의 데이터에 대한 채팅 인터페이스를 구축하는 방법 에 대한 빠른 자습서를 제공합니다!

1단계: 데이터 수집 및 종속성 설치

이 단계에서는 사용하려는 모든 데이터를 수집하여 로컬 컴퓨터의 디렉터리에 넣기만 하면 됩니다. 제 경우에는 데이터 큐레이션 도구인 Spotlight 의 문서에서 가져온 많은 마크다운 파일이었습니다 (확인해보세요 ;-)).

다음으로 필요한 모든 것을 설치합니다.

pip install torch transformers langchain llama-index====0.6.0.alpha3

다음 코드를 복사하고 입력 폴더의 경로를 조정합니다. Huggingface 변환기 라이브러리를 사용하여 검색을 위한 임베딩을 생성하고 databrick의 돌리를 사용하여 최종 출력을 생성합니다.

from pathlib import Path
import torch
from transformers import pipeline
from langchain.llms.base import LLM
from llama_index import SimpleDirectoryReader, LangchainEmbedding, GPTVectorStoreIndex, PromptHelper, LLMPredictor, ServiceContext
from llama_index.langchain_helpers.text_splitter import TokenTextSplitter
from llama_index.node_parser.simple import SimpleNodeParser
from langchain.embeddings.huggingface import HuggingFaceEmbeddings

INPUT_FOLDER = "path/to/your/data/folder"

index_files = list(Path(INPUT_FOLDER).glob("*"))

max_input_size = 2048
num_output = 256
max_chunk_overlap = 20
prompt_helper = PromptHelper(max_input_size, num_output, max_chunk_overlap)


pipe = pipeline("text-generation", model="databricks/dolly-v2-3b", trust_remote_code=True, torch_dtype=torch.bfloat16, device_map="auto")
embed_model = LangchainEmbedding(HuggingFaceEmbeddings())

class CustomLLM(LLM):
    model_name = "databricks/dolly-v2-3b"

    def _call(self, prompt, stop = None):
        response = pipe(prompt, max_new_tokens=num_output)[0]["generated_text"]
        return response

    @property
    def _identifying_params(self):
        return {"name_of_model": self.model_name}

    @property
    def _llm_type(self):
        return "custom"

# define our LLM
llm_predictor = LLMPredictor(llm=CustomLLM())

node_parser = SimpleNodeParser(text_splitter=TokenTextSplitter(chunk_size=512, chunk_overlap=max_chunk_overlap))
prompt_helper = PromptHelper(max_input_size, num_output, max_chunk_overlap)
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, embed_model=embed_model, prompt_helper=prompt_helper, node_parser=node_parser, chunk_size_limit=512)
# Load your data
documents = SimpleDirectoryReader(input_files=index_files).load_data()

index = GPTVectorStoreIndex.from_documents(documents, service_context=service_context)

query_engine = index.as_query_engine()

3단계: 시스템 사용

우리는 이미 끝났습니다! 이제 쿼리 엔진 개체를 사용하여 데이터에 대한 질문을 할 수 있습니다!

우리 문서에서 시도한 예제 프롬프트는 다음과 같습니다.

print(query_engine.query("Summarize typical use cases of the similarity map in few sentences."))

The Similarity Map helps to explore simulation similarities and find explanations for observable phenomens.
It can be used to group designs by similarity, find outliers and detect correlations between features and target values.