Claudeを使用した構築を始める前に

Claudeをサポートチャットに使用するかどうかを決定する

以下は、LLMのClaudeを使用してカスタマーサポートプロセスの一部を自動化すべき主な指標です:

他のLLMよりもClaudeを選択する際の考慮事項:

  • 自然で細やかな会話を重視する場合:Claudeの洗練された言語理解により、他のLLMとのチャットよりも人間らしい、文脈を理解した自然な会話が可能です。
  • 複雑でオープンエンドな問い合わせを頻繁に受ける場合:Claudeは、定型的な応答を生成したり、ユーザーの発言のパターンを広範にプログラミングしたりすることなく、幅広いトピックと問い合わせに対応できます。
  • スケーラブルな多言語サポートが必要な場合:Claudeの多言語機能により、200以上の言語での会話が可能で、各言語に対して個別のチャットボットや広範な翻訳プロセスを必要としません。

理想的なチャットのやり取りを定義する

顧客がClaudeとどのように、いつ対話することを期待するかを定義するために、理想的な顧客とのやり取りの概要を作成します。この概要は、ソリューションの技術要件を決定するのに役立ちます。

以下は自動車保険のカスタマーサポートチャットの例です:

  • 顧客:サポートチャット体験を開始
    • Claude:顧客を温かく迎え、会話を始める
  • 顧客:新しい電気自動車の保険について質問
    • Claude:電気自動車の補償に関する関連情報を提供
  • 顧客:電気自動車保険特有のニーズに関する質問をする
    • Claude:正確で有益な回答を提供し、情報源へのリンクを提供
  • 顧客:保険や自動車とは無関係のオフトピックな質問をする
    • Claude:関係のないトピックについては話し合わないことを明確にし、ユーザーを自動車保険の話題に戻す
  • 顧客:保険の見積もりに興味を示す
    • Claude:適切な見積もりを決定するために一連の質問をし、回答に応じて対応を調整
    • Claude:ユーザーから収集した必要な情報とともに見積もり生成APIツールを使用するリクエストを送信
    • Claude:APIツールの使用から応答情報を受け取り、情報を自然な応答に統合し、ユーザーに見積もりを提示
  • 顧客:フォローアップの質問をする
    • Claude:必要に応じてフォローアップの質問に回答
    • Claude:保険プロセスの次のステップへ顧客を案内し、会話を締めくくる
実際のユースケースで作成する例では、理想的なトーン、応答の長さ、Claudeに求める詳細レベルを把握するために、このやり取りの実際の言葉を書き出すと役立つかもしれません。

やり取りを個別のタスクに分解する

カスタマーサポートチャットは、質問への回答から情報検索、リクエストに対するアクションまで、単一の顧客とのやり取りにまとめられた複数の異なるタスクの集合体です。構築を始める前に、理想的な顧客とのやり取りを、Claudeに実行させたいすべてのタスクに分解します。これにより、各タスクに対してClaudeにプロンプトを与え評価できることが保証され、テストケースを作成する際に考慮する必要のあるやり取りの範囲を把握できます。

顧客によっては、これをユーザーのリクエストに応じた会話の変化点を示すインタラクションフローチャートとして視覚化すると役立つことがあります。

上記の保険に関するやり取りの例に関連する主要なタスクは以下の通りです:

  1. 挨拶と一般的なガイダンス

    • 顧客を温かく迎え、会話を開始する
    • 会社とやり取りに関する一般的な情報を提供する
  2. 商品情報

    • 電気自動車の補償に関する情報を提供する
      これには、Claudeが必要な情報をコンテキストに持っている必要があり、RAGの統合が必要になる可能性があります。
    • 電気自動車保険特有のニーズに関する質問に回答する
    • 見積もりや保険の詳細についてのフォローアップ質問に回答する
    • 適切な場合は情報源へのリンクを提供する
  3. 会話の管理

    • トピック(自動車保険)に焦点を当てる
    • オフトピックな質問を関連する主題に戻す
  4. 見積もりの生成

    • 見積もり適格性を判断するための適切な質問をする
    • 顧客の回答に基づいて質問を調整する
    • 収集した情報を見積もり生成APIに送信する
    • 顧客に提供された見積もりを提示する

成功基準を確立する

サポートチームと協力して、明確な成功基準を定義し、測定可能なベンチマークと目標を持つ詳細な評価を作成します。

以下は、定義されたタスクをClaudeがどれだけうまく実行しているかを評価するために使用できる基準とベンチマークです:

以下は、サポートにClaudeを採用することのビジネスへの影響を評価するために使用できる基準とベンチマークです:

カスタマーサービスエージェントとしてClaudeを実装する方法

適切なClaudeモデルを選択する

モデルの選択は、コスト、正確性、応答時間のトレードオフによって異なります。

カスタマーサポートチャットの場合、claude-3-7-sonnet-20250219は知性、レイテンシー、コストのバランスを取るのに適しています。ただし、RAG、ツール使用、長文コンテキストのプロンプトを含む複数のプロンプトを使用する会話フローの場合、レイテンシーを最適化するためにclaude-3-haiku-20240307がより適している可能性があります。

強力なプロンプトを構築する

Claudeをカスタマーサポートに使用するには、Claudeが適切に応答できるように十分な指示とコンテキストを持ちながら、幅広い顧客の問い合わせに対応できる柔軟性を持たせる必要があります。

システムプロンプトから始めて、強力なプロンプトの要素を書いていきましょう:

IDENTITY = """あなたはAcme Insurance Companyのフレンドリーで知識豊富なAIアシスタント、Evaです。
あなたの役割は、顧客を温かく迎え、自動車保険と電気自動車保険を含むAcmeの保険商品に関する
情報を提供することです。また、顧客の保険ニーズに関する見積もりの取得もサポートできます。"""
ユーザーとの会話から指示を分離する方法として、すべての情報をシステムプロンプト内に入れたくなるかもしれませんが、Claudeは実際には(役割プロンプトを除いて)プロンプトの内容の大部分を最初のUserターンの中に書く方が最もよく機能します。詳しくはシステムプロンプトでClaudeに役割を与えるをご覧ください。

複雑なプロンプトはサブセクションに分解し、一度に一部ずつ書くのがベストです。各タスクについて、タスクをうまく実行するためにClaudeが必要とするプロンプトの部分を定義するステップバイステップのプロセスに従うと、より成功する可能性があります。この自動車保険のカスタマーサポートの例では、「挨拶と一般的なガイダンス」タスクから始めて、全体的なプロンプトのすべての部分を少しずつ書いていきます。これにより、プロンプトの個々の部分をより迅速に調整できるため、プロンプトのデバッグも容易になります。

これらのすべての部分をconfig.pyというファイルに入れます。

STATIC_GREETINGS_AND_GENERAL = """
<static_context>
Acme Auto Insurance:道路上の信頼できるパートナー

概要:
Acme Insuranceでは、お客様の車両が単なる移動手段以上のもの—人生の冒険へのチケットであることを理解しています。
1985年以来、私たちはドライバーに自信を持って探索、通勤、旅行できる安心感を提供する自動車保険契約を作り上げてきました。
市街地を走行するにせよ、長距離の道路旅行に出発するにせよ、Acmeはお客様と車両を守ります。
私たちの革新的な自動車保険契約は、軽微な接触事故から大きな衝突事故まで、すべてをカバーするようにお客様のユニークなニーズに合わせて設計されています。
Acmeの受賞歴のあるカスタマーサービスと迅速な保険金支払い処理により、お客様は運転の喜びに集中でき、残りは私たちが対応します。
私たちは単なる保険会社ではありません—人生の旅のコパイロットです。
Acme Auto Insuranceを選択し、優れた補償と真摯なケアがもたらす安心を体験してください。Acmeでは、お客様の車を単に保険でカバーするだけでなく、
開かれた道路での冒険に燃料を提供します。

注:電気自動車向けの特別な補償も提供しており、すべての種類の車のドライバーが私たちの保護を受けられます。

Acme Insuranceは以下の商品を提供しています:
- 自動車保険
- 電気自動車保険
- 二輪車保険

営業時間:月曜日-金曜日、午前9- 午後5時(EST)
カスタマーサービス番号:1-800-123-4567
</static_context>
"""

次に、自動車保険と電気自動車保険の情報についても同様に行います。

STATIC_CAR_INSURANCE="""
<static_context>
自動車保険の補償:
Acmeの自動車保険契約は通常以下をカバーします:
1. 賠償責任補償:他者に与えた身体傷害と物的損害に対する支払い
2. 衝突補償:事故による車両の損害に対する支払い
3. 包括補償:衝突以外の事故による車両の損害に対する支払い
4. 医療費支払い補償:事故後の医療費に対する支払い
5. 無保険/不十分な保険の運転者補償:十分な保険に加入していない運転者に追突された場合の保護

オプションの補償には以下が含まれます:
- レンタカー費用補償
- ロードサービス
- 新車買い替え補償
</static_context>
"""

STATIC_ELECTRIC_CAR_INSURANCE="""
<static_context>
電気自動車保険:
私たちの特別な電気自動車保険は、従来の自動車補償を超えて、
お客様のハイテク投資に合わせた保護を提供します。標準的な補償に加えて、以下を提供します:
- 高価なバッテリーシステムの保護
- 家庭用充電設備の補償
- 急速に進化する電気自動車の世界への適応

Rivian、Nissan Leaf、Chevrolet Bolt、
その他の電気自動車のいずれを運転されていても、私たちの知識豊富なエージェントが、
電気で走る一マイル一マイルを自信を持って楽しめる保険契約を作成する準備ができています。
</static_context>
"""

静的コンテンツができたので、Claudeの応答をガイドするための理想的な顧客とのやり取りの「良い」例を4-5個追加しましょう。これらの例は、理想的な顧客とのやり取りを代表するものであり、ガードレール、ツールの呼び出しなどを含めることができます。

EXAMPLES="""
以下は顧客とのやり取りの例です:

<example 1>
H: こんにちは、小規模事業者向けの企業保険は提供していますか?

A: 申し訳ありません。現在、企業保険は提供していません。
ただし、自動車保険や電気自動車保険を含む個人向け保険商品を提供しています。
これらの商品についてもっと詳しく知りたいですか?
</example 1>

<example 2>
H: こんにちは、営業時間を教えてください。

A: 営業時間は月曜日から金曜日の午前9時から午後5時(EST)です。
その時間内にご質問やサポートが必要な場合は、お気軽にご連絡ください。
他に何かお手伝いできることはありますか?
</example 2>

<example 3>
H: 自動車保険を探しています。Acmeはどのような保険を提供していますか?

A: 素晴らしい選択です!Acmeの自動車保険契約は通常以下を含みます:
- 賠償責任補償:事故で過失がある場合の保護
- 衝突補償:事故による車両の損害に対する支払い
- 包括補償:盗難やバンダリズムなどの衝突以外の事故をカバー
- 医療費支払い補償:事故後の医療費に対する支払い
- 無保険/不十分な保険の運転者補償:十分な保険に加入していない運転者からの保護

また、レンタカー費用補償、ロードサービス、新車買い替え補償などのオプションの補償も提供しています。
これらの補償についてさらに詳しく知りたい場合や、お客様の車両の保険について具体的な質問はありますか?
</example 3>

<example 4>
H: 電気自動車保険について聞きたいです。

A: もちろんです!私たちの電気自動車保険は、電気自動車所有者の特別なニーズに合わせて設計されています。
通常の自動車に提供するすべての標準的な補償に加えて、電気自動車向けの保険契約には以下が含まれます:

- バッテリー補償:車両の高価なバッテリーシステムの損傷または劣化に対する保護
- テクノロジーパッケージ:高度な電子機器と車載コンピューターシステムの修理または交換をカバー
- 充電設備補償:家庭用および携帯用充電設備の両方を保護
- サイバーセキュリティ保護:ハッキングやデジタル脅威に対する補償
- 専門的なロードサービス:車両のアンダーキャリッジを保護するフラットベッド牽引を含む

Tesla、Rivian、Nissan、Chevroletなど、幅広い電気自動車をカバーしています。
保険をご検討の特定の電気自動車はありますか?または、これらの補償についてさらに詳しく知りたい点はありますか?
</example 4>

<example 5>
H: 自動車保険の見積もりを取りたいです。

A: もちろんです!自動車保険の見積もりのお手伝いをさせていただきます。
正確な見積もりを提供するために、お客様の車両と主たる運転者についていくつか情報を収集させていただく必要があります。
基本的な情報から始めましょう:

1. お車のメーカーとモデルを教えていただけますか?
2. 製造年は何年ですか?
3. おおよその走行距離を教えていただけますか?
4. 主たる運転者の年齢を教えていただけますか?

これらの情報をいただければ、見積もりツールを使用して個別の保険見積もりを生成させていただきます。
</example 5>
"""

また、顧客とのやり取り方法に関する重要な指示を含める必要があります。 これには、ブランドのガードレールやサポートポリシーから導き出されるものが含まれる場合があります。

ADDITIONAL_GUARDRAILS = """以下のガードレールを遵守してください:
1. 提供商品に記載されている保険の種類についてのみ情報を提供してください。
2. 提供していない保険の種類について尋ねられた場合は、
そのサービスは提供していないことを丁寧に説明してください。
3. 将来の商品提供や会社の計画について推測しないでください。
4. 権限のない約束や合意を行わないでください。
情報提供とガイダンスのみを行います。
5. 競合他社の商品やサービスについて言及しないでください。
"""

では、これらのセクションをすべて1つの文字列にまとめて、プロンプトとして使用しましょう。

TASK_SPECIFIC_INSTRUCTIONS = ' '.join([
   STATIC_GREETINGS_AND_GENERAL,
   STATIC_CAR_INSURANCE,
   STATIC_ELECTRIC_CAR_INSURANCE,
   EXAMPLES,
   ADDITIONAL_GUARDRAILS,
])

ツール使用でダイナミックでエージェント的な機能を追加する

Claudeは、クライアントサイドのツール使用機能を使用してアクションを実行し、動的に情報を取得することができます。まず、プロンプトが利用すべき外部ツールやAPIをリストアップします。

この例では、見積もりを計算するためのツールから始めます。

このツールは実際の計算は行わず、指定された引数でツールを使用すべきことをアプリケーションに通知するだけであることを覚えておいてください。

保険見積もり計算機の例:

TOOLS = [{
  "name": "get_quote",
  "description": "ユーザー入力に基づいて保険見積もりを計算します。返される値は月額保険料です。",
  "input_schema": {
    "type": "object",
    "properties": {
      "make": {"type": "string", "description": "車両のメーカー。"},
      "model": {"type": "string", "description": "車両のモデル。"},
      "year": {"type": "integer", "description": "車両の製造年。"},
      "mileage": {"type": "integer", "description": "車両の走行距離。"},
      "driver_age": {"type": "integer", "description": "主たる運転者の年齢。"}
    },
    "required": ["make", "model", "year", "mileage", "driver_age"]
  }
}]

def get_quote(make, model, year, mileage, driver_age):
    """月額保険料をUSDで返します"""
    # HTTPエンドポイントやデータベースを呼び出して見積もりを取得できます。
    # ここでは、1秒の遅延をシミュレートし、固定の見積もり100を返します。
    time.sleep(1)
    return 100

プロンプトをデプロイする

プロンプトがどれだけうまく機能するかを知るには、テスト環境にデプロイして評価を実行する必要があるので、プロンプト、Anthropic SDK、ユーザーインターフェース用のstreamlitを使用して小さなアプリケーションを構築しましょう。

chatbot.pyというファイルで、Anthropic SDKとのやり取りをカプセル化するChatBotクラスのセットアップから始めます。

このクラスには、generate_messageprocess_user_inputという2つの主要なメソッドが必要です。

from anthropic import Anthropic
from config import IDENTITY, TOOLS, MODEL, get_quote
from dotenv import load_dotenv

load_dotenv()

class ChatBot:
   def __init__(self, session_state):
       self.anthropic = Anthropic()
       self.session_state = session_state

   def generate_message(
       self,
       messages,
       max_tokens,
   ):
       try:
           response = self.anthropic.messages.create(
               model=MODEL,
               system=IDENTITY,
               max_tokens=max_tokens,
               messages=messages,
               tools=TOOLS,
           )
           return response
       except Exception as e:
           return {"error": str(e)}

   def process_user_input(self, user_input):
       self.session_state.messages.append({"role": "user", "content": user_input})

       response_message = self.generate_message(
           messages=self.session_state.messages,
           max_tokens=2048,
       )

       if "error" in response_message:
           return f"エラーが発生しました:{response_message['error']}"

       if response_message.content[-1].type == "tool_use":
           tool_use = response_message.content[-1]
           func_name = tool_use.name
           func_params = tool_use.input
           tool_use_id = tool_use.id

           result = self.handle_tool_use(func_name, func_params)
           self.session_state.messages.append(
               {"role": "assistant", "content": response_message.content}
           )
           self.session_state.messages.append({
               "role": "user",
               "content": [{
                   "type": "tool_result",
                   "tool_use_id": tool_use_id,
                   "content": f"{result}",
               }],
           })

           follow_up_response = self.generate_message(
               messages=self.session_state.messages,
               max_tokens=2048,
           )

           if "error" in follow_up_response:
               return f"エラーが発生しました:{follow_up_response['error']}"

           response_text = follow_up_response.content[0].text
           self.session_state.messages.append(
               {"role": "assistant", "content": response_text}
           )
           return response_text
      
       elif response_message.content[0].type == "text":
           response_text = response_message.content[0].text
           self.session_state.messages.append(
               {"role": "assistant", "content": response_text}
           )
           return response_text
      
       else:
           raise Exception("エラーが発生しました:予期しない応答タイプ")

   def handle_tool_use(self, func_name, func_params):
       if func_name == "get_quote":
           premium = get_quote(**func_params)
           return f"見積もり生成:月額${premium:.2f}"
      
       raise Exception("予期しないツールが使用されました")

ユーザーインターフェースを構築する

このコードをStreamlitを使用してメインメソッドでテストデプロイします。このmain()関数は、Streamlitベースのチャットインターフェースをセットアップします。

これをapp.pyというファイルで行います。

import streamlit as st
from chatbot import ChatBot
from config import TASK_SPECIFIC_INSTRUCTIONS

def main():
   st.title("Acme Insurance Companyのアシスタント、Evaとチャット🤖")

   if "messages" not in st.session_state:
       st.session_state.messages = [
           {'role': "user", "content": TASK_SPECIFIC_INSTRUCTIONS},
           {'role': "assistant", "content": "理解しました"},
       ]

   chatbot = ChatBot(st.session_state)

   # 最初の2つを除くユーザーとアシスタントのメッセージを表示
   for message in st.session_state.messages[2:]:
       # ツール使用ブロックを無視
       if isinstance(message["content"], str):
           with st.chat_message(message["role"]):
               st.markdown(message["content"])

   if user_msg := st.chat_input("メッセージを入力してください..."):
       st.chat_message("user").markdown(user_msg)

       with st.chat_message("assistant"):
           with st.spinner("Evaが考えています..."):
               response_placeholder = st.empty()
               full_response = chatbot.process_user_input(user_msg)
               response_placeholder.markdown(full_response)

if __name__ == "__main__":
   main()

以下のコマンドでプログラムを実行します:

streamlit run app.py

プロンプトを評価する

プロンプトは、本番環境で使用できる状態にするためにテストと最適化が必要になることがよくあります。ソリューションの準備状態を判断するために、定量的手法と定性的手法を組み合わせた体系的なプロセスを使用してチャットボットのパフォーマンスを評価します。定義された成功基準に基づいて強力な経験的評価を作成することで、プロンプトを最適化できます。

Anthropic Consoleには、さまざまなシナリオでプロンプトをテストできる評価ツールが新しく追加されました。

パフォーマンスを改善する

複雑なシナリオでは、標準的なプロンプトエンジニアリング技術ガードレール実装戦略を超えて、パフォーマンスを改善するための追加戦略を検討すると役立つ場合があります。以下は一般的なシナリオです:

RAGで長いコンテキストのレイテンシーを削減する

大量の静的および動的コンテキストを扱う場合、すべての情報をプロンプトに含めると、高いコスト、応答時間の遅延、コンテキストウィンドウの制限に達する可能性があります。このシナリオでは、Retrieval Augmented Generation(RAG)技術を実装することで、パフォーマンスと効率を大幅に改善できます。

Voyageなどの埋め込みモデルを使用して情報をベクトル表現に変換することで、よりスケーラブルで応答性の高いシステムを作成できます。このアプローチでは、すべての可能なコンテキストを毎回プロンプトに含めるのではなく、現在のクエリに基づいて関連情報を動的に取得できます。

サポートのユースケースにRAGレシピを実装することで、広範なコンテキスト要件を持つシステムにおいて、正確性の向上、応答時間の短縮、APIコストの削減が示されています。

ツール使用でリアルタイムデータを統合する

口座残高や保険契約の詳細など、リアルタイムの情報を必要とするクエリを扱う場合、埋め込みベースのRAGアプローチでは不十分です。代わりに、ツール使用を活用することで、チャットボットの正確でリアルタイムな応答を提供する能力を大幅に向上させることができます。例えば、ツール使用を使用して、顧客情報の検索、注文詳細の取得、顧客に代わって注文のキャンセルを行うことができます。

ツール使用:カスタマーサービスエージェントレシピで説明されているこのアプローチにより、ライブデータをClaudeの応答にシームレスに統合し、よりパーソナライズされた効率的な顧客体験を提供できます。

入力と出力のガードレールを強化する

チャットボットをデプロイする場合、特にカスタマーサービスのシナリオでは、誤用、範囲外のクエリ、不適切な応答に関連するリスクを防ぐことが重要です。Claudeはそのようなシナリオに本質的に耐性がありますが、以下はチャットボットのガードレールを強化するための追加のステップです:

  • 幻覚を減らす:事実確認メカニズムと引用を実装して、提供された情報に基づいて応答を根拠付けます。
  • 情報のクロスチェック:エージェントの応答が会社のポリシーと既知の事実に一致することを確認します。
  • 契約上のコミットメントを避ける:エージェントが権限のない約束や合意を行わないようにします。
  • ジェイルブレイクを緩和する:無害性スクリーンと入力検証などの方法を使用して、ユーザーがモデルの脆弱性を悪用して不適切なコンテンツを生成しようとするのを防ぎます。
  • 競合他社への言及を避ける:競合他社の商品やサービスに言及しないように、競合他社への言及フィルターを実装します。
  • Claudeをキャラクターに留める:長く複雑なやり取りでも、Claudeがコンテキストのスタイルを変更しないようにします。
  • 個人を特定できる情報(PII)を削除する:明示的に必要で許可されている場合を除き、応答からPIIを削除します。

ストリーミングで認識される応答時間を短縮する

長い応答が予想される場合、ストリーミングを実装することで、ユーザーのエンゲージメントと満足度を大幅に改善できます。このシナリオでは、応答全体が生成されるのを待つのではなく、ユーザーは段階的に答えを受け取ります。

ストリーミングの実装方法は以下の通りです:

  1. ストリーミング応答をサポートするためにAnthropic Streaming APIを使用します。
  2. フロントエンドでテキストのチャンクを受け取るように設定します。
  3. 各チャンクが到着したら表示し、リアルタイムのタイピングをシミュレートします。
  4. ユーザーが離れて戻ってきた場合に表示できるように、完全な応答を保存するメカニズムを実装します。

場合によっては、段階的な表示が長い処理時間の影響を緩和するため、ストリーミングによってベースレイテンシーの高い、より高度なモデルの使用が可能になります。

チャットボットをスケールする

チャットボットの複雑さが増すにつれて、アプリケーションアーキテクチャもそれに合わせて進化させることができます。アーキテクチャにさらなる層を追加する前に、以下のより簡単なオプションを検討してください:

  • プロンプトを最大限活用し、プロンプトエンジニアリングを通じて最適化していることを確認します。最も効果的なプロンプトを書くためにプロンプトエンジニアリングガイドを使用してください。
  • プロンプトに追加のツールを追加し(プロンプトチェーンを含めることができます)、必要な機能を達成できるかどうかを確認します。

チャットボットが非常に多様なタスクを処理する場合は、初期の顧客クエリをルーティ

ングするために別のインテント分類器の追加を検討することができます。既存のアプリケーションでは、これには顧客クエリを分類器を通じて専門的な会話(独自のツールとシステムプロンプトを持つ)にルーティングする決定木を作成することが含まれます。この方法では、レイテンシーを増加させる可能性のある追加のClaude呼び出しが必要になることに注意してください。

サポートワークフローにClaudeを統合する

私たちの例はStreamlit環境内で呼び出し可能なPython関数に焦点を当てていましたが、リアルタイムのサポートチャットボット用にClaudeをデプロイするにはAPIサービスが必要です。

以下のようなアプローチが可能です:

  1. APIラッパーの作成:分類関数の周りに簡単なAPIラッパーを開発します。例えば、Flask APIやFast APIを使用してコードをHTTPサービスにラップできます。HTTPサービスはユーザー入力を受け取り、アシスタントの応答を完全に返すことができます。したがって、サービスは以下のような特徴を持つことができます:

    • Server-Sent Events(SSE):SSEにより、サーバーからクライアントへのリアルタイムの応答のストリーミングが可能になります。これは、LLMを使用する際のスムーズでインタラクティブな体験を提供するために重要です。
    • キャッシング:キャッシングを実装することで、応答時間を大幅に改善し、不要なAPI呼び出しを減らすことができます。
    • コンテキストの保持:ユーザーが離れて戻ってきた場合の会話の継続性のために、コンテキストを維持することが重要です。
  2. Webインターフェースの構築:Claude搭載エージェントとのやり取りのためのユーザーフレンドリーなWeb UIを実装します。