본문 바로가기
OpenAI

Azure OpenAI + Google Search API + Chroma

by 프갭 2023. 6. 21.

Google Search API를 이용하여 검색된 내용을 Embeddings 하여 Chroma(Vector DB)에 넣고

Chroma의 내용을 OpenAI를 통해 Q&A하는 내용을 Python으로 만들어 보겠습니다.

 

import os

from langchain.utilities import GoogleSearchAPIWrapper
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chat_models import AzureChatOpenAI
from langchain.chains import RetrievalQA

Azure OpenAI API 정보 (Keys and Endpoint)

Google Search API 키 생성

1. Google API 콘솔 이동

2. 프로젝트없을 경우 프로젝트 생성

3. API 라이브러리 에서 Custom Search API 클릭하여 =>사용

4. API사용해 보기 클릭

5. 프로그래밍 검색엔진 클릭 하여 검색엔진 추가(검색엔진 ID:GOOGLE_CSE_ID)

6. 키가져오기 클릭 하여 프로젝트 선택 (API KEY:GOOGLE_API_KEY)

 

AZURE_OPENAI_KEY = '***************************'
AZURE_OPENAI_ENDPOINT = 'https://*********.openai.azure.com'
AZURE_OPENAI_API_VERSION = '2023-03-15-preview'
AZURE_OPENAI_TYPE ="Azure"

GOOGLE_API_KEY = "********************************"
GOOGLE_CSE_ID = "*********************"

os.environ["OPENAI_API_TYPE"] =AZURE_OPENAI_TYPE
os.environ["OPENAI_API_KEY"] = AZURE_OPENAI_KEY
os.environ["OPENAI_API_BASE"] = AZURE_OPENAI_ENDPOINT
os.environ["OPENAI_API_VERSION"] = AZURE_OPENAI_API_VERSION

os.environ["GOOGLE_CSE_ID"] = GOOGLE_CSE_ID
os.environ["GOOGLE_API_KEY"] = GOOGLE_API_KEY

 

GoogleSearchAPIWrapper (구글 검색 인스턴스) 검색한 결과를

RecursiveCharacterTextSplitter를 이용 하여 1000 chunk 사이즈로 쪼개여

text-embedding-ada-oo2 모델로 Vector화하여 Embedding

persist_directory:저장되는 폴더

def embeddings(query,dbDir):
    search = GoogleSearchAPIWrapper()
    result = search.run(query)

    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
    texts = text_splitter.split_text(result)
    
    if(os.path.isdir(dbDir) == False):
        os.mkdir(dbDir)

    
    embedding = OpenAIEmbeddings(model="text-embedding-ada-002", 
                                    chunk_size=1 )

    
    vectordb = Chroma.from_texts(
        texts=texts, 
        embedding=embedding,
        persist_directory=dbDir)

    vectordb.persist()
    vectordb = None
    
    print("완료")

 

RetrievalQL로 qa chain을 생성하여 Chroma DB의 내용을 검색하여 결과를 리턴

def searchOpenAI(query,dbDir):
    embedding = OpenAIEmbeddings(model="text-embedding-ada-002",  chunk_size=1 )

    vectordb = Chroma( persist_directory=dbDir,  embedding_function=embedding)

    retriever = vectordb.as_retriever()
    
    llm = AzureChatOpenAI(deployment_name='gpt-35-turbo',  max_tokens=500)

    qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type='stuff',retriever=retriever)
    
    llm_response = qa_chain(query)
    
    print(llm_response["result"])

 

이상입니다.

반응형

'OpenAI' 카테고리의 다른 글

Langchain - 캐싱  (0) 2024.05.10
Langchain - Model 컴포넌트와 호출 방법  (0) 2024.05.03
Langchain - Hello Langchain  (0) 2024.05.03
Langchain - 기본 구성 및 환경 셋팅  (0) 2024.05.02

댓글