RAG 실습 테스트
실습 환경 구축
C:\agent-prg> mkdir ch02
C:\agent-prg> cd ch02
C:\agent-prg\ch02> python -m venv ch02_env
C:\agent-prg\ch02> ch02_env\Scripts\activate.bat
가상 환경이 활성화 되면 프롬프트 왼쪽에 가상 환경의 이름이 표시
(ch02_env) C:\agent-prg\ch02>
pip install 명령어로 아래 14개 패키지 설치
pandas: 임베딩 실습에서 테이블 형태의 데이터를 다루는 패키지
openai: ChatGPT API와 OpenAI Embedding API 사용을 위한 패키지
langchain: AI 애플리케이션 개발을 위한 다양한 도구 지원
langchain_experimental: 랭체인 기능 중 실험적으로 지원하는 도구를 제공
langchain-text-splitter: 랭체인에서 긴 문서를 다수의 짧은 청크로 자르는 다양한 청커를 지원
langchain_openai: 랭체인 내에서 OpenAI Embedding API 호출 지원
langchain-community: 다양한 PDF Loader를 실습하기 위한 패키지
pypdf: PDF 파일 처리를 위한 패키지
pymupdf: PDF 파일을 다루기 위한 다기능 패키지
pdfplumber: PDF에서 텍스트, 표, 비텍스트 요소 추출을 위한 패키지
chromadb: 벡터 데이터베이스 패키지
faiss-cpi: 벡터 데이터베이스 패키지
tiktoken: OpenAI Embedding API를 사용하는 데 필요한 패키지
gradio: 머신러닝 모델을 위한 웹 인터페이스를 쉽고 빠르게 구축할 수 있는 패키지
임의의 벡터1, 벡터2, 벡터3에 대해 코사인 유사도를 구하는 실습 코드
ch02_VECTOR_SIMILARITY.ipynb
import numpy as np
from numpy import dot
from numpy.linalg import norm
def cos_sim(A, B):
return dot(A,B)/(norm(A)*norm(B))
vec1 = np.array([0,1,1,1])
vec2 = np.array([1,0,1,1])
vec3 = np.array([2,0,2,2])
print('벡터1과 벡터2의 유사도 :',cos_sim(vec1, vec2))
print('벡터1과 벡터3의 유사도 :',cos_sim(vec1, vec3))
print('벡터2과 벡터3의 유사도 :',cos_sim(vec2, vec3))OpenAI의 Embedding API
ch02_OPENAI_EMBEDDING.ipynb
import os
import numpy as np
from numpy import dot
from numpy.linalg import norm
import pandas as pd
from langchain_openai import OpenAIEmbeddings
os.environ['OPENAI_API_KEY'] = "발급받은 OpenAI API 키"테스트
- text-embedding-ada-002 모델을 사용해 ‘저는 배가 고파요’라는 문장을 임베딩해서 벡터로 변환하고, 변환한 벡터 값을 출력
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")
query_result = embeddings.embed_query('저는 배가 고파요')
print(query_result)실행 결과
6개의 데이터로 구성된 임의의 데이터프레임을 생성
아래 코드는 6개의 문장 데이터를 text 열에 할당해 6행 1열로 구성된 데이터프레임인 df를 만든다.
data = ['저는 배가 고파요',
'저기 배가 지나가네요',
'굶어서 허기가 지네요',
'허기 워기라는 게임이 있는데 즐거워',
'스팀에서 재밌는 거 해야지',
'스팀에어프라이어로 연어구이 해먹을거야']
df = pd.DataFrame(data, columns=['text'])
df각 text 열에 존재하는 텍스트 데이터들을 get_embedding() 함수로 임베딩해서 벡터로 변환하고, 이를 새로운 embedding 열을 만들어 저장
def get_embedding(text):
return embeddings.embed_query(text)
df['embedding'] = df.apply(lambda row: get_embedding(
row.text,
), axis=1)
df임의의 입력이 들어오면 위 데이터프레임 df에 존재하는 텍스트 중에서 가장 의미가 유사한 문장들을 반환하는 검색 시스템을 구현
def cos_sim(A, B):
return dot(A,B)/(norm(A)*norm(B))
def return_answer_ccandidate(df, query):
# 임의의 검색어가 들어오면 해당 섬색어를 get_embedding() 함수로 임베딩해서 벡터로 변환하고 query_embedding 변수에 저장
query_embedding = get_embedding(
query
)
# df에 존재하는 모든 embedding 열의 벡터들과 코사인 유사도를 계산해 코사인 유사도가 가장 높은 상위 3개의 데이터를 찾아 반환
df['similarity'] = df.embedding.apply(lambda x: cos_sim(np.array(x), np.array(query_embedding)))
top_three_doc = df.sort_values("similarity", ascending=false).head(3)
return top_three_docreturn_answer_candidate() 함수를 사용해 ‘아무것도 안 먹었더니 꼬르륵 소리가 나네’라는 문장과 임베딩 벡터값이 가장 유사한 상위 3개의 테이터를 출력
sim_result = return_answer_candidate(df, '아무것도 안 먹었더니 꼬르륵 소리가 나네')
sim_result