광고 자리 모집 중 · 제휴 문의

개발자가 Poe에서 사용자 지정 모델을 배포하기 위해 API 기반 서버 봇을 구축하고 호스팅하는 방법

365Finds Editorial
Wiki 문서 11,430편 수록

내 AI에서 365 Wiki 사용하기

아래 프롬프트를 복사해 평소 사용하는 AI에 붙여넣고 바로 질문하세요.

전체 Skill 다운로드

먼저 프롬프트로 체험해 보세요. 365 Wiki를 자주 쓴다면 전체 365Wiki Skill을 설치해 매번 붙여넣는 수고를 줄일 수 있습니다. 평소 쓰는 AI가 없다면 Gemini나 Microsoft Copilot 웹 버전도 사용할 수 있습니다.

Poe Server Bots를 사용하면 개발자는 Server-Sent Events (SSE) 기반의 표준화된 HTTP 프로토콜을 사용하여 외부 컴퓨팅 인프라, 사용자 지정 머신 러닝 모델 및 독점 로직을 Quora의 Poe 플랫폼에 직접 연결할 수 있습니다. 사용자 지정 시스템 프롬프트가 있는 Poe의 호스팅된 상용 모델에 의존하는 표준 프롬프트 봇과 달리, 서버 봇은 엔지니어링 팀에게 백엔드 추론 엔진, 비공개 가중치(private weights), 검색 증강 생성(RAG) 파이프라인 및 외부 API 통합에 대한 완전한 제어권을 제공합니다. 경량 fastapi_poe Python 라이브러리로 사용자 지정 모델을 래핑하고 공개적으로 접근할 수 있는 엔드포인트에 서비스를 배포함으로써 개발자는 독점적인 AI 도구를 웹, iOS, Android 및 데스크톱 앱을 통해 Poe의 글로벌 사용자 기반에 즉시 배포할 수 있습니다.

아키텍처 및 Poe Server Bot 프로토콜

Poe와 사용자 지정 백엔드 간의 통신은 HTTPS를 통한 비동기 클라이언트-서버 모델을 따릅니다. 사용자가 Poe의 서버 봇에 메시지를 보내면 Poe 인프라는 메시지 컨텍스트를 지정된 서버 엔드포인트로 HTTP POST 요청으로 전달합니다. 서버는 들어오는 페이로드를 처리하고 Server-Sent Events (SSE)를 사용하여 생성된 응답을 Poe로 스트리밍합니다. 이 아키텍처는 짧은 지연 시간을 보장하고 최종 사용자에게 실시간 토큰 스트리밍을 제공합니다.

프로토콜 사양은 몇 가지 이벤트 및 요청 유형을 표준화합니다:

요청을 인증하고 승인되지 않은 트래픽으로부터 백엔드를 보호하기 위해 Poe는 Access Key를 발급합니다. 서버는 수신되는 모든 요청과 함께 전송되는 Authorization: Bearer <access_key> 헤더에 대해 이 키를 검증합니다.

ComponentRole in Server Bot WorkflowKey Configuration / Method
fastapi_poeFastAPI 및 Starlette 위에 Poe 프로토콜을 구현하는 Python SDKfp.make_app(), fp.run()
PoeBot봇 동작 및 이벤트 핸들러를 정의하는 기본 클래스get_response(), get_settings()
Poe Gateway사용자 입력을 릴레이하고 엔드포인트의 응답성을 확인합니다.https://poe.com/create_bot?server=1
Inference Server모델 가중치 호스팅 (예: vLLM, TGI, Ollama 또는 사용자 지정 PyTorch)비동기 스트리밍 생성기
Access KeyPoe에서 들어오는 HTTP POST 호출을 인증합니다.make_app()에 전달되는 시크릿 토큰

개발 환경 설정하기

공식 fastapi_poe 라이브러리는 규정을 준수하는 서버 봇을 구현하는 가장 빠른 경로를 제공합니다. HTTP 파싱, 이벤트 직렬화 및 인증을 확장 가능한 비동기 인터페이스로 추상화합니다.

먼저 Uvicorn과 같은 ASGI 서버와 함께 fastapi-poe를 설치합니다:

pip install fastapi-poe uvicorn

가장 단순한 형태의 서버 봇은 PoeBot을 서브클래싱하고 get_response 제너레이터를 구현합니다:

import fastapi_poe as fp
from typing import AsyncIterable

class EchoBot(fp.PoeBot):
    async def get_response(
        self, request: fp.QueryRequest
    ) -> AsyncIterable[fp.PartialResponse]:
        last_message = request.query[-1].content
        yield fp.PartialResponse(text=f"Received: {last_message}")

    async def get_settings(
        self, setting: fp.SettingsRequest
    ) -> fp.SettingsResponse:
        return fp.SettingsResponse(
            introduction_message="Welcome! This bot is running on a custom backend.",
            allow_attachments=False
        )

bot = EchoBot()
app = fp.make_app(bot, access_key="YOUR_SECRET_ACCESS_KEY")

if __name__ == "__main__":
    fp.run(bot, access_key="YOUR_SECRET_ACCESS_KEY", port=8080)

로컬 프로토타이핑 중에 ngrok 또는 Cloudflare Tunnels와 같은 터널링 도구를 사용하여 로컬 포트(예: 8080)를 퍼블릭 인터넷에 노출할 수 있습니다:

ngrok http 8080

이렇게 하면 즉각적인 테스트를 위해 Poe의 봇 등록 인터페이스에 입력할 수 있는 임시 공개 HTTPS URL(예: https://abcdef123.ngrok-free.app)이 생성됩니다.

사용자 지정 모델 및 추론 파이프라인 배포

서버 봇을 사용자 지정 모델에 연결하려면 수신되는 QueryRequest 메시지를 추론 엔진에 연결하고 생성된 토큰을 PartialResponse 객체로 스트리밍 출력해야 합니다.

vLLM 또는 Hugging Face 추론 백엔드와 통합하기

전용 GPU 하드웨어에서 공개 가중치 모델(예: Llama 3, Mistral 또는 Qwen)을 실행할 때 vLLM 또는 Hugging Face Text Generation Inference (TGI)와 같이 최적화된 엔진을 통해 서비스하면 높은 처리량과 연속 배치 처리(continuous batching)가 제공됩니다.

다음 예제는 OpenAI 호환 vLLM 추론 서버에 요청을 전달하는 Poe 서버 봇을 보여줍니다:

import os
import fastapi_poe as fp
from openai import AsyncOpenAI
from typing import AsyncIterable

# Connect to local or remote vLLM endpoint
client = AsyncOpenAI(
    base_url=os.environ.get("VLLM_BASE_URL", "http://localhost:8000/v1"),
    api_key=os.environ.get("VLLM_API_KEY", "EMPTY"),
)

class CustomModelBot(fp.PoeBot):
    async def get_response(
        self, request: fp.QueryRequest
    ) -> AsyncIterable[fp.PartialResponse]:
        # Convert Poe conversation history to chat messages
        messages = []
        for message in request.query:
            role = "user" if message.role == "user" else "assistant"
            messages.append({"role": role, "content": message.content})

        try:
            stream = await client.chat.completions.create(
                model="meta-llama/Meta-Llama-3-8B-Instruct",
                messages=messages,
                stream=True,
                temperature=0.7,
                max_tokens=1024,
            )

            async for chunk in stream:
                token = chunk.choices[0].delta.content
                if token:
                    yield fp.PartialResponse(text=token)

        except Exception as e:
            yield fp.ErrorResponse(
                text=f"An error occurred during inference: {str(e)}",
                allow_retry=True
            )

    async def get_settings(
        self, setting: fp.SettingsRequest
    ) -> fp.SettingsResponse:
        return fp.SettingsResponse(
            introduction_message="Powered by a custom open-source model running on dedicated infrastructure.",
            enable_image_comprehension=False,
            allow_attachments=False
        )

bot = CustomModelBot()
app = fp.make_app(bot, access_key=os.environ.get("POE_ACCESS_KEY"))

다중 턴 컨텍스트 및 첨부 파일 처리

Poe는 request.query 배열에 전체 대화 기록을 연대순으로 전송합니다. 사용자 지정 모델에 제한된 컨텍스트 창이 있는 경우 서버 봇 로직은 토큰화 전에 이전 턴을 가지치기하거나 요약해야 합니다.

봇이 get_settings에서 allow_attachments=True를 활성화하면 파일 업로드(이미지, PDF, 텍스트 문서)가 request.query[-1].attachments에 나타납니다. 각 첨부 파일 개체에는 다운로드 URL과 MIME 유형이 포함되어 있어 백엔드에서 응답을 생성하기 전에 자산을 다운로드하거나, OCR을 수행하거나, 비전 인코딩을 실행하거나, 문서를 벡터 저장소에 임베드할 수 있습니다.

서버 봇 호스팅 옵션

Poe는 SSE 응답을 스트리밍할 수 있는 중단 없는 HTTPS 엔드포인트가 필요하므로 적절한 호스팅 플랫폼을 선택하는 것은 모델 크기, 컴퓨팅 요구 사항 및 예산에 따라 다릅니다.

Modal을 사용한 서버리스 GPU 배포

Modal은 Poe 서버 봇에 대한 일급 지원을 제공하여 개발자가 GPU 인프라를 코드로 정의하고 실제 실행 시간에 대해서만 비용을 지불할 수 있도록 합니다. Modal은 컨테이너 인스턴스를 0부터 자동으로 확장하고 HTTPS URL을 제공합니다.

프로덕션에 바로 사용할 수 있는 Modal 배포 스크립트:

import os
import modal
import fastapi_poe as fp

app = modal.App("poe-custom-model-bot")

# Define container environment with dependencies
image = (
    modal.Image.debian_slim()
    .pip_install("fastapi-poe", "openai")
)

@app.function(
    image=image,
    secrets=[modal.Secret.from_name("poe-custom-model-secrets")],
    keep_warm=1,  # Keeps one instance ready to prevent cold starts
)
@modal.asgi_app()
def fastapi_app():
    from bot_implementation import CustomModelBot
    bot = CustomModelBot()
    return fp.make_app(bot, access_key=os.environ["POE_ACCESS_KEY"])

modal deploy app.py로 이 서비스를 배포하면 다음과 같은 영구적인 URL이 출력됩니다: https://<organization>--poe-custom-model-bot-fastapi-app.modal.run.

클라우드 제공업체 (AWS, GCP, Render, Fly.io)의 컨테이너 호스팅

독점적인 추론 클러스터를 실행하거나 관리형 컨테이너 플랫폼을 활용하는 팀의 경우:

  1. 애플리케이션 도커화: uvicorn app:app --host 0.0.0.0 --port 8080 --workers 4를 실행하는 경량 Dockerfile을 만듭니다.
  2. 리버스 프록시 및 SSL: 수명이 긴 HTTP 연결과 청크 스트리밍 응답을 지원하는 수신 컨트롤러(예: AWS ALB, Cloudflare 또는 Nginx) 뒤에 배포합니다. 스트림 중간 연결 끊김을 방지하려면 프록시 시간 제한(예: proxy_read_timeout)을 최소 300초로 설정해야 합니다.
  3. 환경 시크릿: 컨테이너 환경 변수를 통해 POE_ACCESS_KEY 및 추론 자격 증명을 안전하게 주입합니다.

Poe에서 봇 등록 및 구성하기

서버가 배포되고 공개 HTTPS를 통해 접근 가능하게 되면 Poe 플랫폼에서 등록을 완료합니다:

  1. poe.com/create_bot?server=1 로 이동합니다.
  2. 봇 핸들: 고유한 영숫자 식별자(예: @MyCustomModel)를 선택합니다. 이것은 봇의 공개 링크를 형성합니다.
  3. 봇 유형: "Server bot"이 선택되어 있는지 확인합니다.
  4. 서버 URL: 전체 공개 엔드포인트(예: https://your-domain.com/ 또는 Modal 배포 URL)를 입력합니다.
  5. 액세스 키 (Access Key): 서버의 fp.make_app() 호출에 구성된 시크릿 토큰을 붙여넣습니다. Poe는 매 테스트 요청마다 이 토큰을 유효성 검사합니다.
  6. 프로필 세부 정보: 사용자에게 표시되는 표시 이름, 설명, 아바타 및 시스템 지침을 설정합니다.
  7. 가시성: 봇을 비공개(본인 또는 지정된 팀원만 액세스 가능)로 유지할지 공개(Poe Explore 디렉토리에서 검색 가능)로 설정할지 선택합니다.

Create Bot을 클릭합니다. Poe는 엔드포인트에 SettingsRequest를 발행하여 즉시 연결성을 확인합니다. 서버가 유효한 응답을 반환하면 봇이 활성화됩니다.

수익화 및 컴퓨팅 포인트 경제학

Poe는 서버 봇에 대해 네이티브 크리에이터 수익화를 제공하여 사용자가 도구와 상호 작용할 때 개발자가 수익을 창출할 수 있도록 합니다.

메시지당 가격 및 봇 수익화 API

크리에이터는 봇 설정에서 메시지당 고정된 컴퓨팅 포인트 비용을 설정하거나 봇 수익화 API를 활용하여 사용량 기반의 동적 청구를 할 수 있습니다:

# Setting dynamic rate cards in SettingsResponse
async def get_settings(self, setting: fp.SettingsRequest) -> fp.SettingsResponse:
    return fp.SettingsResponse(
        introduction_message="Professional analysis bot with dynamic compute points.",
        cost_label="50-200 pts",
        rate_card="* Base Query: 50 points\n* Extended Analysis: 150-200 points"
    )

프로덕션 모범 사례

안정적인 서버 봇을 배포하려면 네트워크 변동성, 지연 시간 예산 및 운영 원격 분석을 해결해야 합니다: