HUOXIU

百度アプリ投稿におけるAIテキスト作成の実践

出典: Baidu Geek Talk

著者 | コンテンツエコシステムチーム

導入
導入
大規模言語モデル(LLM)とは、数千億(あるいはそれ以上)のパラメータを持つ言語モデルを指します。これらのモデルは通常、大規模なデータセットで学習することで、性能と汎化能力を向上させます。Wenxin YiyanのAI機能をコンテンツ作成ツールに統合することで、ユーザーはよりインテリジェントでパーソナライズされたサービスを利用できるようになります。これにより、著者は制作の難易度とコストを削減し、効率性を向上させ、より質の高い作品制作が可能になります。 この記事では、Wenxin Yiyanの大規模モデルに基づくAIテキスト作成の実装プロセスの概要を簡単に説明します。これは、コンテンツ作成とAIを融合させた最初の試みです。生成AIイノベーションアプリケーションが進化するにつれて、画像や動画に基づいたよりユニークな機能が次々とリリースされるでしょう。ご期待ください!

全文は 4732 語から成り、読むのに 12 分かかると推定されます。


オタクトーク

01

背景

技術の急速な発展に伴い、人工知能分野における大規模モデリング技術への注目が高まっています。大規模モデルの広範な応用を通じて、様々な場面におけるその巨大な潜在力と価値を目の当たりにしてきました。大規模モデリング技術の発展は、業界全体のイノベーションと変革を推進するだけでなく、人工知能に対する私たちの理解と期待にも変化をもたらしています。

大規模言語モデル(LLM)とは、数千億(あるいはそれ以上)のパラメータを持つ言語モデルを指します。これらのモデルは通常、大規模なデータセットを用いて学習され、性能と汎化能力を向上させます。大規模モデルの出現は、計算能力とデータの可用性の向上という恩恵を受けており、研究者はより複雑で強力なモデルを構築し、様々な現実世界の問題を解決できるようになります。

OpenAIのChatGPTやBaiduのWenxin Yiyanといった大規模言語モデルは、自然言語の理解と生成能力が向上しています。膨大なテキストデータで学習されたこれらのモデルは、言語の文法、意味、文脈情報を捉えます。これにより、質問への回答、説明の提供、テキスト生成、対話において、より正確かつ流暢に処理できるようになります。さらに、これらのモデルの公開は大きな注目を集めています。大規模言語モデルの技術開発は、AIコミュニティ全体に大きな影響を与え、AIアルゴリズムの開発と利用方法を根本的に変えました。

Wenxin Yiyan の AI 機能を Baidu アプリの動的投稿機能に統合することで、ユーザーにはよりインテリジェントでパーソナライズされたサービスを提供できるようになり、著者は作成の難易度とコストを削減し、作成効率を高め、独自のコンテンツをより良く作成できるようになります。


オタクトーク

02

プロジェクト紹介

下の画像は、Baidu アプリの「更新を公開」セクションでの AI テキスト作成の例を示しています。

コンテンツ入力

AI生成の詩

AI生成の詩が完成しました。

2.1 全体的なアーキテクチャ

Baidu AppのAI搭載コンテンツ作成ツールは、Baiduの「文心一言」アシスト作成機能をベースとしています。ユーザーの入力に基づいて、継続、書き直し、プロンプトなどを含むコピーをインテリジェントに生成します。

ビジネス全体は3つの層に分かれています。

1. 最上層はビジネス層であり、モバイルデバイス、H5、ミニプログラムに実装された AI 支援作成、AI メモなどが含まれます。

2. 中間層は戦略層であり、プロンプトテンプレート構成機能、入出力戦略制御機能、構成情報管理機能など​​を提供します。

3. 基盤層は、文心易眼やリスク管理サービスなどの基本サービスから構成されます。

2.2 全体のプロセス

ビジネスレイヤーは、Baijiahao Creator Brainサービスを呼び出し、アカウント権限、機能権限、プロンプトテンプレート設定などの情報を取得します。権限に基づいて、日々の更新、AI詩作、旅行などの機能タイプを表示します。ユーザーはテキストを入力し、Creator Brainのテキスト生成インターフェースにアクセスします。Creator Brainはアカウント、権限、テンプレート情報を検証します。権限検証に合格すると、リスク管理単語リストにアクセスし、入力情報を管理してリスク管理を行います。最後に、Creator Brainはプロンプトとユーザーが入力した質問を携えて、Yiyanサービスにアクセスし、AIによって磨き上げられたテキストを取得します。


オタクトーク

03

主要技術

3.1 プロンプト

プロンプトとは、大規模な機械学習モデルに与えられる指示または質問であり、対応する回答または出力を生成するためのガイドとなります。通常、プロンプトは必要な情報またはタスクを説明するテキスト文字列であり、モデルにコンテキストとガイダンスを提供し、目的の応答を生成するのに役立ちます。例えば、Wenxin Yiyan大規模モデルに基づく対話、テキスト生成、その他のタスクにおいて、プロンプトはモデルが出力を生成するためのガイドとなります。適切に設計されたプロンプトは、モデルがユーザーの意図をより正確に理解し、関連性のある有用な回答を生成するのに役立ち、真の産業的/社会的価値を有します。優れた高品質のプロンプトを作成するには、私たちの理解と想像力を最大限に活用し、大規模モデルの能力を動員して作業効率を向上させる必要があります。


3.1.1 プロンプトの基本定義

簡単に言えば、プロンプトとは、大きなモデルが自らを表現するためのテキストによる説明です。

プロンプト式 = タスク + 本文の生成 + 詳細 (オプション) + フォーム (オプション)。

タスク: 詩を書くなど、モデルが実行することが予想されるタスクの種類。

件名: 夏についての詩を書くなど、生成されるオブジェクト。

詳細: 表情などの詳細な出力が含まれていますか?

フォーマット: レイアウト、コンテンツスタイル

優れたプロンプトは通常、次の 3 つの基準を満たしています。

明確な表現:モデルが優れたコンテンツを生成できるだけでなく、一般の人々にもその意味を理解できるように、わかりやすく、簡潔で明確である必要があります。

高い汎用性: メインの単語を変更した後でも、同様のタスクで優れたパフォーマンスを発揮します。

安定した生成: 同じプロンプト語が使用される場合、複数回生成されるコンテンツは十分に安定しています。

高品質のプロンプト + 大規模なモデル = 高品質のコンテンツ。


3.1.2 プロンプトの設定

Baiduアプリのダイナミックパブリッシャーは、AIを活用した複数のコンテンツ作成機能を提供します。各機能には、ユーザーの質問に回答し、カスタマイズされたコンテンツを提供するための説明が組み込まれています。以下のカテゴリーをご用意しています。

全文の書き込みを続行します: 大規模なモデルでは、ユーザー向けに書き込みを続行するために簡潔な言語を使用する必要があります。

全文書き換え:メインモデルは記事の書き換えアシスタントとして、文法エラーを修正し、ユーザーのコンテンツを磨くことが求められます。

毎日の更新: 大規模なモデルでは、ユーザー入力に基づいて短い毎日の更新を書き込む必要があります。

AI 生成詩: ユーザーが入力したテーマに基づいて短い詩を生成する大規模なモデルです。

製品の推奨: 生き生きとした文体で製品の推奨文を書きます。

旅行と旅: 大規模なモデルでは、ユーザーが自分の経験や観察を表現できるように旅行記を書く必要があります。

3.2 リスク管理

悪意のあるプロンプトの挿入、プロンプト語句の改ざん、モデルによる予期せぬ結果の誘導を防ぐため、プロンプトに防御指示を追加します。そのため、制作プロセス全体を通して以下の予防措置を実施しています。

  • 入力コンテンツは、コンテンツ リスク管理機能と統合され、リスク管理キーワード リストを渡したコンテンツを返しました。

  • メッセージが前の画面に戻ったり、セーフワードリストにヒットしたりした場合、ユーザーの入力内容はクリアされます。

  • ユーザー情報を記録し、入出力コンテンツのリスクレベルに基づいて高リスクのアカウントを禁止します。

  • 定期的に履歴記録を確認し、分析します。

3.3 SSEプロトコル

チャットのスムーズさと応答性を向上させるため、Wenxin Yiyan はサーバーサイドプッシュ技術として SSE を採用しています。SSE はサーバーからクライアントにイベントを送信できるため、WebSocket やロング/ショートポーリング技術と比較して、プッシュ機能をより簡単に実装できます。

応答ヘッダーには次の内容を含める必要があります。





コンテンツタイプ: text/event-stream; 文字セット=utf-8キャッシュコントロール: no-cache, no-transform接続: keep-aliveX-Accel-Buffering: no 

クライアントはHTTP GETリクエストを介してサーバーとの接続を確立し、text/event-streamタイプのデータを受信するように指定します。サーバーはリクエストを受信した後、すぐに応答を返すのではなく、接続を開いたままにして、ユーザーの入力に基づいて応答を生成します。応答を生成した後、サーバーは応答をイベントとしてクライアントに送信し、接続を開いたまま次の入力を待ちます。イベントを受信すると、クライアントはイベント内のデータを解析し、チャットインターフェースに表示します。クライアントとサーバーは、クライアントが接続を閉じるかサーバーでエラーが発生するまで、同じ接続を介して継続的にデータを交換できます。

SSEは他のソリューションと比較して使いやすく、新しいコンポーネントは不要で、既存のバックエンド言語とフレームワークのみを必要とします。SSEは既存のHTTPプロトコルを完全に再利用するため、既存のプロキシサーバーや認証技術上で直接実行できます。SSEはブラウザにネイティブのEventSourceオブジェクトを提供するため、サーバーから送信されるイベントのリッスンと処理が容易です。SSEは切断後の再接続とメッセージトレースをサポートし、データの整合性と一貫性を確保します。

3.4 グラデーションフロー表示コンポーネント

クライアントは、サーバーから返されたデータに基づいて、ストリーミング形式でデータを表示します。このプロセスは、初期待機、表示、表示終了という複数の段階に分かれています。これらの状態遷移において、表示されるコンテンツのスタイルも変化します。

初期待機: カーソルが表示され、点滅する必要があります。

プレゼンテーション中:カーソルが点滅しながらテキストが1つずつ表示されます。

プレゼンテーションの終了: 完全なテキストが表示され、カーソルが非表示になります。


3.4.1 カスタムテキストビュー

Androidを例に挙げると、初期化プロセスはまず待機状態と表示状態の2つの状態から構成されます。これはAndroidのEditTextコンポーネントと非常によく似ています。しかし、EditTextコンポーネントはカーソル表示、フォーカス取得、キーボードポップアップ、編集無効化といった複数のイベントの組み合わせを処理する必要があるため、機能の純粋性が低く、互換性の問題が発生する可能性があります。そのため、TextViewを継承したカスタムViewを使用して実装することにしました。

考慮する必要があるのは、文字を順番に表示すること、テキストのグラデーション、カーソルの 3 つの点だけです。

単語ごとの表示

  • カスタム ハンドラー タイマーを使用して、テキストを継続的に抽出して表示できます。

グラデーションテキスト

  • よく使われるForegroundColorSpanのソースコードを見ると、CharacterStyleを継承し、UpdateAppearanceを実装していることがわかります。最終的には、対応するupdateDrawStateメソッドをオーバーライドすることでテキストの色が変更されます。同様に、ペイントにグラデーションカラーを設定し、グラデーションの開始位置と終了位置を指定することで、テキストの色にグラデーション効果を加えることができます。ペイントにグラデーション効果を加えるには、よく使われるLinearGradient APIを使用します。

















 override fun updateDrawState(tp: TextPaint?) { tp ?: return val leadingWidth = tp.measureText(includingText, 0, gradientStart) val gradientWidth = tp.measureText(includingText, gradientStart, gradientEnd) val lineGradient = LinearGradient(leadingWidth, 0f, gradientWidth, 0f, intArrayOf(startColorInt, endColorInt), floatArrayOf(0f, 1f), Shader.TileMode.CLAMP ) tp.shader = lineGradient} 

カーソル

  • カーソルの追加: テキストの末尾に常にカーソルを表示するにはどうすればよいでしょうか?ここでは、 カスタム span を使用するReplacementSpan を参照します。ReplacementSpan には、 getSize() と draw()という2つのメソッドがあります。getSize () の戻り値は、置換するテキストの幅として使用されます。draw() は、必要なカーソルをキャンバス上に描画します。draw() では、カーソルとして適切なサイズの角丸四角形を描画するだけで済みます











 override fun getSize (paint: Paint , text: CharSequence ?,                  start: Int , end: Int , fm: Paint . FontMetricsInt ?) : Int { return paint.measureText( " " ).toInt() }
override fun draw (canvas: Canvas , text: CharSequence ?, start: Int , end: Int , x: Float , top: Int , y: Int , bottom: Int , paint: Paint ) { canvas.drawRoundRect(x, top.toFloat(), x + width, bottom.toFloat(), rx, ry, cursorPaint) }

  • カーソルの点滅: ここでは、ValueAnimator を使用してアルファ値をアニメーション化および更新し、アルファ値をブラシの不透明度に設定できます。







 override fun draw(canvas: Canvas, text: CharSequence?, start: Int, end: Int, x: Float, top: Int, y: Int, bottom: Int, paint: Paint) { cursorPaint.alpha = (alpha * 255).toInt().coerceAtMost(255) canvas.drawRoundRect(x, top.toFloat(), x + width, bottom.toFloat(), rx, ry, cursorPaint)} 



オタクトーク

04

要約

本稿では、Wenxin Yiyanなどの大規模モデルに基づくAIテキスト生成の実装の基本プロセスについて簡単に説明します。これは、コンテンツ作成とAIを組み合わせた最初の試みでもあります。生成AIイノベーションの応用が進むにつれて、画像や動画に基づいたよりユニークな機能が次々とリリースされるでしょう。どうぞご期待ください。