무엇을 만드나요
레퍼런스 구현은 몇 가지 명확한 부분으로 구성된 작은 Python 프로젝트입니다:| Part | What it does |
|---|---|
| CLI | 리서치 주제, 모델, 공급자, 깊이 설정, 출력 경로, 아티팩트 디렉터리 수락 |
| Venice 클라이언트 | chat completion, 스트리밍 chat completion, POST /augment/scrape 호출 |
| Search 레이어 | 기본 DuckDuckGo 검색, 선택적 arXiv 논문 발견 |
| 데이터 모델 | 소스 URL, 정규 URL, 청크, 증거, 노트, 에러, 보고서 추적 |
| 리서치 에이전트 | 검색 계획, 소스 읽기, 증거 추출, 갭 분석, 후속 쿼리 생성, 최종 보고서 작성 |
| 아티팩트 작성기 | 쿼리, 리서치 갭, 결과, 가져오기, 청크, 소스 노트, 보고서 초안, 에러, 보고서에 대한 감사 가능한 JSONL 레코드 저장 |
- 주제에 대해 다양한 검색 쿼리를 생성하도록 Venice에 요청.
- 하나 이상의 공급자로 웹 검색.
- 읽기 전에 URL 중복 제거.
- Venice의 scrape endpoint로 각 공개 소스 페이지를 Markdown으로 변환.
- 긴 페이지를 청크로 분할.
- 각 청크에서 증거를 추출하도록 Venice에 요청.
- 청크 증거를 소스 노트로 변환하도록 Venice에 요청.
- 후속 쿼리를 생성하기 전에 리서치 갭과 소스 균형 문제 식별.
- 각주 스타일 인용이 포함된 최종 보고서를 합성하도록 Venice에 요청.
프로젝트 설정
레퍼런스 프로젝트는 Python 3.13과uv를 사용하지만, 일반 가상 환경에서도 같은 코드가 동작합니다.
새 프로젝트 생성:
pip를 선호한다면 가상 환경을 만들고 같은 패키지를 설치하세요:
.env 파일 생성:
VENICE_MODEL을 사용합니다. 레퍼런스 구현은 현재 기본값으로 openai-gpt-55를 사용하지만, Venice 계정에서 사용 가능한 다른 chat 모델로 교체할 수 있습니다.
데이터 모델 만들기
에이전트 로직을 작성하기 전에 파이프라인을 흐르는 객체를 정의합니다. 이 모델은 모든 소스가 출처(어디서 왔는지, 어떤 쿼리가 찾았는지, 언제 수집되었는지, 어떻게 청킹되었는지)를 가지므로 나머지 코드를 더 이해하기 쉽게 만듭니다.research_agent/models.py 생성:
canonical_url, content_hash, chunks입니다.
canonical_url은 검색 결과가 추적 파라미터나 fragment에서만 다를 때 에이전트가 같은 소스를 반복해서 읽지 않도록 합니다. content_hash는 다른 URL에 있더라도 중복 페이지를 잡는 데 도움이 됩니다. chunks는 context 한도로 인해 유용한 증거를 잃는 대신 긴 페이지를 더 작은 조각으로 요약할 수 있게 합니다.
dataclass 아래에 헬퍼 함수를 추가하세요:
Venice 클라이언트 빌드
다음으로 작은 Venice 클라이언트를 만듭니다. Venice가 OpenAI 호환이므로 chat completion에 OpenAI Python SDK를 쓸 수도 있지만, 레퍼런스 구현은 같은 클라이언트가 Venice의POST /augment/scrape endpoint를 호출할 수 있도록 httpx를 직접 사용합니다.
research_agent/venice.py 생성:
from_env() 헬퍼는 시크릿을 소스 코드 밖에 둡니다. python-dotenv가 .env에서 VENICE_API_KEY와 VENICE_MODEL을 로드할 수 있기 때문에 로컬 개발이 편리합니다.
이제 chat completion을 추가하세요:
_post_chat_stream() 헬퍼도 포함되어 있습니다. 스트리밍 없이 시작한 다음 나머지 리서치 흐름이 동작하면 추가할 수 있습니다.
검색 공급자 추가
검색 레이어는 두 가지 일을 합니다: 소스 URL을 찾고, Venice 스크래퍼를 통해 그 URL들을 가져옵니다. 레퍼런스 구현은 일반 웹 검색에 DuckDuckGo의 HTML endpoint를, 논문에 arXiv의 Atom API를 사용합니다.research_agent/web.py 생성:
WebSearch 클래스가 공급자를 조율하고 페이지를 가져옵니다:
로컬 아티팩트 작성
리서치 워크플로의 경우 감사 가능성이 중요합니다. 최종 보고서가 놀라운 내용을 말한다면, 어떤 소스가 그것을 이끌었는지 검토할 수 있어야 합니다.research_agent/artifacts.py 생성:
리서치 에이전트 빌드
이제 Venice, 검색, 모델, 아티팩트가 있으니 실제 에이전트를 만들 수 있습니다.research_agent/agent.py 생성:
models.py에 두 개의 최종 dataclass도 필요합니다:
ResearchAgent를 정의하세요:
run() 메서드가 리서치 패스를 조율합니다:
seen_* 집합이 에이전트가 중복 소스에 시간을 낭비하지 않도록 막습니다. URL 중복 제거는 반복된 링크를 잡습니다. 콘텐츠 해시 중복 제거는 미러, 신디케이트된 게시물, 같은 최종 콘텐츠로 리다이렉트되는 페이지를 잡습니다.
초기 및 후속 검색 계획
첫 번째 모델 호출은 주제를 검색 쿼리로 바꿉니다:_gap_follow_up_queries()로 감싸고, Venice에 갭 레코드와 쿼리를 모두 반환하도록 요청합니다:
--artifacts가 활성화되면 이 레코드는 research_gaps.jsonl에 작성됩니다. 그러면 에이전트가 특정 2차 패스 쿼리를 검색한 이유에 대한 유용한 감사 추적을 얻습니다.
파서는 관대해야 합니다. 모델이 잘못된 JSON을 반환하면 에이전트는 원래 주제로 폴백합니다:
소스 읽기 및 요약
이제 소스 노트를 수집합니다. 에이전트는 각 쿼리를 검색하고, Venice scrape를 통해 각 결과를 가져오고, Markdown을 청킹하고, 유용한 증거를 요약합니다.최종 보고서 작성
에이전트가 소스 노트를 갖게 되면 보고서를 작성할 수 있습니다. 단일 패스 보고서 작성기로 시작하세요:CLI 추가
이제 명령줄 진입점이 필요합니다.main.py 생성:
| Option | What it controls |
|---|---|
--iterations | 리서치 패스 수 |
--queries | 패스당 생성되는 검색 쿼리 수 |
--results | 각 쿼리에 대해 공급자별로 읽는 결과 수 |
--providers | 검색 공급자, 예: duckduckgo 또는 duckduckgo,arxiv |
--max-sources | 수집할 사용 가능 최대 소스 수 |
--chunk-chars | 소스 증거 추출 전 대략적인 청크 크기 |
--max-chunks-per-source | 소스당 요약되는 청크 수 |
--report-style | 최종 보고서 깊이: brief, standard, deep |
--artifacts | JSONL 감사 레코드 디렉터리 |
--output | 최종 Markdown 보고서 경로 |
에이전트 실행
빠른 리서치 패스 실행:brief, 더 풍부한 조사에는 standard, 단계적 개요/섹션/편집자 워크플로에는 deep을 사용하세요.
감사 가능한 아티팩트 저장:
source_notes.jsonl은 요약된 소스 증거를, research_gaps.jsonl은 후속 검색이 생성된 이유를, errors.jsonl은 검색, 스크래핑, 요약 중 실패한 페이지를 보여줍니다.
프라이버시 및 신뢰성 노트
리서치 에이전트는 여러 시스템에 접근하므로 무엇이 어디로 가는지 정확하게 하는 것이 도움이 됩니다:| Layer | What sees the data |
|---|---|
| 로컬 CLI | 주제, 구성, 소스 노트, 아티팩트, 최종 보고서는 머신에 머묾 |
| 검색 공급자 | 검색 쿼리는 선택한 공급자(DuckDuckGo 또는 arXiv 등)로 전송 |
| Venice scrape | 공개 소스 URL이 Venice scrape endpoint로 전송 |
| Venice chat completion | prompt, 소스 청크, 소스 노트, 보고서 생성 지시가 Venice로 전송 |
| 출력 파일 | Markdown 보고서와 JSONL 아티팩트가 로컬에 작성 |
POST /augment/search endpoint를 호출하도록 조정할 수 있습니다. 레퍼런스 구현은 데모가 실행하고 이해하기 쉽도록 경량 공개 공급자를 사용합니다.
신뢰성을 위해 이 기본값들을 보수적으로 유지하세요:
- Venice 호출과 웹 요청에 재시도 사용.
- 같은 호스트에서 많은 페이지를 읽고 있다면 작은
--request-delay추가. - 광범위한 주제가 무기한 실행되지 않도록
--max-sources상한. - 최종 출력을 감사할 수 있도록 중요한 보고서에는
--artifacts저장. - 보고서를 ground truth가 아닌 브리핑으로 취급. 정확성이 중요할 때 인용을 원본 소스로 추적하세요.
부품 테스트
시스템의 대부분을 테스트하는 데 라이브 웹 요청이나 Venice 호출이 필요 없습니다. 레퍼런스 레포는 가짜 Venice와 가짜 웹 클래스로 리서치 루프, 중복 제거 동작, 아티팩트, 보고서 prompt를 테스트합니다. 유용한 첫 번째 테스트는 URL 정규화입니다:벤치마킹
많은 AI 공급자가 이제 자체 심층 리서치 워크플로를 갖고 있으므로 레퍼런스 레포에는 Perplexity의 Deep Research 도구에 대한 간단한 벤치마크가 포함되어 있습니다. 두 에이전트에게 AI 에이전트 프레임워크 아키텍처에 대한 보고서 작성을 요청했고, 생성된 보고서는 GitHub 레포에 체크인되었습니다. 이는 공식 벤치마크가 아닙니다. 보고서 구조, 소스 커버리지, 인용 품질, 에이전트가 한 소스 클러스터에 과도하게 집중하는지를 검토하는 실용적 방법입니다. 그것이 또한 업데이트된 구현이 후속 검색 전에research_gaps.jsonl과 소스 균형을 추적하는 이유입니다.
이 예제 확장
베이스라인 에이전트가 동작하면, 개선할 실용적 방법은 다음과 같습니다:POST /augment/search를 사용해 Venice 검색 공급자 추가.- JSONL 파일 대신 작은 SQLite 데이터베이스에 보고서와 아티팩트 저장.
- 신뢰할 수 있는 리서치 도메인에 대한 소스 allowlist 또는 blocklist 추가.
- 깨끗한 HTML을 노출하지 않는 소스에 대해 Venice scrape와 문서 파싱을 결합해 PDF 지원 추가.
- prompt 변경 후 리서치 품질을 비교할 수 있도록 주제와 예상 소스 유형의 평가 세트 추가.
- 최종 보고서를 저장하기 전에 Venice에 뒷받침되지 않는 주장을 찾도록 요청하는 검토 단계 추가.