AIRAG벡터DB

RAG 실습 테스트

July 9, 20265
조회수 불러오는 중

실습 환경 구축

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
python
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
python
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 모델을 사용해 ‘저는 배가 고파요’라는 문장을 임베딩해서 벡터로 변환하고, 변환한 벡터 값을 출력
python
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")
query_result = embeddings.embed_query('저는 배가 고파요')
print(query_result)

실행 결과

6개의 데이터로 구성된 임의의 데이터프레임을 생성

아래 코드는 6개의 문장 데이터를 text 열에 할당해 6행 1열로 구성된 데이터프레임인 df를 만든다.

python
data = ['저는 배가 고파요',
				'저기 배가 지나가네요',
				'굶어서 허기가 지네요',
				'허기 워기라는 게임이 있는데 즐거워',
				'스팀에서 재밌는 거 해야지',
				'스팀에어프라이어로 연어구이 해먹을거야']
				
df = pd.DataFrame(data, columns=['text'])
df

각 text 열에 존재하는 텍스트 데이터들을 get_embedding() 함수로 임베딩해서 벡터로 변환하고, 이를 새로운 embedding 열을 만들어 저장

python
def get_embedding(text):
	return embeddings.embed_query(text)

df['embedding'] = df.apply(lambda row: get_embedding(
			row.text,
	), axis=1)
		
df

임의의 입력이 들어오면 위 데이터프레임 df에 존재하는 텍스트 중에서 가장 의미가 유사한 문장들을 반환하는 검색 시스템을 구현

python
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_doc

return_answer_candidate() 함수를 사용해 ‘아무것도 안 먹었더니 꼬르륵 소리가 나네’라는 문장과 임베딩 벡터값이 가장 유사한 상위 3개의 테이터를 출력

python
sim_result = return_answer_candidate(df, '아무것도 안 먹었더니 꼬르륵 소리가 나네')
sim_result

관련 글

댓글 기능은 준비 중입니다.