Felo API PlatformFelo API Platform

지원

자신의 문서로 지원 질문에 답하기

LiveDoc을 만들고 헬프 센터와 내부 runbook을 읽어 들인 뒤 티켓에 답할 구절을 검색하고 그 증거만으로 모델이 답하게 합니다.

소요 시간20분난이도초급업데이트2026-10-29
대상지원 팀고객 성공Helpdesk 빌더

프롬프트 복사

대괄호 항목을 바꾼 뒤 Claude Code, Codex 또는 터미널에 접근할 수 있는 AI에 붙여넣으세요. Felo 스킬을 설치하고 크레딧을 쓰기 전에 확인한 뒤 워크플로를 실행합니다.

우리 문서만 사용해 이 지원 질문에 답해 주세요: [고객 질문].

지식 베이스: [헬프 센터 URL 또는 LiveDoc short_id]. 에스컬레이션 경로: [담당자 또는 큐].
사용 가능한 고객 컨텍스트: [플랜, 지역, 제품] (비밀번호나 결제 데이터를 요구하지 마세요).

다음을 작성해 주세요.
1. 두세 문장의 직접 답변.
2. 근거가 되는 문서 구절, 리소스 제목 포함.
3. 고객의 다음 단계.
4. 내부 메모: 사용한 리소스와 관련도 점수.

규칙:
- 검색된 구절만 근거로 답하세요. 결과가 없거나 관련도가 낮으면 에스컬레이션하고 절대 추측하지 마세요.
- 정책, 환불, 가격, 계정 작업을 지어내지 마세요.
- 고객의 비공개 데이터, 자격 증명, 결제 정보를 가져오지 마세요.
- 수집이나 검색에 크레딧을 쓰기 전에 먼저 물어보세요.
- 답변을 고객에게 보내지 말고 검토용으로 저에게 반환하세요.

복사 내용에는 설치 단계와 안전 규칙도 포함됩니다.

완성되는 것

실행 시 예제 출력입니다. 실시간 생성이 아닙니다.

답변 예시(발췌)

답변: 플랜은 매월 1일에 갱신됩니다. 카드 결제가 실패하면 3일 동안 재시도한 뒤 시트가 일시 중지됩니다.

출처: “결제 자주 묻는 질문” - https://example.com/help/billing

여기서 다루지 않으면: 인보이스 ID와 함께 결제 큐로 에스컬레이션하세요.

실제 호출

개발자용: 같은 워크플로를 실행 순서대로 담은 복사 가능한 코드.

실제 API 호출 보기
  1. 지식 베이스 만들기

    LiveDoc API로 지식 베이스를 만들고 short_id를 저장합니다.

    support.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 LiveDocData = { data: { short_id: string } };
    
    const kb = await felo<LiveDocData>("/v2/livedocs", {
      name: "Support knowledge base",
      description: "Help center, policy pages, and internal runbooks",
    });
    
    const kbId = kb.data.short_id; // save this in your config

    예제 출력

    {
      "short_id": "PvyKouzJirXjFdst4uKRK3",
      "name": "Support knowledge base",
      "description": "Help center, policy pages, and internal runbooks"
    }
  2. 공개 헬프 센터 읽어 들이기

    헬프 센터 URL을 리소스로 LiveDoc에 추가합니다.

    support.ts
    type UrlResult = {
      data: {
        url: string;
        status: string;
        fail_reason: string | null;
        resource_id: string | null;
      }[];
    };
    
    const added = await felo<UrlResult>(
      `/v2/livedocs/${kbId}/resources/urls`,
      {
        urls: [
          "https://example.com/help/getting-started",
          { url: "https://example.com/help/billing", title: "Billing FAQ" },
        ],
      },
    );
    
    const failed = added.data.filter((item) => item.status === "failed");

    예제 출력

    [
      { "url": "https://example.com/help/getting-started", "status": "success", "resource_id": "res_003" },
      { "url": "https://example.com/help/billing", "status": "existed", "resource_id": "res_004" }
    ]
  3. 비공개 문서 추가하기

    내부 runbook을 문서 리소스로 추가합니다.

    support.ts
    type ResourceData = { data: { id: string } };
    
    const runbook = `# Refund policy
    
    Refunds are available within 30 days of purchase. Requests after 30 days
    need a manual review by the billing team.
    `;
    
    const policy = await felo<ResourceData>(
      `/v2/livedocs/${kbId}/resources/doc`,
      { title: "Refund policy", content: runbook },
    );
    
    console.log(policy.data.id); // use this for updates
  4. 질문 관련 증거 검색하기

    시맨틱 검색으로 가장 관련 있는 구절과 점수를 가져옵니다.

    support.ts
    type Hit = { id: string; title: string; content: string; score: number };
    
    async function findEvidence(question: string) {
      const res = await felo<{ data: Hit[] }>(
        `/v2/livedocs/${kbId}/resources/retrieve`,
        { query: question },
      );
      return res.data.filter((hit) => hit.score >= 0.7).slice(0, 4);
    }
    
    const question = "Can I get a refund after 45 days?";
    const hits = await findEvidence(question);

    예제 출력

    [
      {
        "id": "res_005",
        "title": "Refund policy",
        "content": "Refunds are available within 30 days of purchase…",
        "score": 0.92
      }
    ]
  5. 증거만으로 답하기

    모델이 검색된 구절만 쓰게 하고 히트가 없으면 에스컬레이션하게 합니다.

    support.ts
    type Completion = {
      choices: { message: { content: string | null } }[];
      usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number };
    };
    
    const context = hits
      .map((hit) => `### ${hit.title}\n${hit.content}`)
      .join("\n\n");
    
    const completion = await felo<Completion>("/api/v1/chat/completions", {
      model: "anthropic/claude-haiku-5.5",
      messages: [
        {
          role: "system",
          content:
            "Answer only from the context. If the context does not cover the question, say so and hand the ticket to a human.",
        },
        {
          role: "user",
          content: `Context:\n${context}\n\nQuestion: ${question}`,
        },
      ],
    });
    
    console.log(completion.choices[0].message.content);
    console.log(completion.usage.total_tokens);

    예제 출력

    "No. The Refund policy says refunds are available within 30 days of purchase, so a request at 45 days needs a manual review by the billing team."

포함되는 것

  • 헬프 센터와 내부 runbook으로 만든 LiveDoc
  • 구절과 제목이 있는 시맨틱 검색
  • 출처를 인용할 수 있는 답변
  • 문서에 없을 때 명확한 에스컬레이션

하지 않는 것

  • 자신의 문서에서만 답하고 오픈 웹을 보지 않음
  • 계정 작업, 환불, 플랜 변경은 하지 않음
  • 비공개 고객 데이터나 자격 증명을 지식 베이스에 넣지 않음
  • 문서가 오래되면 답변도 오래됨. 정기 갱신 필요
  • 답변 초안만 만들고 고객에게 보내지 않음

자주 묻는 질문

답변은 어디서 오나요?

구축한 LiveDoc의 헬프 센터 페이지와 runbook에서만 옵니다. 검색이 구절을 반환하고 agent가 그 구절로 답변을 씁니다.

문서에 없으면?

에스컬레이션합니다. 히트가 없거나 관련도가 낮으면 미커버로 보고 모델이 추측하지 않게 합니다.

지식 베이스를 최신으로 유지하려면?

정책이 바뀌면 URL과 문서 리소스를 다시 추가하거나 갱신합니다. 워크플로에 갱신과 감사 명령이 포함됩니다.

티켓 큐에 넣을 수 있나요?

네, 초안 단계로 쓸 수 있습니다. 고객에게 보내기 전 사람 승인을 남기세요.

계정별 질문도 처리하나요?

문서만으로는 안 됩니다. 계정 데이터는 자체 시스템에 있습니다. agent에 필요한 안전한 맥락만 넘기고 자격 증명은 절대 넘기지 마세요.

한 번 비용은?

읽기와 검색은 사용량 기반 크레딧입니다. 현재 요금은 가격 페이지에 있고 프롬프트는 쓰기 전에 승인을 요청합니다.

관련 워크플로

내 방식으로 바꾸기

같은 레시피를 실제 배포 방식에 맞게 조정합니다.

한 제품 라인만 읽기

범위를 한 제품으로 좁히면 지식 베이스가 깨끗해집니다.

티켓 분류 추가하기

답변 전 질문 유형을 분류하고 해당 문서를 검색합니다.

정기 감사

월 1회 끊긴 링크와 오래된 정책을 확인합니다.

이 레시피의 배경이 되는 참고 페이지와 다음에 볼 곳.