ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 나의 TXT 데이터를 OpenAI를 이용하여 FastAPI로 서비스해보자!
    AI&ML 2023. 5. 3. 00:10
    반응형

    안녕하세요. LLM 모델인 chat gpt 를 활용해서 나만의 텍스트 데이터를 OpenAI를 연동해서 질문해 보는 서비스를 만들어 보겠습니다. 간단하게 파이썬을 이용해서 아래와 같은 순서로 작업합니다.

     

    필요한 라이브러리를 설치해줍니다.

    openai 같은 LLM 모델들을 이용해서 애플리케이션을 개발하는데 유용한 Langchain 라이브러리를 이용합니다.

    from fastapi import FastAPI ,File, UploadFile , Request
    from pydantic import BaseModel
    from langchain.document_loaders import DirectoryLoader, TextLoader
    from langchain.text_splitter import CharacterTextSplitter
    from langchain.embeddings import OpenAIEmbeddings
    from langchain.vectorstores import Chroma   
    from langchain.chains import RetrievalQA
    from langchain.llms import AzureOpenAI
    from langchain.prompts import PromptTemplate
    from dotenv import load_dotenv
    from fastapi.responses import HTMLResponse
    from fastapi.templating import Jinja2Templates
    import os
    import openai

    이 코드는 Python 언어로 작성된 FastAPI 웹 애플리케이션입니다. 다양한 라이브러리와 패키지를 import하고, FastAPI를 생성합니다. 이 웹 애플리케이션은 파일 업로드, 요청 처리 등의 기능을 수행하며, langchain, pydantic, dotenv, openai 등의 라이브러리를 사용합니다. Jinja2Templates를 사용하여 HTMLResponse를 반환하며, AzureOpenAI, RetrievalQA, PromptTemplate 등 다양한 기능을 수행합니다. 코드 상단에는 .env 파일을 로드하는 코드도 있습니다.

     

    Azure OpenAI 설정들을 환경파일에서 읽어옵니다.

    openai.api_type = "azure"
    openai.api_version = "2022-12-01"
    openai.api_base = os.getenv('OPENAI_API_BASE')
    openai.api_key = os.getenv("OPENAI_API_KEY")

    아래 함수는 RetrievalQA 인스턴스를 생성하는 함수입니다. 이 함수는 AzureOpenAI를 사용하여 생성한 Language Model, OpenAIEmbeddings를 사용하여 텍스트 문서의 임베딩을 만들고, DirectoryLoader를 사용하여 텍스트 문서를 로드합니다. 그런 다음 CharacterTextSplitter를 사용하여 텍스트 문서를 chunk로 분할하고, Chroma를 사용하여 vector store를 생성합니다.

    def create_qa() -> RetrievalQA:
        # Create a language model for Q&A
        llm = AzureOpenAI(deployment_name="text-davinci-003")
    
        # Create embeddings for text documents
        embeddings = OpenAIEmbeddings(model="text-embedding-ada-002", chunk_size=1)
    
        # Load text documents
        loader = DirectoryLoader('mydata', glob="**/*.txt")
        documents = loader.load()
    
        # Split text documents into chunks 중지 시퀀스
        text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=50)
        texts = text_splitter.split_documents(documents)
    
        
        # Create a vector store for text documents
        docsearch = Chroma.from_documents(texts, embeddings)
    
        # Create a retrieval-based Q&A system
        qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=docsearch.as_retriever(search_kwargs={"k": 1}))
    
        return qa

    아래 서비스는 POST 방식의 "/qna/" 경로를 가진 endpoint를 정의하는 함수입니다. 이 함수는 Question 모델을 받아들이고, 이전에 만든 RetrievalQA 인스턴스인 qa_global을 사용하여 입력된 질문에 대한 답변을 찾습니다. 마지막으로, 답변을 JSON 형식으로 반환하고 이 답변을 웹에 보여줍니다.

     

    @app.post("/qna/")
    def get_qna(question: Question):
        # qa = qa_global
        answer = qa_global.run(question.question)
        return {"data": answer}

    간단하게 Fast API를 이용해서 서비스를 만들고, 데이터를 벡터 데이터베이스인 chroma db에 저장해서 쿼리시 답변을 조회합니다.

    실행하면 아래와 같이 OpenAI와 활용할 나의 텍스트 파일을 업로드 합니다.

    아래 질문란에 llm 모델이 어떻게 동작하는지 질문해 보았습니다.

    간단하게 만들어본 서비스이지만, 나만의 데이터를 활용해서 openAI를 활용할수 있다는 점에서 여러 프로세스에서 적용가능하겠다는 생각이 들었습니다.

    반응형

    댓글

Designed by Tistory.