연구자에게 논문은 식량과 같지만, 매일 쏟아지는 수백 편의 논문을 모두 정독하기에는 물리적 시간이 턱없이 부족합니다. 특히 실험과 데이터 분석을 병행해야 하는 환경에서 ‘읽을 만한 논문’을 골라내는 선별 작업(Screening)만으로도 지치기 마련입니다.

본 포스팅에서는 자가 구축한 Nextcloud-개인서버구글의 최신 모델인 Gemini 2.5 Flash API를 결합하여, 논문을 특정 폴더에 던져두기만 하면 AI가 즉시 분석 리포트를 작성해 주는 ‘AI 논문 사서’ 시스템 구축 과정을 상세히 공유합니다.


1. 시스템 설계: 왜 ‘요약’이 아니라 ‘스크리닝’인가?

많은 AI 도구들이 논문 전체 요약을 시도하지만, LLM의 특성상 서론만 읽고 결론을 지어내는 환각(Hallucination) 현상을 피하기 어렵습니다.

본 시스템은 논문의 초반부를 분석하여 해당 논문이 내가 시간을 들여 읽을 가치가 있는가를 판단하는 ‘스크리닝’에 집중합니다. 연구자가 수동으로 훑어보던 과정을 AI가 대신 수행하고, 연구자는 AI가 골라준 ‘가치 있는’ 논문에만 집중함으로써 연구의 밀도를 높이는 것이 핵심입니다.


2. 필수 환경 구성 및 준비물

1) Nextcloud 폴더 구조

데이터 관리를 위해 Nextcloud 내에 전용 폴더를 생성합니다.

  • /Inbox/Paper: 분석할 PDF를 업로드하는 경로 Nextcloud Inbox폴더 및 결과물

2) Gemini 2.5 Flash API 키 및 제약 사항

Google AI Studio에서 API 키를 발급받습니다.

  • 할당량 주의: 2025년 기준, Gemini 2.5 Flash 무료 티어는 하루 20회로 요청이 제한됩니다.
  • 팁: 개인 연구자가 하루에 정독 후보로 올리는 논문이 20편을 넘는 경우는 드물기에, 무료 티어로도 충분히 실용적인 운영이 가능합니다.

3) 보안 설정 (환경 변수)

API 키를 코드에 직접 노출하지 않기 위해 워크스테이션의 환경 변수에 등록합니다.

echo 'export GEMINI_API_KEY="your_api_key_here"' >> ~/.bashrc
source ~/.bashrc

3. 핵심 자동화 스크립트 (Python)

이 스크립트는 중복 분석 방지 로직과 분석 후 서버 데이터베이스 즉시 갱신 기능을 포함하고 있습니다.

import os
import subprocess
from google import genai
from pypdf import PdfReader

# --- 설정 ---
API_KEY = os.getenv("GEMINI_API_KEY")
TARGET_FOLDER = "/nextcloud/data/admin/files/Inbox/Paper" # 실제 데이터 경로
CONTAINER_NAME = "nextcloud" # Nextcloud Docker 컨테이너명

if not API_KEY:
    print("Error: GEMINI_API_KEY 환경 변수가 설정되지 않았습니다.")
    exit(1)

client = genai.Client(api_key=API_KEY)

def extract_text_from_pdf(pdf_path):
    """논문의 초반 5페이지만 추출하여 분석 효율 최적화"""
    try:
        reader = PdfReader(pdf_path)
        text = ""
        max_pages = min(5, len(reader.pages))
        for i in range(max_pages):
            text += reader.pages[i].extract_text()
        return text
    except Exception as e:
        print(f"PDF 읽기 오류: {e}")
        return None

def analyze_paper(text):
    """연구 분야에 맞춰 프롬프트 커스터마이징 가능"""
    prompt = f"""
    당신은 논문을 선별하는 전문 리뷰어입니다. 아래 논문의 서론을 읽고 분석하세요.
    
    1. **제목(Title)**: 영어 제목
    2. **핵심 연구 질문**: 이 연구가 해결하려는 구체적인 문제는 무엇인가?
    3. **사용된 주요 기법**: 어떤 방법론이나 실험 기법을 사용하는가?
    4. **읽을 가치 평가**: (상/중/하) 등급과 그 이유를 연구자 관점에서 서술.
    
    [논문 텍스트]:
    {text[:10000]}
    """
    response = client.models.generate_content(
        model="gemini-2.5-flash", 
        contents=prompt
    )
    return response.text

def main():
    print("--- 논문 스크리닝 가동 ---")
    new_files_count = 0

    if not os.path.exists(TARGET_FOLDER):
        print(f"경로 오류: {TARGET_FOLDER}")
        return

    for filename in os.listdir(TARGET_FOLDER):
        if filename.lower().endswith(".pdf"):
            summary_path = os.path.join(TARGET_FOLDER, os.path.splitext(filename)[0] + "_screening.md")
            
            # [핵심] 동일한 이름의 리포트가 있다면 중복 분석을 수행하지 않음 (API 할당량 절약)
            if os.path.exists(summary_path):
                continue

            print(f"새 논문 분석 중: {filename}...")
            raw_text = extract_text_from_pdf(os.path.join(TARGET_FOLDER, filename))
            
            if raw_text:
                try:
                    result = analyze_paper(raw_text)
                    with open(summary_path, "w", encoding="utf-8") as f:
                        f.write(result)
                    print(f"성공: {filename}")
                    new_files_count += 1
                except Exception as e:
                    print(f"AI 분석 에러: {e}")

    # 새 리포트가 생성된 경우 Nextcloud DB 동기화
    if new_files_count > 0:
        print(f"--- {new_files_count}개의 리포트 동기화 중... ---")
        subprocess.run([
            'docker', 'exec', '--user', 'www-data', 
            CONTAINER_NAME, 'php', 'occ', 'files:scan', 
            '--path=/admin/files/Inbox/Paper'
        ])

if __name__ == "__main__":
    main()

4. 커스터마이징: 나만의 연구 필터 만들기

이 시스템의 진정한 가치는 프롬프트 수정에 있습니다. 본인의 연구 분야에 따라 analyze_paper 함수 내의 프롬프트를 수정해 보십시오.

  • 구조생물학: “이 단백질의 해상도(Resolution)가 언급되었는지, 사용된 EM 기법이 무엇인지 요약해 줘.”
  • 나노 과학: “합성 방식의 신규성(Novelty)과 수율 개선 여부를 중점적으로 살펴줘.”
  • 생화학: “특정 화합물의 IC50 값이나 효능 데이터가 포함되어 있는지 확인해 줘.”

5. 트러블슈팅: 실제 구축 시 마주하는 과제들

1) 권한 문제 (Permission Denied)

Nextcloud 데이터 폴더는 보안상 www-data 소유입니다. 파이썬 스크립트가 리포트를 저장하지 못한다면 그룹 권한을 조정해야 합니다.

sudo chown -R www-data:www-data /path/to/nextcloud/data/files/Inbox/Paper
sudo chmod -R 775 /path/to/nextcloud/data/files/Inbox/Paper

2) 웹 화면 동기화 이슈

터미널에서 파일을 직접 생성하면 Nextcloud 웹 화면에 즉시 나타나지 않습니다. 넥스트클라우드가 파일 목록을 DB로 관리하기 때문입니다. 반드시 스크립트 하단에 포함된 occ files:scan 명령어가 실행되어야 합니다.

3) API 404 에러

구글은 모델 명칭을 주기적으로 업데이트합니다. 만약 gemini-1.5-flash가 작동하지 않는다면, gemini-2.5-flashgemini-flash-latest 등 가용 모델 리스트를 먼저 확인해야 합니다.


6. 결론: 연구 생산성의 새로운 패러다임

AI에게 모든 연구를 맡길 수는 없지만, 정보의 홍수 속에서 우리가 ‘어떤 논문에 귀중한 시간을 투자할지’ 결정하는 과정은 AI가 충분히 도울 수 있습니다.

자가 구축한 서버 환경에서 내 데이터를 지키며 수행하는 자동화 스크리닝. 이 시스템은 연구자의 통찰력은 지키면서 반복적인 소모는 획기적으로 줄여주는 가장 강력한 도구가 될 것입니다.