Pinecone과 OpenAI로 RAG 챗봇

Pinecone로 AI 애플리케이션 구축하기

James Chapman

Curriculum Manager, DataCamp

검색 증강 생성(RAG)

  1. 사용자 질의 임베딩
  2. 유사 문서 검색
  3. 문서를 프롬프트에 추가

검색 증강 생성

Pinecone로 AI 애플리케이션 구축하기

Pinecone과 OpenAI 초기화

from openai import OpenAI
from pinecone import Pinecone
import pandas as pd
from uuid import uuid4


client = OpenAI(api_key="OPENAI_API_KEY") pc = Pinecone(api_key="PINECONE_API_KEY")
index = pc.Index("semantic-search-datacamp")
Pinecone로 AI 애플리케이션 구축하기

YouTube 자막 데이터

youtube_df = pd.read_csv('youtube_rag_data.csv')
| id | blob | channel_id | end | published | start | text | title | url |
|----|------|------------|-----|-----------|-------|------|-------|-----|
|int | dict | str        | int | datetime  | int   | str  | str   | str |
Pinecone로 AI 애플리케이션 구축하기

문서 적재(ingest)

batch_limit = 100


for batch in np.array_split(youtube_df, len(youtube_df) / batch_limit):
metadatas = [{"text_id": row['id'], "text": row['text'], "title": row['title'], "url": row['url'], "published": row['published']} for _, row in batch.iterrows()]
texts = batch['text'].tolist()
ids = [str(uuid4()) for _ in range(len(texts))]
response = client.embeddings.create(input=texts, model="text-embedding-3-small") embeds = [np.array(x.embedding) for x in response.data]
index.upsert(vectors=zip(ids, embeds, metadatas), namespace='youtube_rag_dataset')
Pinecone로 AI 애플리케이션 구축하기

검색 함수

def retrieve(query, top_k, namespace, emb_model):

query_response = client.embeddings.create(input=query, model=emb_model) query_emb = query_response.data[0].embedding
retrieved_docs = [] sources = [] docs = index.query(vector=query_emb, top_k=top_k, namespace='youtube_rag_dataset', include_metadata=True)
for doc in docs['matches']: retrieved_docs.append(doc['metadata']['text']) sources.append((doc['metadata']['title'], doc['metadata']['url']))
return retrieved_docs, sources
Pinecone로 AI 애플리케이션 구축하기

검색 결과 출력

query = "How to build next-level Q&A with OpenAI"
documents, sources = retrieve(query, top_k=3, namespace='youtube_rag_dataset',
                              emb_model="text-embedding-3-small")
Document: 오픈 도메인 질의응답에 사용합니다. 우리는 시작할 것이며...
Source: How to build a Q&A AI in Python [...], https://youtu.be/w1dMEWm7jBc

Document: 여기에는 Google이 있고 Google에 질문할 수 있습니다...
Source: How to build next-level Q&A with OpenAI, https://youtu.be/coaaSxys5so

Document: Q&A 시스템의 품질을 높이려면 벡터 데이터베이스가 필요합니다...
Source: How to Build Custom Q&A Transfo [...], https://youtu.be/ZIRmXKHp0-c
Pinecone로 AI 애플리케이션 구축하기

컨텍스트 포함 프롬프트 생성 함수

def prompt_with_context_builder(query, docs):
    delim = '\n\n---\n\n'
    prompt_start = 'Answer the question based on the context below.\n\nContext:\n'
    prompt_end = f'\n\nQuestion: {query}\nAnswer:'

    prompt = prompt_start + delim.join(docs) + prompt_end
    return prompt
Pinecone로 AI 애플리케이션 구축하기

컨텍스트 프롬프트 출력

query = "How to build next-level Q&A with OpenAI"
context_prompt = prompt_with_context_builder(query, documents)

prompt_with_context_builder 함수의 출력

Pinecone로 AI 애플리케이션 구축하기

질의응답 함수

def question_answering(prompt, sources, chat_model):

sys_prompt = "You are a helpful assistant that always answers questions."
res = client.chat.completions.create( model=chat_model, messages=[{"role": "system", "content": sys_prompt}, {"role": "user", "content": prompt} ], temperature=0)
answer = res.choices[0].message.content.strip() answer += "\n\nSources:" for source in sources: answer += "\n" + source[0] + ": " + source[1] return answer
Pinecone로 AI 애플리케이션 구축하기

질의응답 출력

query = "How to build next-level Q&A with OpenAI"
answer = question_answering(prompt_with_context, sources,
                            chat_model='gpt-4o-mini')

question_answering 함수의 출력

Pinecone로 AI 애플리케이션 구축하기

전체 흐름 정리

query = "How to build next-level Q&A with OpenAI"
documents, sources = retrieve(query, top_k=3, 
                              namespace='youtube_rag_dataset', 
                              emb_model="text-embedding-3-small")
prompt_with_context = prompt_with_context_builder(query, documents)
answer = question_answering(prompt_with_context, sources,
                            chat_model='gpt-4o-mini')
Pinecone로 AI 애플리케이션 구축하기

연습해 봅시다!

Pinecone로 AI 애플리케이션 구축하기

Preparing Video For Download...