콘텐츠로 이동

논문 검색을 Gradio에서 실행하기

실행 준비

!pip install openai
!pip install gradio
#!pip install arxiv

논문 검색

import gradio as gr
from openai import OpenAI
import json
import arxiv  # 사전 설치 필요: !pip install arxiv

# OpenAI 클라이언트 초기화
client = OpenAI()

# 논문 검색 함수
def search_paper(query):
    results = arxiv.Search(
        query=query,
        max_results=3,
        sort_by=arxiv.SortCriterion.Relevance
    )
    papers = []
    for r in results.results():
        papers.append(f"📄 {r.title}\n🧑‍🔬 저자: {', '.join([a.name for a in r.authors])}\n📅 출판일: {r.published.date()}\n🔗 링크: {r.pdf_url}")
    return "\n\n".join(papers) if papers else "❌ 해당 주제에 대한 논문을 찾을 수 없습니다."

# OpenAI Tool 등록
tools = [
    {
        "type": "function",
        "function": {
            "name": "search_paper",
            "description": "주어진 키워드로 arXiv에서 논문을 검색합니다.",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {
                        "type": "string",
                        "description": "논문 검색 키워드이며 반드시 영어 단어나 문장으로 변환해줘",
                    },
                },
                "required": ["query"]
            },
        },
    },
]

# 응답 생성 함수
def generate_response(prompt_text: str):
    completion = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "사용자의 요청에 따라 논문 검색에 필요한 키워드를 영어로 번역하여 추출한 후 search_paper 함수를 호출해줘. 그 외에는 일반적인 답변을 해줘."},
            {"role": "user", "content": prompt_text}
        ],
        tools=tools,
    )

    response = completion.choices[0].message

    if response.tool_calls:
        tool_call = response.tool_calls[0]
        function_name = tool_call.function.name
        arguments_json = json.loads(tool_call.function.arguments)

        if function_name == "search_paper":
            query = arguments_json.get('query')
            return search_paper(query)

        else:
            return "⚠️ 지원되지 않는 함수입니다."

    elif response.function_call:
        return str(response.function_call)

    else:
        return response.content

# Gradio 인터페이스
def chatgpt_interface():
    with gr.Blocks() as demo:
        gr.Markdown("## 💬 ChatGPT API 데모 (날씨 + 논문 검색)")

        with gr.Row():
            with gr.Column():
                input_text = gr.Textbox(label="질문을 입력하세요 (예: 양자 컴퓨팅 논문 검색)")
                output_text = gr.Textbox(label="AI 응답", interactive=False, lines=10)

                input_text.submit(generate_response, inputs=input_text, outputs=output_text)

        demo.launch()

# 실행
chatgpt_interface()