리서치
질문 하나를 출처 있는 리서치 브리프로 바꾸기
웹에 질문을 던지고, 답변의 근거 페이지를 Markdown으로 가져오고, X의 실무자 의견을 더한 뒤 증거를 나중에도 검색할 수 있는 LiveDoc에 남깁니다.
프롬프트 복사
대괄호 항목을 바꾼 뒤 Claude Code, Codex 또는 터미널에 접근할 수 있는 AI에 붙여넣으세요. Felo 스킬을 설치하고 크레딧을 쓰기 전에 확인한 뒤 워크플로를 실행합니다.
[질문 또는 의사결정]을 위한 출처 기반 리서치 브리프를 작성해 주세요. 범위: [시장, 지역, 언어]. 기간: [최근 30일 / 최근 12개월]. 독자: [누가 읽는가]. 깊이: [한 페이지 요약 / 전체 브리프]. Markdown 브리프에 다음을 포함해 주세요. 1. 세 개의 글머리표로 된 짧은 답변. 2. 근거 표: 주장, 출처 제목, URL, 게시일. 3. 출처 간에 의견이 갈리는 지점. 4. 아직 알 수 없는 내용. 5. 전체 출처 목록. 규칙: - 모든 사실 주장에는 출처 링크를 붙여 주세요. 사실, 의견, 당신의 추론을 구분해 주세요. - 인용, 지표, 날짜, 출처를 지어내지 마세요. 데이터가 없으면 "데이터 없음"이라고 쓰고 0이라고 쓰지 마세요. - 1차 출처를 우선하세요. X는 실무자 신호로만 사용하고 증거로 삼지 마세요. - 기간을 명시적인 시작일과 종료일로 확정하고 시간대를 밝혀 주세요. - 크레딧을 쓰기 전에 실행할 API 호출을 보여 주고 제 승인을 기다려 주세요. - 반복 작업을 만들거나 메시지를 보내거나 무언가를 게시하지 마세요. - 결과를 ./research-brief.md에 쓰고 채팅에서 요약해 주세요.
복사 내용에는 설치 단계와 안전 규칙도 포함됩니다.
완성되는 것
실행 시 예제 출력입니다. 실시간 생성이 아닙니다.
소형 모델이 지원 봇의 대형 모델을 대체할까?
짧은 답변
- 소형 모델은 분류와 1차 답변에 이미 충분하다.
- 병목은 모델 크기가 아니라 검색 품질이다.
- 전환한 팀은 해결률 상승이 아니라 티켓당 비용 감소를 보고했다.
| 주장 | 출처 | 날짜 |
|---|---|---|
| 답변 품질을 좌우하는 것은 검색 품질 | https://example.com/rag-eval | 2026-10-12 |
| 해결 티켓당 비용 38% 감소 | https://example.com/support-case | 2026-09-28 |
출처가 엇갈리는 점
벤더 벤치마크는 거의 동등하지만, 독립 테스트는 다단계 환불에서 여전히 차이를 본다.
아직 모르는 점
그 차이가 더 나은 도구 사용으로 좁혀질지, 더 큰 모델이 필요한지.
실제 호출
개발자용: 같은 워크플로를 실행 순서대로 담은 복사 가능한 코드.
실제 API 호출 보기
웹에 질문하기
Chat은 웹을 검색하고 출처 순위를 매기고 답변을 작성하며 사용한 리소스를 반환합니다. 상위 3개를 남기세요. 이후 단계는 그 링크를 따라갑니다. 아래 helper는 키를 한 번 보내고 2xx가 아니면 예외를 던집니다.
research.ts const BASE = "https://openapi.felo.ai"; const headers = { Authorization: `Bearer ${process.env.FELO_API_KEY}`, "Content-Type": "application/json", }; async function felo<T>(path: string, body?: unknown): Promise<T> { const res = await fetch(`${BASE}${path}`, { method: body ? "POST" : "GET", headers, body: body ? JSON.stringify(body) : undefined, }); if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`); return res.json() as Promise<T>; } type ChatData = { data: { answer: string; resources: { link: string; title: string }[] }; }; export async function answer(question: string) { const chat = await felo<ChatData>("/v2/chat", { query: question }); return { answer: chat.data.answer, sources: chat.data.resources.slice(0, 3) }; }예제 출력
{ "answer": "Recent developments include …", "sources": [ { "link": "https://example.com/article", "title": "…" } ] }답변의 근거 페이지 가져오기
요약만으로는 브리프가 되지 않습니다. readability를 켜고 페이지를 Markdown으로 가져와 인용과 제목을 내비게이션 잡음 없이 남깁니다. 같은 URL을 다시 요청하면 추출 캐시에 걸립니다.
research.ts type ExtractData = { data: { content: string } }; const pages = await Promise.all( sources.map((source) => felo<ExtractData>("/v2/web/extract", { url: source.link, output_format: "markdown", with_readability: true, with_cache: true, }).then((page) => ({ ...source, content: page.data.content })), ), );예제 출력
// pages[0].content "# Example Article\n\nExtracted article content…"
X의 목소리 더하기
뉴스는 발표를, X는 실무에서 겪은 일을 전합니다. 최근 7일을 검색하고 작성자와 시각을 남겨 모든 주장에 출처를 붙입니다.
limit를 높이면 범위가 넓어지고 결과 페이지마다 cursor가 붙습니다.research.ts type XData = { data: { tweets: { content: string; author: { username: string }; created_at: string; }[]; }; }; const since = Math.floor((Date.now() - 7 * 24 * 60 * 60 * 1000) / 1000); const social = await felo<XData>("/v2/x/tweet/search", { query: question, limit: 10, since_time: since, });예제 출력
{ "data": { "tweets": [ { "content": "…", "author": { "username": "…" }, "created_at": "…" } ] } }증거를 LiveDoc에 저장하기
LiveDoc을 만들고 출처를 URL 리소스로 추가합니다. API는 이미 본 URL을 중복 제거하고 URL마다 resource id를 반환하므로, 이후 질문에서 같은 증거를 다시 가져오지 않고 검색할 수 있습니다.
research.ts type LiveDocData = { data: { short_id: string } }; const doc = await felo<LiveDocData>("/v2/livedocs", { name: `Research: ${question.slice(0, 60)}`, description: "Sources collected while answering the question", }); await felo(`/v2/livedocs/${doc.data.short_id}/resources/urls`, { urls: sources.map((source) => ({ url: source.link, title: source.title })), }); console.log(doc.data.short_id); // keep this for later queries나중에 증거에 다시 묻기
여기가 성과입니다. 다음 질문은 오픈 웹이 아니라 LiveDoc에서 시맨틱 검색을 합니다. 알려진 하위 집합으로 제한할 때만
resource_ids를 전달하세요.research.ts type Retrieved = { data: { title: string; content: string; score: number }[]; }; async function ask(livedoc: string, query: string) { const hits = await felo<Retrieved>( `/v2/livedocs/${livedoc}/resources/retrieve`, { query }, ); return hits.data.filter((hit) => hit.score >= 0.7); }예제 출력
[ { "title": "…", "content": "…", "score": 0.92 } ]
포함되는 것
- Chat API의 출처 있는 답변과 그 근거 페이지
- 가장 강한 출처의 전체 페이지 Markdown 추출
- 실무자 신호로 활용할 작성자·시각 포함 X 게시물
- 증거를 나중에 검색할 수 있는 LiveDoc
하지 않는 것
- 공개 출처만 사용. 유료 장벽이나 로그인 전용 페이지는 실패할 수 있음
- X 커버리지는 신호이며 대표성 있는 조사가 아님
- 인터뷰, 비공개 데이터, 유료 데이터베이스는 다루지 않음
- 증거가 부족하면 추측으로 채우지 않고 그대로 표시
- 프롬프트당 1회 실행. 정기 실행은 agent나 cron에 맡김
자주 묻는 질문
출처는 어디서 오나요?
Chat API가 사용한 페이지를 반환하고, Web Fetch가 가장 강한 페이지를 Markdown으로 바꾸며, X Search가 날짜가 있는 실무자 게시물을 더합니다. 모든 항목은 URL을 유지합니다.
기술 외 시장도 조사할 수 있나요?
네. 범위 자리표시자를 원하는 시장으로 바꾸세요. 틈새 시장은 공개 출처가 적을 수 있으며, 브리프는 추측 대신 빈틈으로 표시합니다.
실행 후에도 증거가 남나요?
LiveDoc 단계를 실행하면 남습니다. 반환된 short_id로 다음 질문에서 같은 페이지를 다시 가져오지 않고 검색할 수 있습니다.
브리프 비용은 얼마인가요?
사용량 기반 크레딧입니다. 현재 요금은 가격 페이지에 있습니다. 프롬프트는 쓰기 전에 승인을 요청합니다.
매주 실행할 수 있나요?
가능하지만 이 프롬프트는 한 번만 실행합니다. 같은 워크플로를 실행할 수 있는 agent나 cron에 일정을 설정하세요.
출처가 유료 장벽 뒤에 있으면?
건너뛰고 사용할 수 없음으로 표시합니다. 유료 장벽의 빈틈을 지어낸 사실이나 인용으로 채우지 않습니다.
관련 워크플로
팀이 실제로 읽는 일일 AI 뉴스 다이제스트 만들기
출처 있는 뉴스 요약을 가져오고 X의 실무자 논의를 더하고 영상 자막 하나를 가져온 뒤 Markdown으로 호를 구성해 LiveDoc에 보관합니다.
워크플로 열기오피스리서치 페이지를 슬라이드 덱으로 바꾸기
페이지를 추출해 LiveDoc 맥락으로 저장하고 PPT Task API가 deck을 만드는 동안 완료 링크를 폴링합니다.
워크플로 열기지원자신의 문서로 지원 질문에 답하기
LiveDoc을 만들고 헬프 센터와 내부 runbook을 읽어 들인 뒤 티켓에 답할 구절을 검색하고 그 증거만으로 모델이 답하게 합니다.
워크플로 열기내 방식으로 바꾸기
같은 레시피를 실제 배포 방식에 맞게 조정합니다.
브리프를 파일로 쓰기
답변, 페이지 발췌, X 인용을 Markdown으로 묶어 보고서 도구에 넘기거나 문서 저장소에 커밋합니다. 주장 옆에 출처 링크를 남기세요. 브리프의 가치는 인용에 달려 있습니다.
정기적으로 실행하기
`answer()`를 cron으로 감싸고 브리프마다 날짜가 붙은 파일을 씁니다. 같은 LiveDoc에 출처가 쌓여 4주차에는 1~3주차 증거로 답할 수 있습니다.
LiveDoc 건너뛰기
이미 데이터베이스가 있다면 chat 답변과 추출 페이지를 거기에 저장하세요. LiveDoc 단계는 검색을 위한 것이지 기본 저장소가 아닙니다.
더 알아보기
이 레시피의 배경이 되는 참고 페이지와 다음에 볼 곳.