Jak zbudować aplikację Character AI: architektura, kod i rachunek kosztów

Updated 2026-07-15

Aplikacja Character AI to cztery komponenty podpięte do endpointu czatu kompatybilnego z OpenAI: system prompt persony, warstwa pamięci, bramka moderacji i router modeli. Możesz wypuścić działający prototyp w mniej niż 200 liniach Pythona i prowadzić go za dobrze poniżej dolara na miesięcznie aktywnego użytkownika przy odpowiednim doborze modeli.

Krótka odpowiedź: architektura czterech komponentów

Nie musisz trenować ani fine-tunować modelu. Każda poważna aplikacja-towarzysz na rynku dzisiaj, łącznie z tymi obsługującymi miliony użytkowników, to cienka warstwa orkiestracji nad hostowanymi API LLM. Postać żyje w prompcie i bazie danych, nie w wagach. Reszta tego przewodnika buduje każdy komponent z działającym kodem na standardowym endpoincie kompatybilnym z OpenAI, a potem przechodzi przez rachunek tokenów, żebyś wiedział, ile faktycznie kosztuje miesięcznie aktywny użytkownik, zanim wystartujesz.

  • Prompt persony: ustrukturyzowany system prompt (500 do 1000 tokenów), który definiuje, kim jest postać i jak mówi.
  • Pamięć: przesuwane okno ostatnich tur plus okresowo odświeżane podsumowanie, żeby rozmowy przetrwały poza limit kontekstu.
  • Moderacja: bramka wiekowa, klasyfikator wejścia i polityki treści dopasowane do modelu, do którego routujesz.
  • Routing: mała funkcja, która wybiera tani model do swobodnego czatu i mocniejszy do długich scen.

Komponent 1: prompt persony

Prompt persony to produkt. To wiadomość systemowa wysyłana z każdym zapytaniem, zazwyczaj zawierająca pięć części: tożsamość (imię, wiek, historia), cechy osobowości, styl mówienia z dwiema lub trzema przykładowymi liniami, twarde zasady zachowania (nigdy nie wypadaj z roli, trzymaj odpowiedzi poniżej limitu długości) i aktualny scenariusz. Trzymaj go między 500 a 1000 tokenów. Krótsze persony dryfują; dużo dłuższe zużywają budżet wejściowy przy każdej pojedynczej wiadomości i rzadko poprawiają wierność roli. Przechowuj persony jako wiersze w swojej bazie danych, żeby użytkownicy mogli tworzyć i edytować postacie, co jest głównym cyklem produktów w stylu Character.AI. Oto pełne zapytanie. Ten sam kształt działa z każdym backendem kompatybilnym z OpenAI; ten przykład używa endpointu gateway z wieloma modelami, więc możesz zamieniać modele, zmieniając jeden string:

curl https://api.apisrouter.com/v1/chat/completions \
  -H "Authorization: Bearer $KEAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-v4-flash",
    "messages": [
      {"role": "system", "content": "You are Mira, a sarcastic starship engineer in her 30s. Personality: dry wit, fiercely loyal, hates small talk. Speech style: short technical sentences, occasional teasing. Example: \"The coupling is fried. Again. Did you touch it?\" Rules: never break character, never mention being an AI, keep replies under 120 words."},
      {"role": "user", "content": "Mira, the reactor is making that noise again."}
    ],
    "temperature": 0.9,
    "max_tokens": 300,
    "stream": true
  }'

Komponent 2: pamięć, która przetrwa długie rozmowy

Sesje w aplikacjach-towarzyszach trwają długo. Trójwarstwowy stos pamięci utrzymuje kontekst spójny bez wysyłania całej historii za każdym razem: Warstwa 1 to przesuwane okno: ostatnie 10 do 14 surowych tur, wysyłane dosłownie. Warstwa 2 to bieżące podsumowanie: co jakieś 20 tur tani model kompresuje starsze wiadomości do akapitu śledzącego imiona, stan relacji i otwarte wątki fabularne. Warstwa 3 to przypięte fakty: trwałe szczegóły o użytkowniku (imię, preferencje, przeszłe wydarzenia, które postać powinna pamiętać), wyodrębnione do Twojej bazy danych i wstrzykiwane jako krótka wiadomość systemowa. Oto cała implementacja w Pythonie z oficjalnym SDK OpenAI:

Realistyczny budżet wejściowy na zapytanie mieści się w okolicach 3300 tokenów.
Slot kontekstuTypowy rozmiarCzęstotliwość odświeżania
System prompt persony500 do 1000 tokenówStatyczny na postać
Przypięte fakty użytkownika100 do 200 tokenówPrzy zdarzeniach ekstrakcji
Bieżące podsumowanie300 do 500 tokenówCo ~20 tur
Przesuwane okno (12 tur)~1800 do 2200 tokenówPrzy każdej wiadomości
Nowa wiadomość użytkownika~100 tokenówPrzy każdej wiadomości
from openai import OpenAI

client = OpenAI(
    api_key="sk-...",
    base_url="https://api.apisrouter.com/v1",
)

def build_context(persona, summary, pinned_facts, recent_turns, user_msg):
    facts = "\n".join(f"- {f}" for f in pinned_facts)
    return [
        {"role": "system", "content": persona},
        *([{"role": "system", "content": f"Facts to remember:\n{facts}"}]
          if pinned_facts else []),
        *([{"role": "system", "content": f"Story so far: {summary}"}]
          if summary else []),
        *recent_turns[-12:],
        {"role": "user", "content": user_msg},
    ]

def refresh_summary(old_turns, prev_summary):
    prompt = (
        "Update this running summary of a roleplay chat. Keep names, "
        "relationship state, and open plot threads. Max 150 words.\n\n"
        f"Current summary: {prev_summary}\n\nNew messages: {old_turns}"
    )
    resp = client.chat.completions.create(
        model="deepseek-v4-flash",
        messages=[{"role": "user", "content": prompt}],
        max_tokens=400,
    )
    return resp.choices[0].message.content

Komponent 3: moderacja i polityki treści

Moderacja w aplikacji-towarzyszu ma trzy odrębne zadania, a mylenie ich to najczęstszy błąd przy starcie. Po pierwsze, ogranicz swoją publiczność. Jeśli Twoja aplikacja dopuszcza dojrzałe motywy fikcyjne, umieść je za bramką wiekową dla dorosłych i zachowaj osobny domyślny tryb dla wszystkich grup wiekowych. Zarówno App Store, jak i Play Store sprawdzają to przy recenzji, a procesorzy płatności też zwracają na to uwagę. Po drugie, przesiewaj wejścia. Uruchom tani przebieg klasyfikatora na wiadomościach użytkownika, zanim dotrą do modelu postaci, blokując kategorie, których żaden dostawca nie dopuszcza: treści z udziałem osób niepełnoletnich, wiarygodną realną szkodę i nielegalne instrukcje. Pojedyncze wywołanie deepseek-v4-flash z rubryką tak/nie kosztuje ułamek centa i dodaje mniej niż sekundę opóźnienia. Po trzecie, dopasuj politykę treści do modelu. Dostawcy różnią się w kwestii fikcji: opublikowana polityka xAI wprost dopuszcza dojrzałe motywy fikcyjne dla dorosłych użytkowników, DeepSeek i inne modele wywodzące się z otwartych wag są faworytami społeczności do roleplayu, bo ich hostowane polityki są elastyczne wobec fikcji, podczas gdy polityka Anthropic zabrania treści jednoznacznych, co czyni Claude właściwym wyborem tylko do twórczego pisania dla wszystkich grup wiekowych. Zrozumienie tych polityk, zanim zaczniesz routować ruch, oszczędza Ci burz odmów na produkcji. Cokolwiek zbudujesz, musi respektować regulamin każdego dostawcy, którego wywołujesz.

Komponent 4: routing modeli i macierz wyboru

Większość wiadomości w aplikacji-towarzyszu to krótkie swobodne tury, z którymi budżetowy model radzi sobie doskonale. Mniejszość to długie emocjonalne sceny albo kreatywne popisy, gdzie jakość prozy jest produktem. Routing według głębokości sceny drastycznie obniża koszty, a użytkownicy tego nie zauważają:

Dopasuj każdą trasę do modelu, którego polityka treści pasuje do obsługiwanej publiczności.
ModelID modelu APIStawka za 1M tokenów (wejście/wyjście)Dopasowanie do aplikacji-towarzysza
DeepSeek V4 Flashdeepseek-v4-flash$0.126 / $0.252Domyślny model czatu. Faworyt społeczności do roleplayu, najlepsza wartość w katalogu.
DeepSeek V4 Prodeepseek-v4-pro$0.3915 / $0.783Dłuższe sceny, mocniejsze podążanie za instrukcjami, wciąż tanio.
GLM-5glm-5$0.514 / $2.314Opcja budżetowa z mocnym twórczym pisaniem.
Kimi K2.6kimi-k2.6Zobacz /pricingOpcja budżetowa do sesji z długim kontekstem. MiMo to podobna opcja budżetowa.
grok-4.5grok-4.5$1.60 / $4.80Dojrzałe motywy fikcyjne dla dorosłych użytkowników zgodnie z opublikowaną polityką xAI. Okno kontekstu 500K.
Claude Sonnet 4.6claude-sonnet-4-6$2.40 / $12.00Najwyższa jakość prozy. Tylko twórcze pisanie dla wszystkich grup wiekowych; Anthropic zabrania treści jednoznacznych.
Gemini 3.5 Flashgemini-3.5-flash$1.20 / $7.20Szybki, dobry do funkcji wymagających obrazu, jak reakcje awatara.
ROUTES = {
    "casual": "deepseek-v4-flash",
    "scene": "deepseek-v4-pro",
    "prose": "claude-sonnet-4-6",  # tylko twórcze pisanie dla wszystkich grup wiekowych
}

def pick_model(user_msg: str, turns_in_scene: int) -> str:
    if turns_in_scene > 6 or len(user_msg) > 400:
        return ROUTES["scene"]
    return ROUTES["casual"]

Ile faktycznie kosztuje miesięcznie aktywny użytkownik

Rachunek tokenów przed startem jest lepszy niż niespodzianka na fakturze po. Przy budżecie kontekstu z tabeli pamięci: około 3300 tokenów wejściowych i 250 tokenów wyjściowych na wiadomość. Użytkownicy aplikacji-towarzyszy są intensywni; liczby zgłaszane przez społeczność stawiają zaangażowanych użytkowników na dziesiątkach wiadomości dziennie, więc załóż około 40 wiadomości dziennie przez 20 aktywnych dni, czyli około 800 wiadomości na MAU miesięcznie. To daje 2,64M tokenów wejściowych i 0,2M tokenów wyjściowych na MAU miesięcznie. Mnożąc przez stawki katalogowe:

Zakłada 3300 tokenów wejściowych + 250 wyjściowych na wiadomość, ~800 wiadomości na MAU miesięcznie.
ModelKoszt wejścia / MAUKoszt wyjścia / MAURazem / MAU / miesiąc
deepseek-v4-flash$0.33$0.05$0.38
deepseek-v4-pro$1.03$0.16$1.19
glm-5$1.36$0.46$1.82
gemini-3.5-flash$3.17$1.44$4.61
grok-4.5$4.22$0.96$5.18
claude-sonnet-4-6$6.34$2.40$8.74
gpt-5.5$10.56$4.80$15.36

Jeden endpoint na każdy model z macierzy

Zakładanie pięciu kont u dostawców, żeby uruchomić jeden router, to realny narzut: pięć kluczy, pięć paneli rozliczeniowych, pięć zestawów limitów zapytań. Gateway z wieloma modelami to upraszcza. APIsRouter udostępnia każdy model powyżej przez jeden kompatybilny z OpenAI base URL https://api.apisrouter.com/v1, więc fragment kodu routera działa bez zmian, zmieniając tylko string modelu. Rozliczenie jest pay-as-you-go bez subskrypcji, modele globalne działają 20% poniżej oficjalnych cen, modele chińskie poniżej ich oficjalnych stawek, a checkout bez rejestracji na /topup wysyła klucz na Twój e-mail po płatności, przy czym pierwsza wpłata dodaje +100% salda. GET /v1/models z Twoim kluczem zwraca aktualną listę modeli, co też przydaje się do wypełnienia selektora modelu we własnym panelu admina.

Wskazówki produkcyjne, które oszczędzają realne pieniądze i ból głowy

  • Streamuj wszystko. Czas do pierwszego tokena to metryka, którą czują użytkownicy; streamowana odpowiedź po 2 sekundach wydaje się szybsza niż kompletna odpowiedź po 4.
  • Trzymaj stabilny prefiks stabilnym. Persona i przypięte fakty powinny być identyczne co do bajtu między zapytaniami, żeby backendy wspierające cachowanie prefiksu mogły z tego skorzystać.
  • Ogranicz max_tokens na trasę. Swobodne tury rzadko potrzebują więcej niż 300 tokenów wyjściowych; nieograniczony model, który się rozwleka, podwaja Twój rachunek za wyjście.
  • Loguj koszt na użytkownika, nie tylko na zapytanie. Niewielki odsetek intensywnych użytkowników zdominuje wydatki; musisz ich widzieć, żeby zaprojektować sprawiedliwe poziomy użycia.
  • Wbuduj fallback w router. Jeśli główny model przekroczy czas albo odmówi, spróbuj raz z modelem siostrzanym, zanim pokażesz błąd.
  • Przycinaj przesuwane okno według tokenów, nie tur, żeby jedna długa wklejka nie wysadziła budżetu.
  • Obsługuj odmowy w roli. Zmapuj odmowę na eleganckie odchylenie w ramach historii, zamiast pokazywać surowy tekst API.
  • Nie przechowuj surowych czatów dłużej niż to konieczne i napisz o tym w polityce prywatności. Logi czatów towarzysza są z natury wrażliwe.

Częste pytania

Ile kosztuje zbudowanie aplikacji Character AI?

Koszt developmentu to głównie Twój czas: działający prototyp to projekt na weekend, bo nie ma w to zaangażowanego trenowania modelu. Koszt działania to prawdziwa liczba i skaluje się z użyciem. Na budżetowym modelu jak deepseek-v4-flash intensywny miesięcznie aktywny użytkownik kosztuje w tokenach około $0.38; na modelu premium jak gpt-5.5 ten sam użytkownik kosztuje około $15. To wybór modelu, nie infrastruktura, decyduje o Twojej marży.

Który model AI jest najlepszy do aplikacji Character AI?

Rodzina DeepSeek V4 to faworyt społeczności do roleplayu i najlepsza wartość: Flash do swobodnego czatu, Pro do dłuższych scen. GLM-5, Kimi K2.6 i MiMo to solidne opcje budżetowe. Grok pasuje do aplikacji obsługujących dojrzałe motywy fikcyjne dla dorosłych, zgodnie z opublikowaną polityką xAI. Claude Sonnet 4.6 pisze najlepszą prozę, ale nadaje się tylko do twórczego pisania dla wszystkich grup wiekowych, bo Anthropic zabrania treści jednoznacznych.

Jak aplikacje Character AI pamiętają poprzednie rozmowy?

Przez inżynierię promptów, nie przez pamięć modelu. Aplikacja ponownie wysyła przesuwane okno ostatnich wiadomości, okresowo skompresowane podsumowanie starszych, i krótką listę przypiętych faktów wyodrębnionych do bazy danych. Sam model jest bezstanowy; każde zapytanie zawiera wszystko, co postać "pamięta".

Czy muszę trenować własny model, żeby zbudować aplikację-towarzysza AI?

Nie. Fine-tuning jest drogi, wolno się iteruje i jest niepotrzebny do spójności postaci. Dobrze skonstruowany prompt persony na 500 do 1000 tokenów plus warstwa pamięci osiąga wierność roli, której użytkownicy nie odróżnią od własnego modelu, i pozwala Ci swobodnie zamieniać bazowy model, gdy pojawią się lepsze.

Jak radzić sobie z dojrzałymi treściami w aplikacji-towarzyszu?

Traktuj to jako problem dopasowania polityki. Umieść dojrzałe motywy fikcyjne za bramką wiekową dla dorosłych, przesiewaj wejścia pod kątem kategorii, których żaden dostawca nie dopuszcza, i kieruj ten ruch tylko do modeli, których opublikowane polityki dopuszczają fikcję dla dorosłych, jak Grok pod polityką xAI. Zachowaj domyślny tor dla wszystkich grup wiekowych na bardziej rygorystycznych modelach i przestrzegaj regulaminu każdego dostawcy.

Czy mogę używać SDK OpenAI do aplikacji Character AI z innymi modelami?

Tak. DeepSeek, GLM, Kimi, Gemini, Claude i Grok są wszystkie dostępne przez endpointy kompatybilne z OpenAI, albo bezpośrednio od ich dostawców, albo przez gateway. Kod Twojej aplikacji zostaje na standardowym interfejsie chat.completions i zmienia modele, zmieniając string modelu, co jest dokładnie tym, co czyni routing na wiadomość tanim w budowie.