콘텐츠로 이동

논문 검색을 함수호출과 연계하기

실행 준비

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

논문 검색

from openai import OpenAI
import json
import arxiv  # arxiv 라이브러리 설치 필요: pip install arxiv

# 1. OpenAI 클라이언트 설정
client = OpenAI()


# 2. 논문 검색 함수
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 "해당 주제에 대한 논문을 찾을 수 없습니다."

# 3. 함수 목록 정의 (tool format)
tools = [
    {
        "type": "function",
        "function": {
            "name": "search_paper",
            "description": "arXiv에서 관련 논문을 검색합니다.",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {"type": "string", "description": "논문 검색 키워드이며 반드시 영어 단어나 문장으로 변환해줘"},
                },
                "required": ["query"]
            }
        }
    }
]

# 4. 사용자 입력 예시 (자유롭게 바꾸세요)
user_message = "양자 컴퓨팅에 대한 최신 논문 찾아줘."

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

# 6. 응답 처리
response = completion.choices[0].message

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

    if function_name == "search_paper":
        result = search_paper(arguments['query'])
    else:
        result = "지원되지 않는 함수입니다."

    print(result)

else:
    print(response.content)