Ollama와 LangChain을 사용한 RAG 구현 방법

0

RAG(회수 가능 응답 생성, Retrieval-Augmented Generation)를 구현하는 방법을 찾고 계신가요? 그렇다면 Ollama와 LangChain을 활용한 방법을 소개해 드리겠습니다. 이 글을 통해 기술적 세부 사항을 이해하고 실습할 수 있을 것입니다. Ollama와 LangChain을 활용한 RAG 구현의 기본 개념부터 실제 코드 예제까지 단계별로 안내하겠습니다.


1. RAG란 무엇인가요?

RAG는 회수 가능 응답 생성을 의미합니다. 이는 자연어 처리(NLP)에서 정보를 회수하고, 이를 기반으로 자연스러운 응답을 생성하는 기법입니다. 이 방식은 단순히 텍스트 생성 모델을 사용하는 것보다 더 정확하고 신뢰성 있는 응답을 제공할 수 있습니다.

2. Ollama와 LangChain 소개

  • Ollama: 자연어 생성 모델로, 다양한 작업에서 높은 성능을 보여줍니다.
  • LangChain: NLP 파이프라인을 구성하고 관리하는 데 유용한 도구입니다. 여러 모듈을 쉽게 결합하고 확장할 수 있습니다.

3. Ollama와 LangChain을 사용한 RAG 구현 단계

다음은 Ollama와 LangChain을 사용하여 RAG를 구현하는 단계입니다.

1단계: 필수 모듈 설치

pip install ollama
pip install chromadb
pip install langchain

필요한 모듈들을 설치합니다.

2단계: 기본 채팅 구현

from langchain_community.llms import Ollama

llm = Ollama(model="llama2")
llm.invoke("Tell me a joke")

Ollama 모델을 불러와 기본 채팅을 구현합니다.

3단계: 문장 완성하기

llm = Ollama(model="mistral")
llm("The first man on the summit of Mount Everest, the highest peak on Earth, was ...")

문장 완성 예제를 통해 Ollama 모델의 기능을 테스트합니다.

4단계: 실시간 답변 출력하기

from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

llm = Ollama(
    model="mistral",
    callback_manager=CallbackManager([StreamingStdOutCallbackHandler()])
)
llm("The first man on the summit of Mount Everest, the highest peak on Earth, was ...")

실시간 답변 출력을 위해 LangChain의 콜백 기능을 활용합니다.

5단계: 문서 임베딩 및 검색

from langchain.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://www.gutenberg.org/files/1727/1727-h/1727-h.htm")
data = loader.load()

from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)

문서를 임베딩하고, 적절한 크기로 분할합니다.

from langchain.embeddings import OllamaEmbeddings
from langchain.vectorstores import Chroma

oembed = OllamaEmbeddings(base_url="http://localhost:11434", model="mistral")
vectorstore = Chroma.from_documents(documents=all_splits, embedding=oembed)

임베딩한 벡터를 ChromaDB에 저장합니다.

question = "What's the name of main character?"
docs = vectorstore.similarity_search(question)
print(len(docs))
print(docs)

저장된 데이터를 검색하여 질문에 대한 답변을 찾습니다.

6단계: 답변 생성

from langchain.llms import Ollama
from langchain.chains import RetrievalQA

ollama = Ollama(base_url='http://localhost:11434', model="gemma")
qachain = RetrievalQA.from_chain_type(ollama, retriever=vectorstore.as_retriever())
result = qachain.invoke({"query": question})

print(result)

검색된 데이터를 기반으로 LangChain RetrievalQA를 통해 답변을 생성합니다.

4. 구체적인 실습 예제

이미지 기반 질문을 처리하는 예제입니다.

from PIL import Image
import base64
from io import BytesIO
from IPython.display import HTML, display

def convert_to_base64(pil_image):
    buffered = BytesIO()
    pil_image.save(buffered, format="JPEG")
    img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
    return img_str

def plt_img_base64(img_base64):
    image_html = f'<img src="data:image/jpeg;base64,{img_base64}" />'
    display(HTML(image_html))

file_path = "pets_sample_img.jpg"
pil_image = Image.open(file_path)
image_b64 = convert_to_base64(pil_image)
plt_img_base64(image_b64)

llm_with_image_context = llava.bind(images=[image_b64])
llm_with_image_context.invoke("How many pets are in the image?")

이미지를 기반으로 질문에 답변하는 코드를 통해 모델의 다기능성을 확인할 수 있습니다.

결론

Ollama와 LangChain을 활용한 RAG 구현은 다양한 정보를 효과적으로 회수하고, 이를 기반으로 자연스러운 응답을 생성할 수 있는 강력한 도구입니다. 이 글을 통해 RAG 구현의 기본 개념과 실습 방법을 이해하고, 직접 구현해 보세요. 이를 통해 더 나은 응답 생성 모델을 만들 수 있을 것입니다.

참고 자료

답글 남기기