🕹️

【Arduino】マイコン(Atom Echo)でClaude3と話そう

2024/04/06に公開

【Atom EchoでClaude3と話そう】

「マイク・スピーカ一体型のマイコンで、ChatGPTと会話できる作品」のソースを製作者のrobo8080さんが公開しています。”この作品を最低限の変更※で、会話先のLLMをChatGPTからClaude3に変更”してみます。どのような作品かはX(Twitter)とGitHubの説明をご覧ください。
※ChatGPTに記述を全て直すことはしません
https://www.switch-science.com/products/6347

作品:M5Unified_AtomEcho_ChatGPT(robo8080さん)

https://twitter.com/robo8080/status/1664960011024441345
https://github.com/robo8080/M5Unified_AtomEcho_ChatGPT

【ChatGPTからClaude3への変更方法】

このソースはArduino-IDE環境ではなく、Platform IO環境でのコンパイルを前提としているので、Platform IO環境を構築してからソースを修正します。

A.環境構築

1.ソースの取得

GithubよりソースをZipでダウンロードし、日本語名を使っていないディレクトリ※に「フォルダ:M5Unified_AtomEcho_ChatGPT」を解凍します。
※例:Platform IOのデフォルトのプロジェクト置き場は「C:\Users\{ユーザー名}\Documents\PlatformIO\Projects」ですが、”Documents”が”ドキュメント”と日本語になっている場合はここに作成するとコンパイルができません
https://github.com/robo8080/M5Unified_AtomEcho_ChatGPT

2.Platform IO 環境の構築

有志の方のブログを参考に、Platform IO環境でソースを開き、Claude3への変更なしでコンパイルできることを確認します。
https://note.com/ku_nel_5/n/n5bbdd5e176bf

B.事前準備

1.rootCA証明書の修正

srcディレクトリの”rootCACertificate.h”の中身が古くてエラーになるため、下記gistのコードと差し換えて再ビルドします。

https://twitter.com/robo8080/status/1761678709420081354

C.ソース:main.cppの変更

Claude3へのソース変更は「全てsrcディレクトリにあるmain.cppに対して」行います。また全ソースは長すぎるて全て変更するのは大変なため、最低限動作させる部分に絞って変更しました。

1.自身のアクセス設定へ更新

Githubの「APIキーの取得」を参考に取得した後、下記「Wi-Fi/APIキーの設定部分」を自身の設定に更新します。その際に【CLAUDE_APIKEYも合わせて追加・設定】します。
◆変更:音声認識サービスの選択ロジック
元ソースでは音声認識サービスの選択を[STT_APIKEY(Google Cloud STT)]と[OPENAI_APIKEY( OpenAI Whisper)]のKeyが一致している・していないで決定していますが、ここでは以下の条件で音声認識サービスを決定します。
・STT_APIKEY有り:Google Cloud STTを使用
・それ以外    :OpenAI Whisperを使用(OPENAI_APIKEYの設定が必須)

main.cpp:Wi-Fi/APIキーの設定部分(48行目当たり)
const char *SSID = "YOUR_WIFI_SSID";
const char *PASSWORD = "YOUR_WIFI_PASSWORD";
#define CLAUDE_APIKEY "SET YOUR OPENAI APIKEY" // Add new for Claude
#define OPENAI_APIKEY "SET YOUR OPENAI APIKEY" // Input if you use OpenAI Whisper
#define STT_APIKEY "SET YOUR STT APIKEY"       // Input if you use Google Cloud STT
#define VOICEVOX_APIKEY "SET YOUR VOICEVOX APIKEY"
main.cpp:音声認識の切替部分(365行目当たり)
// if(OPENAI_API_KEY != STT_API_KEY){
if(STT_API_KEY.length() > 0){
  Serial.println("Google STT");
  ret = SpeechToText(true);
} else {

※Claude 3 APIの認証用トークンの取得方法については下記を参照ください
https://apidog.com/jp/blog/claude-3-api-tutorial/

2.Claude3のHttps接続設定へ変更

Claude3のMessages APIに合わせて以下のHttps接続設定を変更します。

main.cpp:Https/接続先host部分(158行目当たり)
// String ret = https_post_json("https://api.openai.com/v1/chat/completions", json_string.c_str(), root_ca_openai);
String ret = https_post_json("https://api.anthropic.com/v1/messages", json_string.c_str(), root_ca_openai);
main.cpp:Https/header部分(120行目当たり)
// https.addHeader("Content-Type", "application/json");
// https.addHeader("Authorization", String("Bearer ") + OPENAI_API_KEY);
https.addHeader("x-api-key", CLAUDE_APIKEY);
https.addHeader("anthropic-version", "2023-06-01"); 
https.addHeader("content-Type", "application/json"); 

下記ではモデルのHaikuを指定していますが、他のモデルを使いたい場合はモデル名※「claude-3-haiku-20240307」部分を変更ください。

Https:data部分(80行目当たり)
// String json_ChatString = "{\"model\": \"gpt-3.5-turbo-1106\",\"messages\": [{\"role\": \"user\", \"content\": \"""\"}]}";
String json_ChatString = "{\"model\": \"claude-3-haiku-20240307\",\"max_tokens\": 1024\,\"messages\": [";

※モデル名は下記の「Latest API model name」を参照ください。
https://docs.anthropic.com/claude/docs/models-overview

3.Claude3の返信フォーマット合わせてJOSON設定を変更

受信内容もChatGPTからClaude3の出力に合わせて変更します。

JSON:受信部分(175行目当たり)
// const char* data = doc["choices"][0]["message"]["content"];
const char* data = doc["content"][0]["text"];;

【あとがき】

上記ソース変更後に動作させているのがこちら。Clude3と話すゾ!
https://twitter.com/UtaAoya/status/1776016590603243970

次回は下記のAIスタックチャン2のソースでCloude3が動く変更をトライしてみます。
https://github.com/robo8080/AI_StackChan2

Discussion