brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Nov 23. 2024

AI 9탄-4. 랭체인,RAG 사용-4/10

RAG 구현해보자.


<9> 실습 환경 구축하기 - VSCode 실행, 12개 라이블러리 설치

<10> RAG - 코사인 유사도 확인 ,  ch06_VECTOR_SIMILARITY.ipynb

<11> RAG - ChatOpenAI사용,ch06_CHAT_HISTORY.ipynb

<12> RAG - ch06_TEXT_SPLITTER.ipynb

<13> RAG - ch06_SEMANTIC_TEXT_SPLITTER.ipynb

<14> RAG - 다양한 PDF Loader,ch06_PDF_LOADER.ipynb

<15> RAG - 벡터 데이터베이스 , ch06_VECTOR_DATABASE.ipynb





<9> 실습 환경 구축하기 - VSCode 실행, 12개 라이블러리 설치





1

예제코드 다운로드 6장


https://wikibook.co.kr/llm-projects/



2

# VSCODE

File > 폴더 열기

ch06



3

# 가상환경 생성하기

command 창에서


C:\0ai\07-ai\ch06\>python -m venv ch06_env


C:\0ai\07-ai\ch06\ch06_env\Scripts>activate.bat


(ch04_env) C:\0ai\07-ai\ch06\ch06_env\Scripts>





pip install pandas

pip install openai

pip install langchain

pip install langchain_experimental

pip install langchain_openai

pip install langchain_community

pip install pypdf

pip install pymupdf

pip install chromadb

pip install faiss-cpu

pip install tiktoken






<10> RAG - 코사인 유사도 확인,  ch06_VECTOR_SIMILARITY.ipynb


1

# 텍스트 임베딩 , 텍스트를 벡터화

인공지능 모델은 벡터(vector)연산을 한다.

인공지능은 텍스트를 벡터로 수치화한 뒤에 처리한다.

벡터로 만드는 임베딩 기술.

코사인 유사도를 사용해 두 벡터의 유사도를 할수 있다.

최종적으로 검색 시스템을 구현하기 위해 사용된다.



2

#  벡터 유사도를 구하는 대표적인 방법 코사인 유사도

# 코사인 유사도 확인 ,  

ch06_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))




벡터1과 벡터2의 유사도 : 0.6666666666666667

벡터1과 벡터3의 유사도 : 0.6666666666666667

벡터2와 벡터3의 유사도 : 1.0000000000000002



2

ch06_OPENAI_EMBEDDING.ipynb


# 임베딩 결과

0   저는 배가 고파요[-0.016628302994777876, -0.021754816646823914,...

1 저기 배가 지나가네요[-0.0033146261427528688, -0.027557911195226485...

2 굶어서 허기가 지네요[-0.006115510937439029, -0.0070621542151335275...

3 허기 워기라는 게임이 있는데 즐거워[-0.011373619934562202, -0.011753614427933356,...

4 스팀에서 재밌는 거 해야지[-0.016117957883498426, -0.014398175804554103,...

5 스팀에어프라이어로 연어구이 해먹을거야[-0.002163747705450216, -0.03004803712770594, ...




# 유사도 상위 3개 결과

            text                                                     embedding                               similarity

2 굶어서 허기가 지네요[-0.006115510937439029, -0.0070621542151335275...0.836827

5 스팀에어프라이어로 연어구이 해먹을거야[-0.002163747705450216, -0.030048030594, ...0.815895

0 저는 배가 고파요[-0.016628302994777876, -0.021754816646823914,...0.812362





<11> RAG - ChatOpenAI사용,ch06_CHAT_HISTORY.ipynb


#랭체인에서 chatOpenAI 사용하기


1

# 필요한 라이브러리 설치


!pip install langchain langchain_openai langchain_community



2


import os

from langchain_core.prompts import PromptTemplate

from langchain_openai import ChatOpenAI

from langchain_core.runnables.history import RunnableWithMessageHistory

from langchain_community.chat_message_histories import ChatMessageHistory

from langchain.callbacks.tracers import ConsoleCallbackHandler



3


#랭체인 패키지를 사용해 ChatGPT를 사용하기 위해서는  ChatOpenAI() 함수를 사용해 llm 객체를 생성해야 한다.



os.environ['OPENAI_API_KEY'] = "sk-proj-RsA"

# 객체 생성

llm = ChatOpenAI(

    temperature=0.1,  # 창의성 (0.0 ~ 2.0)

    max_tokens=2048,  # 최대 토큰수

    model_name="gpt-3.5-turbo",  # 모델명

)

# 질의내용

question = "세종대왕이 누구인지 설명해주세요"

# 질의

result = llm.invoke(question)

print(result.content)



4

좀더 복잡한 프롬프트를 전달하기 위해서는 랭체인에서는 프롬프트 템플릿을 사용한다.

ChatGpt에서 입력을 전달하는 프롬프트의 템플릿을 만들어 두는것이다.




<12> RAG - ch06_TEXT_SPLITTER.ipynb


1

ChatGPT같은 언어 모델들은 입력 길이가 제한되어 있어  정해진 입력 길이를 넘는 문서는 한번에 입력이 안된다.

긴 입력은 언어 모델이 검색해야할 양이 많아 답변의 정확도가 떨어진다.

이런 이유로 초기 긴 입력 문서를 작게 분할하여 처리한다.

텍스트를 자르는 함수를 사용한다.

입력에 관한 부분.




<13> RAG - ch06_SEMANTIC_TEXT_SPLITTER.ipynb


어느정도 문맥의 의미가 고려되어 청크들을 분할한다.




<14> RAG - 다양한 PDF Loader,ch06_PDF_LOADER.ipynb



1

PyPDFLoader

가장 많이쓰는 PDF Loader.

페이지 단위로 로드한다.

27페이지라면 27개의 청크로 로드한다.



2

PyMuPDFLoader

속도가 빠르다, 메타 데이터가 다양하다.



3

PDFPlumberLoader

메티데이터가 다양한다.

읽기 속도가 상대적으로 느리다.




<15> RAG - 벡터 데이터베이스 , ch06_VECTOR_DATABASE.ipynb


1

앞에서 각 텍스트를 임베딩할대 파이썬의 Pandas를 이용해 각 문서와 임베딩을 적재하고, 그 후 Numpy를 이용해  코사인 유사도를 이용해 유사도를 구했다.

실무에서는 판다스가 아닌 벡터 데이터베이스를 사용한다.

Milvus,Faiss,Chroma 등.



2

크로마 사용



3

파이스 사용



다음

https://brunch.co.kr/@topasvga/4159


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari