Do this, do that.
私は Salesforce 内のローカル LLM を試してきましたが、その結果として開発したコンポーネントについてお話ししたいと思います。このコンポーネントには、Salesforce レコードをコンテキストとして使用する、すでにおなじみのチャット インターフェイスがあります。このコンポーネントはコンピューター上でローカルに動作するため、処理されたデータはサードパーティのサービスに送信されません。
Agentforce の導入が、私がこのコンポーネントを開発するきっかけとなりました。Agentforce は、エージェント (意思決定を行い、さまざまなアクションを実行できるシステム) を使用します。一方、アシスタントは情報をリアクティブに処理するだけです。Pico LLM を使用してローカル エージェントを構築することは可能だと思いますが、膨大な労力がかかります。そのため、代わりにアシスタントを開発することにしました。
LLM が機能すると予想されるとおり、膨大なデータセットで事前トレーニングされているため、あらゆるトピックに対する応答を生成します。さらに、Salesforce レコードを使用して追加のコンテキストを取得できます。このコンポーネントの機能は次のとおりです。
エンドユーザーの観点から見ると、プロセスは簡単です。モデルをアップロードし、システムプロンプトを選択し、レコードを選択し、ユーザープロンプトを記述して、生成される結果を確認します。
ブラウザで LLM を実行するのは、モデルのサイズ、帯域幅要件、RAM の必要性により、リソースを消費するタスクです。そのため、Pico チームは、コンピュータで LLM をローカルで使用する際の効率を大幅に高める picoLLM 圧縮技術を開発しました。彼らは、フロントエンド開発者がブラウザ間で LLM をローカルに実行できるように、picoLLM 推論エンジンを JavaScript SDK として提供しました。これは、Chrome、Safari、Edge、Firefox、Opera を含むすべての最新ブラウザをサポートしています。picoLLM 推論エンジンの仕組みについて詳しくは、記事をお読みください。
このコンポーネントは、ユーザーと PicoLLM インターフェース間のブリッジとして機能します。コンポーネントの中心には、iframe として埋め込まれた Visualforce ページがあります。このページは PicoLLM SDK を読み込み、LWC と通信して、ポスト メッセージを介して SDK を使用できるようにします。要素の組み合わせ全体は、次のことを処理します。
System_Prompt__c
の保存されたレコードを簡単に選択できます。ボタンを押すと、選択可能な既存のシステム プロンプトを含むポップアップが表示されます。バックエンド側では、特別なことは何もありません。Apex コードは、レコード ページのレコード ID を使用してオブジェクト間の関係を検出することに関連するすべての面倒な作業を実行します。また、いくつかの SOQL クエリを実行し、その役割はここで果たされます。
以前は、LWC コンポーネントのノード モジュールからコードを実行するために unpkg ツールを使用していました。このアプローチでは追加の構成手順が必要になり、安全性の低い方法で動作していました。今回は、Salesforce から直接 PicoLLM モジュールを実行し、以前実行した Experience Cloud サイトだけでなく、Lightning Experience インターフェースからも実行したいと考えました。
内部的には、PicoLLM は並列処理に Web ワーカーを使用しますが、LWC から実行できないことが主な問題でした。幸いなことに、Visualforce ページから Web ワーカーを実行することを拒否する人はいませんでした。それが私が使用したアプローチでした。
私は生の PicoLLM コードをダウンロードし、それを静的リソースとして Visualforce ページに追加しました。LWC では、Visualforce ページを含む iframe を使用しました。LWC と iframe 内のページ間の通信により、Web ワーカーを使用できるようになりました。このページは、Lightning Web コンポーネントから PicoLLM 関連コードをトリガーします。
Salesforce レコードを JSON または CSV 形式でコピーして貼り付け、任意のオンライン LLM に投入して確認します。レコードが消費され、追加のコンテキストに使用され、応答が生成されます。圧縮モデルをローカル処理に使用すると、それほど簡単ではないことがわかりました。
最初は、レコードを JSON 形式でユーザー プロンプトに直接入力していました。その後、プロンプト自体と私が提供した追加のコンテキストを区別できるほどスマートになるだろうと期待しました。さまざまなサイズのさまざまなモデルを使用しましたが、応答の生成に JSON が使用されない理由がわかりませんでした。ほとんどの場合、プロンプトへの応答が拒否されたり、要求したこととは関係のない架空のデータが生成されたりしました。コンテキスト データのさまざまな形式を試し始めました。CSV の使用、JSON の使用、プロンプト区切りを使用してプロンプトとコンテキストを厳密に区別するなど、何も役に立ちませんでした。
主要機能が動作しなかったため、このアイデアをあきらめそうになりました。数か月後、突然、ばかばかしいほど単純なひらめきが浮かびました。プロンプト部分の順序を逆にしたらどうなるでしょうか。ユーザー プロンプトが最初に来てコンテキストが 2 番目になるという状態から、コンテキストが最初に来てプロンプトが 2 番目になるという状態にしました。驚いたことに、これはうまくいき、使用したどのモデルでもすぐに Salesforce レコードをコンテキストとして理解し始めました。
コンポーネントの機能は次のマシンでテストされました:
コンポーネントの使用で最も時間がかかるのは、最初のモデルの読み込みです。9900X は Snapdragon X-Elite よりも簡単にパフォーマンスが優れていると思われるかもしれませんが、それは間違いです。驚いたことに、後者の方が高速です。メモリが高速なので、RAM が高速であればあるほど、モデルの読み込みが高速になると思います。参考までに、モデルの読み込み速度の比較表を以下に示します。
応答生成速度についても同じことが言えます。私が理解しているように、可能な限り最速の生成を得るには、CPU と RAM の高速な組み合わせが必要です。応答生成は同じプロンプトでも異なるため、正確な速度テストは実施していません。それでも、生成速度は非常に速く、オンラインの代替手段とほぼ同じくらい速いです。
実際、GPU を使用して応答を生成する方がはるかに効率的です。PicoLLM で GPU を使用することは可能ですが、私はその構成を自分でテストしていません。これにはいくつかの理由があります。まず、ほとんどのブラウザー (Edge を除く) ではデフォルトで有効になっていない WebGPU 機能を使用していると思われます。次に、モデルをロードするにはおそらく数ギガバイトの VRAM が必要ですが、私にはそれがありません。
このアシスタントの開発は、魅力的な探求の旅でした。Web ワーカーの制限への取り組みから、コンテキストを提供する際の迅速な順序付けの重要な役割の発見まで、課題は刺激的でやりがいのあるものでした。その結果、Salesforce エコシステム内で大規模言語モデルのパワーを活用するための独自のアプローチを提供する Lightning Web コンポーネントが誕生しました。
特に大規模なモデルの場合、初期のモデル読み込み時間は考慮すべき事項ですが、データをローカルで処理する機能は、データのセキュリティ、応答性、コスト効率の点で大きな利点があります。コンテンツ生成の自動化からインテリジェントな支援の提供まで、潜在的なユースケースは膨大であり、検討されるのを待っています。
GitHub リポジトリを確認してください。