본문 바로가기
AI 도구

Ollama Python 라이브러리와 RAG으로 웹 사이트 요약하기

by James AI Explorer 2024. 1. 28.
    728x90

    안녕하세요! 오늘은 최근 공개된 대규모 언어 모델 활용도구 Ollama의 Python 라이브러리를 활용한 RAG(Retrieval-Augmented Generation, 검색 강화 생성) 프로그램에 대해 알아보겠습니다. RAG 외부 지식소스 검색을 통해 정보를 얻고, 이를 바탕으로 답변을 생성함으로써, 언어모델이 환각현상이나 부정확한 답변을 하지 않도록 보장하는 기술입니다. 이 블로그에서는 Ollama Python 라이브러리와 Langchain, Chroma DB를 활용한 RAG 구현에 대해 확인하실 수 있습니다. 

    Ollama 파이썬 라이브러리 RAG으로 웹 사이트 요약하기

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

    Ollama Python 라이브러리와 RAG 체인

    이 블로그에서 다루는 내용은 깃허브 3만 스타의 오픈소스 대규모 언어 모델 활용도구인 Ollama의 Python 라이브러리 활용에 대한내용으로, 사용된 코드의 출처는 아래와 같습니다. 

    Ollama Python 라이브러리

    Ollama Python 라이브러리는 Ollama 서비스를 Python 프로젝트에 통합할 수 있도록 도와주는 라이브러리입니다. Ollama는 자연어 처리 모델을 제공하는 플랫폼으로, 이 라이브러리를 사용하면 Ollama의 다양한 기능을 손쉽게 활용할 수 있습니다. 아래는 Ollama Python 라이브러리의 주요 기능과 사용법에 대한 설명입니다.

    1. 설치: Ollama Python 라이브러리는 pip 명령어를 통해 간단히 설치할 수 있습니다.

    pip install ollama

     

    2. 기본 사용법: Ollama Python 라이브러리를 사용하여 Ollama 모델과 상호 작용하는 가장 간단한 방법은 `chat` 함수를 사용하는 것입니다. 아래와 같이 간단한 코드 몇 줄로 대규모 언어모델과의 질문/응답 상호 작용을 만들 수 있습니다. 

    import ollama
    
    response = ollama.chat(model='llama2', messages=[
      {
        'role': 'user',
        'content': 'Why is the sky blue?',
      },
    ])
    print(response['message']['content'])

     

    위 코드를 실행하면 주어진 대규모 언어 모델 llama2에게 사용자의 메시지를 전달하고, 아래 화면과 같이 Ollama의 응답을 받아올 수 있습니다. 아래 화면은 메타의 llama2 모델이 하늘이 파란색인 이유에 대해 응답한 화면입니다. 

    Ollama chat Why is the sky blue? 실행결과

    3. 스트리밍 응답: 서버로부터 지속적인 응답을 받고 싶을 때 `stream=True` 옵션을 사용할 수 있습니다.

    for chunk in ollama.chat(model='mistral', messages=messages, stream=True):
        print(chunk['message']['content'], end='', flush=True)

     

    4. 기타 기능 및 사용 예시: Ollama Python 라이브러리는 다양한 기능을 지원하며, 스트리밍, 다중 모달 (Multi-modal) 처리, 텍스트 완성, 사용자 정의 모델 생성 등 다양한 작업을 수행할 수 있습니다. 

    5. 사용자 정의 클라이언트: 사용자는 필요에 따라 커스텀 클라이언트를 생성하여 Ollama 서버에 연결할 수 있습니다.

    6. 비동기 지원: 비동기 환경에서도 사용 가능하며, `AsyncClient` 클래스를 통해 비동기 클라이언트를 사용할 수 있습니다. 이 클래스를 사용하면 Ollama 서버와의 통신을 기다리는 동안 다른 작업을 수행할 수 있습니다.

     

    이러한 다양한 기능을 활용하여 Ollama Python 라이브러리는 효율적인 자연어 처리 작업을 지원합니다. 더 자세한 정보는 아래 Ollama Python 라이브러리의 GitHub 레포지토리에서 확인할 수 있습니다.

    https://github.com/ollama/ollama-python

     

    GitHub - ollama/ollama-python: Ollama Python library

    Ollama Python library. Contribute to ollama/ollama-python development by creating an account on GitHub.

    github.com

    728x90

    RAG (Retrieval-Augmented Generation) 체인

    RAG (Retrieval-Augmented Generation) 체인은 정보 검색과 자연어 생성을 결합하여 문제에 대한 답변을 생성하는 자연어 처리 모델의 한 유형입니다. 이 모델은 기존의 검색 결과를 활용하여 보다 풍부하고 문맥에 맞는 답변을 생성합니다. RAG 체인은 일반적으로 다음과 같은 세 가지 구성 요소로 이루어져 있습니다:

    • 검색 모듈 (Retriever): 체인의 첫 번째 단계는 주어진 입력에 대해 관련된 정보를 검색하는 것입니다. 웹 문서, 데이터베이스, 또는 다른 소스에서 정보를 검색하여 추출하는 역할을 합니다.
    • 임베딩 및 벡터화 (Embedding and Vectorization): 검색된 정보를 처리하기 위해 문장 또는 문서를 벡터로 변환하는 단계입니다. 이 단계에서는 주로 문장 임베딩 기술을 사용하여 문장을 벡터로 표현합니다.
    • 생성 모듈 (Generator): 검색된 정보와 벡터화된 입력을 결합하여 최종적인 답변을 생성하는 단계입니다. 이는 일반적인 자연어 생성 모델을 사용하여 이루어집니다. RAG 체인은 이 생성 단계에서 검색된 정보를 활용하여 높은 품질의 답변을 생성하려고 시도합니다.

    RAG 체인은 기존의 검색 기반 QA (Question Answering) 시스템에 비해 더 유연하고 풍부한 문맥을 다룰 수 있습니다. 이는 생성 모듈이 검색된 정보를 적절히 활용하여 특정 문제에 대한 답변을 개선할 수 있기 때문입니다. 이러한 구조는 실제 응용 분야에서 도메인 특정한 지식을 통합하고 문맥을 고려한 답변을 생성하는 데 도움이 됩니다.

     

    환경설정 및 Ollama 라이브러리 설치

    Ollama Python 라이브러리의 설치는 "python -m venv myenv" 명령어와 ".\myenv\Scripts\activate" 명령어를 통해 가상환경이 활성화 된 상태에서 "pip install ollama"명령어로 간단하게 설치할 수 있습니다. 나머지 gradio, beautifulsoup4, langchain 라이브러리는 requirements.txt 로 만들어서 "pip install -r requirements.txt" 명령어로 설치하면 됩니다. 

    python -m venv myenv
    .\myenv\Scripts\activate
    
    gradio
    beautifulsoup4
    langchain
    ollama

     

    가상환경 설정과 Ollama 설치가 완료되면 파이썬 코드를 실행하기 전에 WSL 프롬프트 상에서 "ollama serve" 명령어를 입력하여 http://127.0.0.1:11434의 주소에서 ollama가 실행되고 있는지 확인합니다. 그리고 "ollama run mistral" 명령어를 입력하고 대규모 언어 모델 mistral을 구동합니다.

    ollama에서의 대규모 언어 모델 mistral 구동

    파이썬 코드 실행하기

    다음은 파이썬 코드 실행단계입니다. 해당 코드는 Gradio를 사용하여 RAG Chain 기반의 질문 응답 시스템을 구현한 것으로, 사용자는 특정 URL과 질문을 입력하면, 해당 URL에서 문서를 로드하고, 문서를 적절한 크기로 분할한 뒤 RAG Chain을 위한 Embeddings을 사용하여 벡터화하며, RAG Chain에서 문서에 대한 질문에 응답을 생성하여 출력하게 됩니다. 

    코드에 대한 간단한 설명은 다음과 같습니다.

    • 1. 라이브러리 임포트: 필요한 라이브러리들을 가져옵니다. Gradio는 머신 러닝 모델에 대한 사용자 인터페이스를 쉽게 생성할 수 있게 도와주는 라이브러리이며, Beautiful Soup는 HTML 및 XML 파일에서 데이터를 추출하는 데 사용됩니다. 그 외에도 특정 프로젝트나 언어 처리에 관련된 라이브러리들이 포함되어 있습니다.
    • 2. 문서 로딩 및 검색: `load_and_retrieve_docs` 함수는 주어진 URL에서 웹 문서를 로드하고, 이를 문장으로 나누어 특징 벡터로 변환하여 검색 가능한 형태로 만듭니다. 이를 통해 모델은 주어진 질문에 대한 답을 찾을 수 있게 됩니다.
    • 3. 문서 포맷팅: `format_docs` 함수는 문서를 받아 각 문서의 페이지 내용을 두 번의 줄바꿈을 이용하여 하나의 텍스트로 합칩니다.
    • 4. RAG Chain 질문 응답: `rag_chain` 함수는 URL과 질문을 받아와서, 앞서 정의한 함수들을 사용하여 문서를 검색하고 포맷팅 한 후, 그 정보를 가지고 Mistral 모델을 사용하여 질문에 대한 답변을 생성합니다.
    • 5. Gradio 인터페이스: Gradio를 사용하여 간단한 웹 인터페이스를 설정합니다. 이 인터페이스에서는 사용자가 URL과 질문을 입력하면 시스템이 해당 정보를 기반으로 답변을 생성하고 출력합니다.
    • 6. 앱 실행: 마지막으로, 설정한 Gradio 인터페이스를 실행하여 RAG Chain 질문 응답 애플리케이션을 웹 인터페이스를 통해 사용할 수 있게 합니다.

     

     

    import gradio as gr
    import bs4
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    from langchain_community.document_loaders import WebBaseLoader
    from langchain_community.vectorstores import Chroma
    from langchain_community.embeddings import OllamaEmbeddings
    import ollama
    
    # Function to load, split, and retrieve documents
    def load_and_retrieve_docs(url):
        loader = WebBaseLoader(
            web_paths=(url,),
            bs_kwargs=dict() 
        )
        docs = loader.load()
        text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
        splits = text_splitter.split_documents(docs)
        embeddings = OllamaEmbeddings(model="mistral")
        vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)
        return vectorstore.as_retriever()
    
    # Function to format documents
    def format_docs(docs):
        return "\n\n".join(doc.page_content for doc in docs)
    
    # Function that defines the RAG chain
    def rag_chain(url, question):
        retriever = load_and_retrieve_docs(url)
        retrieved_docs = retriever.invoke(question)
        formatted_context = format_docs(retrieved_docs)
        formatted_prompt = f"Question: {question}\n\nContext: {formatted_context}"
        response = ollama.chat(model='mistral', messages=[{'role': 'user', 'content': formatted_prompt}])
        return response['message']['content']
    
    # Gradio interface
    iface = gr.Interface(
        fn=rag_chain,
        inputs=["text", "text"],
        outputs="text",
        title="RAG Chain Question Answering",
        description="Enter a URL and a query to get answers from the RAG chain."
    )
    
    # Launch the app
    iface.launch()

     

    이 코드를 실행하면 http://127.0.0.1:7860/ 의 주소에서 다음과 같은 화면이 열립니다. 

    Ollama의 Python 라이브러리 를 활용한 RAG 초기화면

    아래 화면은 코리아 헤럴드 뉴스기사의 url을 입력하고 기사를 요약해달라는 요청에 대해  mistral이 응답한 화면입니다. 

    Ollama 파이썬 라이브러리 RAG으로 웹 사이트 요약하기
    https://fornewchallenge.tistory.com/

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

    마치며

    이 블로그에서는 최신 언어 모델 활용 도구 Ollama의 Python 라이브러리를 활용한 RAG(Retrieval-Augmented Generation) 프로그램을 소개했습니다. RAG는 외부 지식 소스를 활용하여 보다 정확하고 문맥에 맞는 답변을 생성하는 언어 모델의 기술로, 자연어 처리 작업을 좀더 효율적이고 정확하게 처리할수 있도록 도와줍니다. 

     

    본문에서는 Ollama Python 라이브러리의 기본적인 설치 방법과 사용 예시를 통해 어떻게 대규모 언어 모델과 상호 작용할 수 있는지에 대한 내용을 알아보고, RAG 체인에 대한 개념과 구성 요소에 대한 설명을 통해 검색 모듈, 임베딩 및 벡터화, 생성 모듈이 어떻게 동작하는지 확인하였으며, 실제로 웹 인터페이스를 구현하여 사용자가 특정 URL과 질문을 입력하면 RAG 체인을 활용하여 답변을 생성하는 애플리케이션을 소개했습니다.

     

    이 블로그를 통해 알아본 Ollama의 Python 라이브러리와 RAG 체인을 활용한 효율적이고 정확한 자연어 처리 작업이  여러분께 도움이 되기를 바라면서, 저는 다음에 더 유익한 자료를 가지고 다시 찾아뵙겠습니다. 감사합니다. 

     

     

    2024.01.19 - [분류 전체보기] - Ollama, Langchain, Streamlit으로 대규모 언어 모델 기반 PDF 챗봇 만들기

     

    Ollama, Langchain, Streamlit으로 대규모 언어 모델 기반 PDF 챗봇 만들기

    안녕하세요! 오늘은 대규모 언어모델 애플리케이션 개발 도구인 Ollama와 Langchain, 데이터 시각화 및 웹 애플리케이션을 위한 오픈 소스 라이브러리 Streamlit을 활용해서 대규모 언어 모델 Mistral 7B

    fornewchallenge.tistory.com

    728x90