この記事は、北京開催のCloudWeGoテクノロジーサロンイベント「クラウドネイティブ✖️AI時代のマイクロサービスアーキテクチャと技術実践」でのByteDance-Flow R&DエンジニアのDu Shaofeng氏の講演「AIシナリオで実装されたKitex Thrift Streaming」を基にしています。 2024年3月30日に北京で。「実践」より編集。
概要
ByteDance Prompt プラットフォームは、包括的な Prompt 開発、チューニング、評価、およびアプリケーションのライフサイクル全体の機能をユーザーに提供することを目的としています。これらの機能の中でも、タイプライター効果の大規模モデル結果のストリーミングは重要な機能です。 SSE (Server-Sent Events) に基づいた実装は実現可能ですが、HTTP サービスを追加で記述する必要があり、開発の複雑さが増加します。投票方法はシンプルですが、ユーザーエクスペリエンスは理想的ではなく、あまりにも不器用に思えます。 gRPC に関しては、パフォーマンスは優れていますが、互換性の問題が発生する可能性があり、展開とメンテナンスが複雑になります。したがって、Kitex の Thrift ストリーミング機能を利用してストリーミング インターフェイスを実装することに成功し、ユーザーにスムーズで効率的なタイプライター効果の大規模モデル結果出力エクスペリエンスを提供します。
1. 事業背景
AI技術の継続的な発展により、人々の生活は大きく変化しています。 Byte の AI 製品 Doubao を例に挙げると、そのエージェントは人々に多くの斬新な体験をもたらしました。中でも、AI彼氏やAI彼女といった面白い知能ロボットは、ユーモラスなコミュニケーションだけでなく、優しく思いやりのある一面も見せてくれます。
これらすべては、大規模モデルに密接に関連する概念であるプロンプトと切り離すことができません。簡単に言えば、プロンプトは事前トレーニングされたモデルへのテキスト入力であり、特定のニーズを満たすテキスト出力を生成するようにモデルをガイドします。比喩的に言えば、プロンプトは、大きなモデルのための特別な夢を作成するようなもので、それを通じて、大きなモデルが特定のシナリオでより適切で的を絞った答えを与えるように導くことができます。
AIのガールフレンドを例に挙げると、慎重に設計されたプロンプトを通じて、その役割が優しく思いやりのある仮想のガールフレンドであることを大きなモデルに伝えます。同時に、ユーザーに対して優しく思いやりのあるコミュニケーションをすることや、傾聴、理解、励まし、提案などのスキルを求めるなどの制限も設けます。さらに、挨拶時に名前を言うように誘導したり、適切なニックネームを付けたり、ユーザーとの綿密なコミュニケーションや有益な提案を行ったりするワークフローも詳しく説明します。
このようなプロンプトを通じて、大きなモデルの完全な「夢」を構築し、それが AI のガールフレンドであること、およびユーザーとどのように対話すべきかを理解できるようにします。このプロンプトがアクティブになると、大規模モデルとの質疑応答セッションが行われるときに、プロンプトに基づいて対応する応答が返されます。例えば、私たちが「こんにちは」と言うと、名前を言うように誘導し、かわいいあだ名を付けてくれたり、励ましや安心を与えてくれます。
この例からわかるように、プロンプトは、特定のシナリオにおける大規模モデルの出力において決定的な役割を果たします。さらに、トークンの消費量や、出力プロセス中の大規模モデルの応答時間にも影響します。したがって、モデルの出力を向上させるには、優れたプロンプトが不可欠です。
2. 需要シナリオ
ByteDance Flow チームは、プロンプト開発者がプロンプトを設計、反復、評価、最適化できるように設計された包括的で成熟したプラットフォーム/メソッドの構築に取り組んでおり、それによって LLM (大規模言語モデル) の表現力を強化しています。開発段階では、ユーザーが効率的かつ正確なプロンプトを作成し、それに応じてデバッグできるように、構造化された生成とガイド付き生成を提供する予定です。
開発が進むにつれて、COT (Chain of Thought) や Few Shot などの自動チューニング テクノロジや、Prompt の回答精度を向上させるための APO (Auto Prompt Optimization) メソッドも導入していきます。同時に、トークン消費における大規模モデルの効率を最適化するためのプロンプトを拡張する機能も提供します。
さらに、Prompt の有効性を総合的に評価するため、さまざまなデータセットに基づいて Prompt をスコアリングし、パフォーマンスのボトルネックを詳細に分析して、目標を絞った改善を行います。最終的には、ワンクリック展開機能を提供し、開発者がプロンプト機能とその背後にある大規模なモデルをアプリケーションに簡単に統合できるようにする予定です。
もちろん、これらの機能の実現には、
リアルタイム ストリーミング
テクノロジーのサポートが不可欠です。 GPT、Doubao、Baidu AI 検索など、これまでに体験した AI 機能と同様に、ユーザーが質問した後にタイプライター形式の応答を使用するため、ユーザーはデータが常に画面に流れ込んでいるように感じられ、流暢性が向上します。チャットと応答速度。この
リアルタイム ストリーミング
テクノロジーは、Prompt プラットフォームが提供する必要がある最も基本的な機能です。ネットワーク送信のためにデータを複数のデータ ストリームに分割することで、ネットワーク遅延を効果的に削減し、パフォーマンスを向上させ、大規模な言語モデルを操作する際のユーザー エクスペリエンスを向上させることができます。
3. 解決策
ストリーミング出力機能を実装するために、綿密な調査を実施し、さまざまなオプションを検討しました。
-
投票
-
HTTP SSE
-
Kitex gRPC ストリーミング (protobuf)
-
Kitex スリフト ストリーミング
まず、投票スキームは柔軟性が低く、私たちのニーズを満たしていなかったため、除外されました。次に、HTTP ベースの SSE は実現可能なソリューションですが、RPC (リモート プロシージャ コール) にも厳しい要件があることを考慮すると、より適切なソリューションを見つける必要もあります。さらに、Protobuf プロトコルのストリーミング サポートが、特に Thrift インターフェイスの点でニーズを完全に満たしていないことがわかりました。最後に、Kitex による Thrift Streaming のサポートに気付きました。当時、Kitex Thrift Streaming は開発段階にあり、私たちはその最初のユーザーとなり、これをベースに Prompt プラットフォーム全体の基本フレームワークを構築することを決意しました。
アーキテクチャ設計に関しては、まず LangChain のベンチマークを行い、LLM エンジニアリング サービスを確立しました。これに基づいて、最も基本的なプロンプト管理およびアプリケーション機能を提供するプロンプト サービスをさらに構築します。フロントエンドと対話するために、API ゲートウェイを介して HTTP インターフェイスが提供されます。マイクロサービス間の通信に関しては、Kitex フレームワークを使用してストリーミング インターフェイスと非ストリーミング インターフェイスのサポートを提供し、データの効率的な送信と処理を保証します。
このソリューションにより、ストリーミング出力機能の実装に成功し、よりスムーズで効率的な AI インタラクション エクスペリエンスをユーザーに提供します。同時に、将来の拡張と最適化のための強固な基盤も築きました。
4. 練習と落とし穴
-
ストリーミング通話プロセス
ストリーミング通話プロセスは、ユーザーが質問を開始すると開始されます。この要求はまずゲートウェイに送信され、その後、ダウンストリームのプロンプト RPC インターフェイスとの接続が確立されます。 Prompt RPC インターフェイスは、LLM エンジニアリング サービスとの通信をさらに確立します。LLM エンジニアリング サービスは、モデルと継続的に対話し、モデルの出力結果を取得する役割を果たします。これらの結果は、ゲートウェイ層に到達するまでストリーミング方式で層ごとに上向きに送信され、最終的にストリーミング方式でユーザーに表示されます。
このプロセス中に、ストリーミング呼び出しを処理するために Prompt サービスにストリーミング インターフェイスを作成しました。このインターフェイスは、まずダウンストリーム インターフェイスを呼び出してダウンストリームとの接続を確立し、その後、for ループを通じてダウンストリームによって吐き出されたストリーミング パケットの結果を継続的に受信します。データ パケットが受信されると、エラーが発生するかストリームが閉じられてサイクルが終了するまで、send メソッドを通じて上位層に透過的に送信されます。
導入プロセス中に、私たちは Kitex Thrift Streaming のシンプルさを体験しました。しかし、いくつかの問題にも遭遇しました。特にエラー処理に関しては、コードの実行時に期待した結果が得られず、さらには CPU 負荷が高くなりすぎることが判明しました。
エラー ログをさらに分析した結果、個々のリクエスト、特に最初のパケットの QPM (Query Per Second) 制限の問題に関するエラー メッセージがあることがわかりました。コードのロジックによれば、このようなエラーが発生した場合は for ループをすぐに終了する必要がありますが、これは実際の状況ではありません。そこで、Kitex が提供するトラブルシューティング方法を使用して問題を特定し始めました。 Kitex は、RPCStart および RPCEnd の埋め込みポイントに加えて、パケットの受信および送信イベント用のより詳細な埋め込みポイントを提供します。これらの埋め込まれたポイントの分析を通じて、Kitex がリクエスト全体を通常の応答として認識し、大量のデータ パケットが呼び出しリンク上に送信されたことがわかりました。さらに単一パッケージの管理情報を確認すると、Kitex では正常な応答として認識されていることがわかります。
予備的な判断の結果、Kitex のストリーミング処理でビジネス エラーが無視され、エラーが正しく特定されなかった可能性があると考えられます。 Kitex チームと連絡を取った後、コードにビジネス ステータス エラー (ビジネス ステータス エラー) の認識を追加するなど、対応する調整を行いました。
このエラー処理の経験に基づいて、接続確立フェーズでの許可エラー、最初のパケット フェーズでの TPM/QPM オーバーラン、中間パケット フェーズでのストリーム タイムアウトとコンテンツなど、ストリーミング通話で発生する可能性のある他の異常なシナリオをさらに分析しました。エラーなどを確認します。これらのシナリオにおける Kitex Thrift Streaming のエラー処理パフォーマンスに焦点を当てました。たとえば、接続を確立するときにエラー情報をすぐに返せるかどうか、最初のパケットと中間パケットがエラーを返したときにストリームの待機をすぐに停止できるかどうかなどです。 Kitex チームとの共同調整とテストの後、これらのシナリオでのエラー処理は最終的に期待どおりになりました。
-
サービスガバナンスの観点から
サービス ガバナンスの観点から、私たちはタイムアウトと電流制限という 2 つの重要な側面に特に注意を払っています。
まず、タイムアウト管理が重要です。私たちのモジュールは大規模なモデルと対話するため、この対話には数秒、場合によっては数分程度の応答時間がかかる場合があります。したがって、HTTP 層と RPC 層の両方でストリーム処理に対して分単位のタイムアウト制限を設定します。これにより、for ループから抜け出せないことによるサービスのブロックを回避し、サービスの安定性と可用性を確保できます。
電流制限に関しては、Kitex はストリーム作成時の電流制限をサポートしていますが、LLM シナリオでは、接続確立時の QPM 電流制限だけでなく、大規模モデルのトークン消費の電流制限にも焦点を当てています。大規模なモデルの推論プロセスでは大量のトークンの消費が発生するため、制限しないとリソースの枯渇やサービスのクラッシュにつながる可能性があります。したがって、Kitex を使用して Jianlian の電流制限を実装し、同時に独自の分散コンポーネントを使用してさまざまなモデルでのトークン消費を計算し、それに応じてトークンレベルの電流制限を実装します。そうすることで、リソースの使用状況を効果的に制御し、サービスの過負荷を回避できます。
しかし、カイテックスにも期待しています。私たちは、Kitex が将来、パケット粒度でカスタマイズされた電流制限機能を提供できることを期待しています。このようにして、電流制限ルールをより柔軟に定義し、リソース使用量をより正確に制御できるため、サービスの安定性とパフォーマンスがさらに向上します。
5. 今後の期待
AI テクノロジーの継続的な開発と応用により、AI シナリオにおけるマイクロサービス フレームワークの機能に対する期待が高まっています。特に利便性、AI シナリオの機能、従来のフレームワーク機能の適応という点で、さらなる革新と進歩が見られることを期待しています。
-
利便性
まず利便性の観点から、
マイクロサービス フレームワークは、
特にストリーミング インターフェイスのテストのために、より多くのテスト ツールへのアクセスをサポートすることを期待しています。現在、Kitex Thrift ストリーミング インターフェイスのテストには依然として一定の制限があり、主に呼び出しをパッケージ化するための非ストリーミング インターフェイスの作成に依存しています。将来的には、ストリーミング インターフェイスをさらに便利にして、さまざまなテスト ツールをサポートし、汎用呼び出しなどの方法で開発効率を向上させたいと考えています。
-
AIシナリオでの能力
AI テクノロジーの活発な発展に伴い、ユーザー エクスペリエンスと機能を最適化するために AI 機能を組み込む製品が増えています。 AI シナリオでは、AI コンポーネントの統合とオーケストレーションをより適切にサポートし、従来のフレームワーク機能に適応できることを期待して、Kitex などのマイクロサービス フレームワークに対する期待が高まっています。
-
すぐに使える AI コンポーネントのオーケストレーション機能
現在の開発実践では、AI 機能を統合する必要がある場合、通常、開発者はプロンプトの呼び出し、大規模なモデル出力の解析、結果の機械語への変換など、複雑なロジックを自分で処理する必要があります。これは開発の難易度を高めるだけでなく、開発効率も低下させます。したがって、Kitex フレームワークがすぐに使える AI コンポーネント オーケストレーション機能を提供することを期待しています。
具体的には、フレームワークには、プロンプト コンポーネント、大規模モデル コンポーネント、結果解析コンポーネント、RPC 呼び出しコンポーネントなど、カプセル化された一連の AI コンポーネントがプリインストールされることが期待されます。これらのコンポーネントは、さまざまなビジネス ニーズに適応できるように、高度に構成可能で拡張可能である必要があります。開発者は、コンポーネント内の実装の詳細を気にせずに、これらのコンポーネントにビジネス ロジックを渡すだけでよいため、ビジネス ロジックの実装に集中できます。
-
柔軟な AI コンポーネント オーケストレーション機能
プリセット AI コンポーネントの提供に加えて、Kitex フレームワークが柔軟な AI コンポーネント オーケストレーション機能をサポートすることも期待されています。これは、フレームワークが、開発者がビジネス ニーズに応じてこれらの AI コンポーネントを簡単に調整できるようにする式言語または視覚化ツールを提供する必要があることを意味します。このようにして、開発者は、コンポーネント間の対話の詳細に立ち入ることなく、コンポーネント間の実行順序、通信方法、並列処理戦略などを定義できます。これにより、AIアプリケーションの開発効率と保守性が大幅に向上します。
-
従来のフレームワーク機能が LLM リンクに適応されています
AI シナリオでは、サービス ガバナンス、メタデータの透過的な送信、可観測性などの従来のフレームワーク機能が依然として重要です
。したがって、私たちは、Kitex フレームワークがこれらの側面に適応し、最適化できることを期待しています。
まず、サービス ガバナンスの観点から言えば、AI アプリケーションには長期にわたる推論プロセスが含まれる可能性があるため、フレームワークは、数秒、場合によっては数分の応答時間に対するタイムアウトおよび電流制限戦略を提供する必要があります。同時に、AI コンポーネントに関連する例外を処理する方法も考慮する必要があります。
次に、メタデータの透過的な送信の観点から、フレームワークが、より洗練された監視とデバッグのために AI コンポーネント間のメタデータの送信をサポートすることを期待しています。これにより、AI アプリケーションの動作状況をより深く理解し、問題を迅速に特定できるようになります。
最後に、可観測性の観点から、AI リンクの包括的な監視と分析のために、Kitex フレームワークが包括的なロギング、追跡、インジケーター収集機能を提供することを期待しています。これにより、潜在的なパフォーマンスのボトルネックや最適化ポイントを発見し、AI アプリケーションのパフォーマンスと安定性を向上させることができます。
要約すると、AI シナリオにおける Kitex フレームワークに対する将来の期待は、主に、
すぐに使える AI コンポーネント オーケストレーション機能
、
柔軟な AI コンポーネント オーケストレーション機能
、 LLMリンク
での従来のフレームワーク機能
の適応に焦点を当てています。私たちは、テクノロジーの継続的な進歩とチームの綿密な協力により、これらの期待が徐々に現実となり、AI アプリケーションの開発にさらなる利便性と効率性をもたらすと信じています。
実際、私たちのチームは、Kitex チームと綿密な協力を行って、マイクロサービス フレームワークで AI シナリオをより適切にサポートする方法について話し合いました。私たちは、近い将来、AI 機能と簡単かつシームレスに統合できるフレームワークをビジネス開発者に提供するソリューションの MVP バージョンをリリースできると信じています。エキサイティングな時期になるだろうし、私たちはそれを楽しみにしている。
{{名前}}
{{名前}}