Галоўная / Артыкулы

Перанос чатовага цыклу з OpenAI у Claude на Python: адна сторанка змян

Перамясціце цыкл безстановых паведамленняў у API Messages ад Anthropic: параметр вышэйшага рангу, неабяжныя значэння max_tokens, блакі з кантэнтам і строгая чаргаванне ролей.

Выдавец: REACTAPP.TOP4 хв чытання867 слоў

Крыніцы: Part 3 — Call the Claude API in Python (same messages, system on the side)

Кожны, хто пісаў цыкл чату для OpenAI, можа перанесці яго на Claude ад Anthropic за прыблізна адну сторанку змян. Оба прадавцы выкорыстоўваюць аднаковую структуру: спіс messages з пазначэнням ролі, які надаецца цэлы ў кожнай вызове, а адпаведная адпаведзь дадаецца пасля. Перамішваецца толькі адна елемент, і важліва дакладная інформацыя пра тое, якая саме.

Той жа спіс, але іншая сістэма

API Messages у Claude прымея фармат размовы, які вам вядомы: спіс слоўнікаў з пазначэнням role і content; сервер не зберагае стану, і весь спіс надаецца цэлы ў кожны раз. Назвы і значэння ролей ідэнтычныя — user і assistant.

Едынственная структурная разнісць полягаў у тому, што system не ёсць повідомленням. OpenAI розмішчуе інструкціі у першому радку спіску. Anthropic перэмахуе іх у верхній рывень параметра system=, які супроводжуе спіс. У спіску містыцца лішэ рэальній дыялог, коруткі корыстувача і асістэнта, які строго чэрэдуюцца.

import anthropic

client = anthropic.Anthropic()  # key from env

resp = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=300,
    system="You are a concise Python assistant.",
    messages=[
        {
            "role": "user",
            "content": "Why is system a parameter "
                       "here, not a message?",
        },
    ],
)
print(resp.content[0].text)

Дзвеўна меньшыя разніцы выступаюць прытаму, перш чым ўсё гэта запускаецца:

  • max_tokens неабходна задаць. OpenAI дозволяе адправіць запіт без ліміту выходных даных. Claude жадае такі ліміт практычна для кожнага запіту, што ўскладнюе працу, але дапамагае контроліраваць вітраты, адколькі запіт не можа быць адправлены, пакуль не будзе вялікі ліміт часу на адпаведзь.
  • Адпаведзі прыходзяць у вачынку блакоў кантэнту. Уместа адной строкі вы отрымаеце спіс, а чысты тэкст знаходзіцца ў resp.content[0].text. Сегодні гэта здаецца зайвым, але пазней запывы інструментаў таксама прыходзяць у такой жа структуры, таму гэта мае сенс.

Настройка і адна партыя

З’ядзіце SDK за дапамою pip install anthropic, пасля чаго экспортуйце ключ з консолі Anthropic (які пачынаецца з sk-ant-) як ANTHROPIC_API_KEY. Кліент самы ўзяе яго.

Яго можна разместыць па боку вызову OpenAI, і вся разліка — чатыры змены. Метод client.chat.completions.create ператвараецца на client.messages.create, рэяд сістэмы пераводзіцца ў system=, стае обавязковым ліміт выходу, а тэкст чытаецца з content[0].text уместо choices[0].message.content. Прыметка пра SDK: чырговы пакет anthropic не прымае параметра temperature= у методзе messages.create, таму старэйшыя фрагменты коду, якіе яго выкарыстоўваюць, будуць даваць памылкі. Застосоўваецца стандартная процедура выбору даных, і гэта падходзіць для эйх прыкладаў.

Колькасць токенаў паказваецца ў resp.usage.input_tokens і resp.usage.output_tokens. Гэта той самы показнік з лёгка разнымі назвамі полей, і варта ўсё час яго фіксаваць.

Цыкл історыі ў Claude

Ёсць перакладзена функцыя ask() з версіі OpenAI. Логіка дадзення дапамогі і парадачыцы зноў не змянілася. Змяніліся толькі параметры, якія выкалічваюцца ў серэдзіне.

msgs = []

def ask(text: str) -> str:
    msgs.append(
        {"role": "user", "content": text}
    )
    resp = client.messages.create(
        model="claude-sonnet-4-5",
        max_tokens=300,
        system="You are a concise assistant.",
        messages=msgs,  # full history
    )
    reply = resp.content[0].text
    msgs.append(
        {"role": "assistant", "content": reply}
    )
    return reply

print(ask("Define a context window."))
print(ask("Now for a five-year-old."))
print(ask("Which answer was shorter?"))

Трэція запытка ў размове яшчэ раз падтверджае гэты цыкл, адколькі ён можа працаваць толькі тады, калі обе паказваныя раней адказы знаходзяцца ў msgs і прадаюцца зноў. Тыя ж эканамічныя прынцыпы дапраўнае прыменяюцца. Колькісць токенав уводу зрастае з кожным раундам, таму дугія размовы коштаюць больш за адну вызову.

Claude таксама ўскрытлівей да парадку. Паведамленні павінны перыходзіць ад карыстальніка да асістэнта і назад. Два паведамленні ад карыстальніка паспелы, што легка выходзіць, калі неудачны запыт прабуецца зноў, прыводзіць да таго, што Claude адхоўляе вызов, тады як OpenAI гэта толькі тольеруе. Гэта можна вважаць безкоштовным правілам перагляду для таго, хто керуе вашай історыяю.

Запуск

Скрыпт запускае адзін раунд, а потым размову з трыма раундамі, фіксуючы токены уводу і выходу пасля кожнай вызову. Як толькі не хватает ANTHROPIC_API_KEY, ён зупініцца раней з чыткым паведамленнем. Кроме того, ён выконвае рэальныя, платныя запыты, таму трэба ўтрымваць яго праза будзь-якіх запускаў CI.

pip install -r requirements.txt
export ANTHROPIC_API_KEY="sk-ant..."
python examples/part03_claude.py

Чаму порт быў просты, і што вы атрымаеце

Гэта была незначная змяна, адколькі оба прадаўцы выкананыя адно і тое ж кантракт: безстаціонарны канец-пункт, які пры кожнам вызове перадае весь чат і адпавядае раз. Разлік заключаецца ў дыялектах — напрыклад, у месцы розташавання запіту сістэмы, у візуальным выглядзе об’екта адпаведзі і ў тых параметрах, якія неабходны. LangChain абстрагуе гэты слой, а яго класы ChatOpenAI і ChatAnthropic створаны для таго, каб працаваць з чатырывядовым разлікам, які вы ўжо напісалі вручную. Розумеўшы, што абстракція маскуючы, можна розразліць, калі ёю корыстацца, а калі стаць жэртвай яе.

Існуе таксама практычная выгода. Два прадаўцы пад аднай структурой ask() дазваляюць вам адрабатваць модэлі методам A/B тэставання, перэйсці на альтэрнатыўны прадаўца у разы проблем з API, або направляць простыя запытанні да однаго, а складныя — да другога, пры чым не трэба меняць код аплікацыі. API Gemini ад Google таксама выкорыстоўвае такую структуру размовы, але з адной перэназванай роллю: асістэнт называецца model.