본문 바로가기
AI 도구

🤖OpenAI Swarm 활용: Ollama 로컬 모델로 뉴스 요약 에이전트 만들기

by James AI Explorer 2024. 11. 9.
    728x90

    안녕하세요! 오늘은 OpenAI멀티 에이전트 프레임워크Swarm에 대해 알아보는 두 번째 시간입니다. 지난 포스팅에서는 Swarm의 개요, 주요 기능, 설치 방법, 그리고 예제 테스트까지 함께 살펴보았는데요. 이번 시간에는 Ollama를 이용한 로컬 언어 모델로 AI 에이전트를 만드는 방법에 대해 알아보고, 사용자가 요청한 주제에 대해 최신 뉴스를 검색, 요약하는 간단한 웹 애플리케이션을 만들어 보겠습니다. 

    🤖OpenAI Swarm 활용: Ollama 로컬 모델로 뉴스 요약 에이전트 만들기
    Ollama 모델을 활용한 Swarm AI 뉴스 에이전트 실행화면

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

    환경설정 및 모델 다운로드

    Swarm은 여러 에이전트의 조정 및 실행을 쉽고, 제어 가능하며, 테스트하기 쉽게 만드는 것을 목표로 하는 프레임워크로, OpenAI 챗 완성 API를 기반으로 작동합니다. Swarm은 Python 3.10 이상 버전이 필요하며, 이 블로그의 설치 환경은 Windows 11 Pro, WSL2, 파이썬 버전 3.11, Visul Studio Code(이하 VSC)이며, "WSL 연결"을 통해 Linux환경에서 실행하였습니다.

     

    1. 가상 환경 생성 및 활성화: 먼저 VSC에서 파이썬 가상환경을 생성하고 활성화합니다 

    python -m venv .venv
    source .venv/bin/activate

     

    2. Swarm 및 관련 패키지 설치: 가상환경이 활성화된 상태에서 Swarm 실행에 필요한 라이브러리들을 설치합니다. 인터넷 검색을 위한 DuckDuckGo 검색 API 패키지와 웹 애플리케이션 인터페이스(UI) 구축을 위한 Gradio 패키지가 포함됩니다. 

    pip install git+https://github.com/openai/swarm.git
    pip install gradio duckduckgo_search

    3. Ollama 설치: 다음 사이트에 접속해서 자신의 운영체제에 맞는 로컬 언어모델 관리도구, Ollama를 설치합니다. 

    https://ollama.com/download

     

    Download Ollama on macOS

    Download Ollama for macOS

    ollama.com

    4. Qwen2.5 모델 다운로드: Ollama pull 명령어로 Qwen2.5 모델을 다운로드합니다. Qwen2.5는 대화 응대, 자연어 처리, 그리고 코딩 능력에서 뛰어난 성능을 자랑하는 다목적 AI 모델로, 향상된 자연어 처리 능력과 멀티태스크 학습 성능으로 복잡한 질문이나 추론을 더욱 정확하고 신속하게 처리하며, 코딩 문제 해결에서도 고도의 알고리즘 추론 능력을 발휘합니다. Qwen2.5 모델에 대한 자세한 내용은 아래 포스팅을 참고하세요.

    2024.09.26 - [AI 언어 모델] - 🚀Qwen2.5: 오픈소스 모델 최고 성능! MMLU 86.1% HumanEval 88.4% 달성!

     

    🚀Qwen2.5: 오픈소스 모델 최고 성능! MMLU 86.1% HumanEval 88.4% 달성!

    안녕하세요! 오늘은 중국 알리바바 클라우드에서 개발한 최신 오픈소스 인공지능 모델 Qwen2.5에 대해 알아보겠습니다. Qwen2.5는 대화 응대, 자연어 처리, 그리고 코딩 능력에서 뛰어난 성능을 자

    fornewchallenge.tistory.com

    ollama pull qwen2.5

    https://ollama.com/library/qwen2.5

     

    qwen2.5

    Qwen2.5 models are pretrained on Alibaba's latest large-scale dataset, encompassing up to 18 trillion tokens. The model supports up to 128K tokens and has multilingual support.

    ollama.com

    5. API Key 및 모델 설정: VSC 터미널에서 OpenAI API로 Ollama 모델과 대화하기 위한 환경변수를 설정합니다. Ollama는 별도의 API Key가 필요하지 않으므로, 임의의 문자로 입력해도 됩니다.

    export OPENAI_API_KEY=fake-key && export OPENAI_MODEL_NAME=qwen2.5:latest && export OPENAI_BASE_URL=http://localhost:11434/v1
    728x90

    코드 작성

    다음은 코드 작성단계입니다. VSC에서 새로운 파이썬 파일을 생성하고 아래 코드를 복사해서 붙여 넣습니다. 코드는 GradioDuckDuckGo API를 사용하여 사용자로부터 검색어를 입력받고, 해당 주제에 대한 최신 뉴스 기사를 검색한 후 한국어로 요약하여 보여주는 웹 애플리케이션입니다.

     

    뉴스 에이전트 (News Agent)는 주어진 주제에 대한 최신 뉴스 기사를 DuckDuckGo 검색 API를 통해 검색하고, 그 결과를 한국어로 응답합니다. 편집 에이전트 (Editor Agent)는 뉴스 에이전트에서 검색된 뉴스 기사를 편집하여 원본 URL과 각 기사의 날짜를 포함하여 출력하고, 중요한 내용은 볼드체로 강조합니다. 각 기사는 200단어 이내로 요약합니다.

     

    AI의 답변은 마크다운(Markdown) 형식으로 렌더링 되어, 제목이 볼드체로 표시되며 링크가 클릭 가능한 형태로 표시됩니다. 페이지를 특정 기사로 바로 링크하기 어려운 msn.com 뉴스 기사는 필터링하여 제외하였으며, 중국어가 표시되지 않도록 답변에 중국어가 있는 경우 Qwen2.5 모델이 한국어로 번역해서 답변하도록 인스트럭션에 설정하였습니다. 

    import gradio as gr
    from duckduckgo_search import DDGS
    from swarm import Swarm, Agent
    from datetime import datetime
    import re
    
    current_date = datetime.now().strftime("%Y-%m")
    client = Swarm()
    
    def contains_chinese(text):
        """중국어 문자 포함 여부 확인"""
        return any('\u4e00' <= char <= '\u9fff' for char in text)
    
    def get_news_articles(topic, date=None):
        print(f"Running DuckDuckGo news search for {topic}...")
        ddg_api = DDGS()
        search_query = f"{topic} {date if date else current_date}"
        results = ddg_api.news(search_query, max_results=10)
        if results:
            # "https://www.msn.com" URL을 포함하지 않은 뉴스만 필터링
            filtered_results = [
                result for result in results
                if "https://www.msn.com" not in result['url']
            ]
            
            if filtered_results:
                news_results = "\n\n".join([
                    f"**제목**: {result['title']}\n**링크**: {result['url']}\n**내용**: {result['body']}" 
                    for result in filtered_results
                ])
                return news_results
            else:
                return f"{topic}에 대한 뉴스를 찾을 수 없습니다."
        else:
            return f"{topic}에 대한 뉴스를 찾을 수 없습니다."
    
    news_agent = Agent(
        name="News Assistant",
        instructions="""
        당신은 DuckDuckGo 검색을 사용하여 주어진 주제에 대한 오늘의 최신 뉴스 기사를 제공합니다.
        반드시 한국어로만 응답하십시오.
        중국어가 포함된 내용이 있다면 한국어로 번역하여 제공하십시오.
        항상 응답에 전체 URL을 포함하십시오.
        각 뉴스 기사에 대한 날짜를 포함하십시오.
        """,
        functions=[get_news_articles],
        model="qwen2.5:latest"
    )
    
    editor_agent = Agent(
        name="Editor Assistant",
        instructions="""
        당신은 뉴스 편집자입니다. 다음 규칙에 따라 뉴스를 한국어로 편집해주세요:
        1. 각 뉴스는 별도의 섹션으로 구분하여 작성
        2. 모든 원본 URL을 반드시 포함
        3. 각 기사의 날짜 포함
        4. 중요 내용은 ** 볼드체 처리
        5. URL은 [제목](URL) 형식으로 포함
        6. 반드시 한국어로 작성하고, 중국어가 포함된 내용은 한국어로 번역하여 제공
        7. 각 기사는 200단어 이내로 요약
        """,
        model="qwen2.5:latest"
    )
    
    def process_news_request(topic, progress=gr.Progress(track_tqdm=True)):
        try:
            progress(0, desc="시작하는 중...")
            
            progress(0.3, desc="뉴스 검색 중...")
            news_response = client.run(
                agent=news_agent,
                messages=[{"role": "user", "content": f"한국어로 {topic}에 대한 최신 뉴스를 찾아주세요."}],
            )
            
            raw_news = news_response.messages[-1]["content"]
            
            # 원본 뉴스에서 중국어가 포함된 항목 제거
            raw_news_list = raw_news.split("\n\n")
            filtered_news_list = [news for news in raw_news_list if not contains_chinese(news)]
            
            # MSN URL이 포함된 항목도 제거
            filtered_news_list = [news for news in filtered_news_list if "https://www.msn.com" not in news]
            
            filtered_news = "\n\n".join(filtered_news_list)
    
            progress(0.6, desc="뉴스 편집 중...")
            
            edited_news_response = client.run(
                agent=editor_agent,
                messages=[{"role": "user", "content": f"다음 뉴스를 한국어로 편집해주세요:\n{filtered_news}"}],
            )
            
            progress(1.0, desc="완료!")
            return edited_news_response.messages[-1]["content"]
        except Exception as e:
            return f"오류가 발생했습니다: {str(e)}\n\n디버그 정보: {type(e).__name__}"
    
    with gr.Blocks(theme=gr.themes.Soft()) as demo:
        gr.Markdown("# 🤖 Swarm AI 뉴스 에이전트")
        
        with gr.Row():
            topic_input = gr.Textbox(
                label="검색할 주제를 입력하세요",
                placeholder="예: AI, SpaceX, Blockchain...",
                lines=1
            )
        
        with gr.Row():
            submit_btn = gr.Button("검색", variant="primary")
        
        with gr.Row():
            result_output = gr.Markdown(
                value="Swarm AI를 활용해서 Ollama qwen2.5 모델이 사용자가 요청한 최신 뉴스를 검색하고 한국어로 요약해드립니다.",
                label="AI가 정리한 뉴스"
            )
        
        examples = gr.Examples(
            examples=[
                ["인공지능"],
                ["테슬라"],
                ["OpenAI"],
                ["기후변화"]
            ],
            inputs=topic_input
        )
        
        submit_btn.click(
            fn=process_news_request,
            inputs=topic_input,
            outputs=result_output
        )
        
        topic_input.submit(
            fn=process_news_request,
            inputs=topic_input,
            outputs=result_output
        )
    
    if __name__ == "__main__":
        demo.queue().launch(share=True)

     

    코드실행 및 테스트

    VSC 가상환경이 활성화된 상태에서 환경변수를 설정하고 코드를 실행하면 http://127.0.0.1:7860 주소에서 Swarm AI 뉴스 에이전트 초기화면이 아래 화면과 같이 실행됩니다. 

    Swarm AI 뉴스 에이전트 코드 실행
    Swarm AI 뉴스 에이전트 초기화면

    검색할 주제를 입력하면 "뉴스 검색 중"이 표시되면서 아래 화면과 같이 코드가 실행됩니다. 최초 실행 시 Ollama 언어모델 Qwen2.5가 로딩되는 시간이 소요될 수 있습니다. 

    검색 주제 입력 및 코드 실행

    뉴스 검색이 완료되면 편집과 요약, 번역을 거쳐서 아래 화면과 같이 뉴스 요약이 표시됩니다. 각 뉴스별로 약 200자 정도의 한국어로 요약되며, 클릭 가능한 출처 URL이 표시됩니다. 가끔 Qwen2.5 모델의 한계로 중국어가 표시되거나, 환각 현상이 발생할 수 있습니다. 

    OpenAI 검색 결과(좌), NVIDIA 검색 결과(우)

    웨일 브라우저의 사이드바를 활용하시면 아래 화면과 같이 작업 중에도 뉴스를 검색하실 수 있습니다.

    웨일 브라우저 사이드바 활용

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

    맺음말

    오늘은 OpenAI의 Swarm을 활용하여 Ollama 로컬 모델, Qwen2.5 AI 에이전트를 구축해서, 최신 뉴스를 검색하고 요약하는 시스템을 구성하는 과정을 살펴보았습니다. Swarm은 다중 에이전트 프레임워크를 통해 사용자 맞춤형 정보를 효과적으로 제공할 수 있는 강력한 도구로, 여러 에이전트 간의 원활한 상호작용을 가능하게 합니다.

     

    이번 포스팅이 AI 멀티 에이전트 시스템을 이해하고, 실생활에 적용해 보는 데에 유용한 가이드가 되었기를 바라면서, 여러분도 Ollama의 다양한 모델을 이용해서 Swarm AI 에이전트를 만들어 보시면 좋을 것 같습니다. 그럼 저는 다음 시간에 더 유익한 정보를 가지고 다시 찾아뵙겠습니다. 감사합니다. 

     

    https://fornewchallenge.tistory.com/

     

     

    2024.10.17 - [AI 도구] - 🤖Swarm 설치 및 활용 가이드: OpenAI의 혁신적 멀티 에이전트 프레임워크

     

    🤖Swarm 설치 및 활용 가이드: OpenAI의 혁신적 멀티 에이전트 프레임워크

    안녕하세요! 오늘은 OpenAI가 최근 공개한 멀티 에이전트 시스템을 위한 실험적 프레임워크, Swarm에 대해 알아보겠습니다. Swarm은 루틴(Routines), 핸드오프(Handoffs)라는 핵심 개념을 통해 에이전트 간

    fornewchallenge.tistory.com

    728x90