Skip to content
This page has been auto-translated and may contain errors.View in English

LLMがどのように機能するか

docs.scrimba.com

まず、名前について。LLM大規模言語モデルの略です。ChatGPTのようなツールの背後にあるAIの種類で、プロンプトを送るとテキストが返ってくるものです。このチャプターは、実際にそれが何であるかの実践的なイメージです。

質問を入力すると、数秒後に流暢で自信に満ちた答えが現れます。モデルがあなたを理解して答えを調べたように見えます。そのイメージは役に立ちますし、重要な点で間違っていますし、その2つのギャップが初心者の間違いの大部分の原因です。

これはあなたのキャリア全体を通じて、このツール群との関わりで報酬をもたらすチャプターです。モデルを構築するために、モデルを学習させるための数学を知る必要はありません。それが答える時に実際に何が起きているかの実践的なイメージが必要です。なぜなら、そのイメージが他のすべてを説明するからです。プロンプティングがなぜ機能するのか、同じ質問がなぜ異なる答えを与えるのか、モデルがなぜ事実を発明するのか、なぜ計算コストがかかるのか、そしてなぜいくつかの機能は簡単に見えるのに難しいのかを説明します。このハンドブックの後のすべては、ここにある考え方の結果です。

このチャプターは、これらのシステムの下にあるメンタルモデルです。モデルとは何か、それが実行する1つのループ、そしてハンドブックの残り全体を説明する少数のプロパティです。数学は一切ありません。すべてはブラックボックスに対してコーディングすることと、なぜそのように動作するかを知ることの違いです。

後のチャプターのすべてのテクニック、プロンプティング、構造化出力、検索、エージェント、は、これから読もうとしていることの結果です。このイメージを正しく理解すれば、残りはトリックの寄せ集めではなく、予測できる1つのマシンのように感じられるようになります。

これらのモデルは特定の反復可能な方法で失敗し、このチャプターがその理由です。インターフェースを取り除くと、言語モデルは一度に1チャンクテキストを予測する凍結された関数であり、ほぼすべての本番失敗モード、非決定性、コスト爆発、失われたコンテキスト、自信満々な間違った答え、はその1つの事実から出ます。

ここに新しい数学はありません、それが重点です。耐久性のあるエンジニアリング上の利点は、月ごとのモデルではなく、メカニズムにあります。後のすべての決定が基づいている基盤として読んでください。

モデルが実際に何であるか

チャットインターフェースを取り除くと、大規模言語モデルは1つのもの:巨大な数学関数で、**パラメータ**と呼ばれる固定された数十億個の数字のセット(重みと呼ばれることもあります)。それがモデル全体です。データベースではなく、検索エンジンではなく、ボックスの中に小さな人がいるわけではありません。テキストを入力して出力するものは非常に大量の数字です。

これらの数字はプログラマーが入力したものではありません。学習中に設定されました。プロバイダーはモデルに膨大な量のテキスト、書籍、コード、記事、ウェブページを与え、簡単なドリルを数十億回実行しました。次の単語を隠して、モデルにそれを予測するよう求め、推測が間違うたびにその数字をわずかに調整します。それを大規模で繰り返すと、数字はゆっくりとテキスト予測が上手な値に落ち着きます。それが学習です。予測が良くなるまで数十億のダイアルを調整することです。

これから2つの事柄が続き、後で出会う多くの動作を説明します。まず、学習は一度だけ、事前に行われ、非常に高額です。モデルを呼び出す時点で、その数字は凍結されています。モデルはあなたの会話から学びません。あなたが言うことは何もそのパラメータを変えません。覚えていて適応しているように感じますが、それはモデル自体ではなく、その周りのソフトウェアであり、コンテキストウィンドウセクションで重要な問題として戻ってきます。

2番目に、その中に事実の表があります。「知識」はそれらの数字に焼き込まれたパターンとして存在します。1万個のパンを焼いたパン職人が、レシピを読まずに手にテクニックを持っているのと同じように。モデルは正しく、賢明なテキストの形を学びました。それが同じ文で流暢で間違っていることができる理由です。保管された事実から棚をスキャンするのではなく、良い答えの形を再現しているのです。

JunoWhat a model actually is つまり、モデルはテキストをテキストに変える固定された数字の巨大な塊であり、その数字は学習中に一度チューニングされ、その後凍結されています。チャット中にあなたから学ぶことはなく、その中には整然とした事実の表がなく、パターンを持っています。ですから、確信を持って間違っているかもしれません。重要なものはすべて確認してください。

モデルは**純粋な関数**です。(重み、入力)を与えるとそれが出力を計算し、それ以上の何もありません。重みは学習中に固定された数十億の学習済み数字です。入力はあなたが送るテキストです。それは関数なので、同じ設定下の同じ入力は毎回同じ基礎スコアを生成します。実行間の変動はモデルが考え方を変えるのではなく、単語を選ぶサンプリングステップから来ます。

その関数が運ぶ知識は損失的に保存され、すべての重みにわたってスミアされ、圧縮されており、取得可能なレコードとしては保存されていません。読める行もなく、編集できるセルもありません。モデルが「知っている」事実は、実際には重みが要求時に再構築する強いパターンであり、時々わずかに間違って再構築します。事実がどこに存在するかを指すことはできず、再学習なしで1つの事実をパッチすることはできません。

実際的なアプローチは、知識ベースをクエリするのではなく、呼び出す固定関数としてモデルを扱うことです。言語のシェイピング、テキストの推論、指示に従うことに頼ります。特定のもの、現在のもの、または監査可能なものが必要な場合は、重みがそれを保有することを信じるのではなく、入力自体にその情報を入れてください。その1つの習慣、事実を期待するのではなく事実を提供することは、確信を持った間違った答えの大部分を防ぎます。

JunoWhat a model actually is モデルを重みと入力の純粋な関数と考えてください。同じ入力、同じ設定、同じ基礎スコア、実行間の変動はサンプリングから来ます。その知識は重みにわたって損失的に圧縮されているので、そこから1つの事実を調べたり編集したりすることはできません。それに応じて構築してください。呼び出す固定関数として扱い、重みがそれらを覚えることを期待するのではなく、入力を通じて特定のまたは現在の事実を提供します。

デプロイされたモデルはAPIの背後にある凍結された重みです。数十億の学習済み数字であり、学習時に固定され、(重み、入力)の純粋な関数を計算しています。その動作が実際に変わる唯一の時間は、プロバイダーが異なるモデルを提供する時です。

それは強い運用上の端を持っています。同じエンドポイントの下での静かな更新は、あなたのコードの1行が変わることなく出力をシフトできます。特定のモデルバージョンをピン留めし、そのバージョンを契約の一部として扱い、新しいものを採用する前に評価を再実行してください。信頼に基づいて「最新」を採用することは、働くシステムが静かに回帰する方法です。

重みは圧縮された パラメータメモリであり、損失的で監査不可能です。バージョン間でモデルが「知っている」ことをdiffすることはできず、その事実を列挙することもできず、与えられた事実がそこにあるまたは正しいことを証明することもできません。ですから、パラメータ回想の正確性に負荷をかける事実を置くことはありません。間違った答えがあなたを傷つけるなら、制御でき引用できるソースから入力で事実を提供し、モデルをソースではなくそのソースの上で推論する役割に保ってください。

意図的に重みを変更することはファインチューニングが行うことであり、それが何をもたらすかについて明確であることは価値があります。ファインチューニングは確実に動作と形態、トーン、フォーマット、タスク習慣をシフトしますが、信頼できる問い合わせ可能な事実ストアを提供しません。動作をシェイプするために到達します。信頼する必要のある知識をインストールするためではありません。事実を入力に保ち、スタイルを重みに保ち、どちらも驚くことはありません。

JunoWhat a model actually is 重みは凍結されるので、プロバイダーが異なるモデルを提供する時だけ動作が移動します。バージョンをピン留めし、それを契約の一部にし、アップグレード前に評価を再実行してください。静かなスワップがあなたが眠っている間にあなたを回帰させます。パラメータメモリは損失的で監査不可能です。それが知っていることをdiffすることはできません。制御するソースから入力に負荷がかかる事実を保ち、回想では保たないでください。ファインチューニングは動作と形態をシフトし、信頼できる事実ストアではありません。モデルがどのように応答するかのために使用してください。それが何を知るべきかのためではなく。

次トークンを予測する

その数字の塊が配置されると、モデルは正確に1つの仕事をします。テキストの次のチャンクを何度も何度も予測することです。

ここでスローモーションでのループです。あなたはそれにいくつかのテキストを与えます。それは可能な次のチャンクのすべてに対する確率を生成します。それが知っているテキストの数万のオプション。「フランスの首都は」の後に、チャンク「東京」は97%のスコア、「a」は1%のスコア、他はすべてほぼ何もありません。

モデルはその後1つのチャンク を選び、それをテキストに追加し、次を選ぶために全体を再度実行します。答えが終わるまで繰り返します。

それが全体のエンジンです。単一の思想として読む返信は、1度に1チャンク構築されました。各チャンクは可能性の最新のランキングから選択され、文がどこに向かうかについて「次に何が起こりそうか」以上の計画がありません。チャット、コード、翻訳、ツール使用、推論を使用するすべての機能は、この同じループが下で実行されています。

あなたの次の単語を提案する電話キーボードは、小型の同じ考えです。違いは推測の背後にある数十億のパラメータです。十分なテキストで学習された「最も可能性の高い次のチャンクは何か」は、作業コードと明確な説明を書くのに十分です。しかし、基礎となる動きは変わりません。それは理解ではなく、保存されている答えをルックアップするのではなく、予測です。

JunoPredicting the next token エンジン全体は1つの小さなループです。これまでのテキストを読み、可能な次のチャンクのすべてにスコアを付け、1つを選び、答えが完成するまで再度実行します。モデルは文がどこに向かうかについて計画を持たないので、単一の思想として読む返信は実際には1度に1チャンク構築されました。それは理解ではなく、保存された答えを検索しているのではなく、予測です。

モデルは1つのことを繰り返します。各ステップで、それまでのすべてのテキストを読み、そのボキャブラリー内のすべてのトークン(テキストのチャンク、多くの場合、単語の一部)に対してスコアを出力します。数万個を一度に。これらのスコアは確率分布になり、モデルはそれからサンプリングします。その後、そのトークンをテキストに追加し、次のトークンを選択するために全体を実行します。「フランスの首都は」の後に、「東京」はほとんどすべての確率を保持し、他はすべてほぼ何もありません。

このフィードバックが**自己回帰**と呼ばれる理由です。各新しいトークンはこれまでのすべてのテキストに依存しており、それはすでに書いたトークンを含みます。グローバルな計画もありませんし、編集する下書きもありません。モデルは一度に1トークンを確認し、トークンを戻すことができないため、コーナーをペイント自分自身に入れることができます。自信に満ちた初期の単語は、文の残りを尴尬した経路に強制し、その後完成しなければなりません。

その単一の事実は、実際に使用するいくつかのことを説明します。モデルに最終的な答えの前にその推論を書き出せるようにすることは役に立ちます。なぜなら、より多くのトークンはより多くのステップと、答えを提出する前に問題に費やされたより多くの計算を意味するからです。出力構造は厳密に左から右に決定されるので、応答の形状は進むときに設定され、事前に計画されていません。そしてその同じループがツール使用を駆動します。モデルは呼び出しを形成するトークンを予測し、あなたがそれを実行し、結果は次の予測のためのより多くのテキストとしてフィードバックされます。

JunoPredicting the next token 各ステップで、モデルはそのボキャブラリー内のすべてのトークンにスコアを付け、1つをサンプリングし、フィードバックを返し、繰り返します。そのフィードバックループが自己回帰が意味するものです。計画もなく、元に戻すこともできません。トークンごとに確認し、コーナーをペイント自分自身に入れることができます。それが答えの前に推論を書き出すことが役に立つ理由であり、ツール使用が同じループであり、結果がフィードバックされる理由です。

生成は構成上順次的です。モデルは1つのトークン(テキストのチャンク)を生成し、それをフィードバックし、次のトークンを予測します。つまり、各出力トークンはネットワークを通じた個別の前方パスです。入力を読むことは相対的に安いです。一度に処理されます。遅い、高い部分はモデルが書いているです。レイテンシとコストは出力長でスケールし、入力長ではありません。実際的なレバーはそこから落ちます。出力を短く保ち、ユーザーが完全な返信を待つ代わりに進捗を見ることができるようにトークンをストリーミングします。そして、捨てられるような詳細なフォーマットのために支払わないでください。

もう1つの結果は正確性です。グローバルな計画がないため、単一のパスは自己修正ではありません。モデルは左から右に確認し、トークンが外に出ているトークンを修正することはできません。それが、正しい必要のあるすべてが検証か最初の下書きの秒パスを望む理由であり、そして答えの前にそのシートを書くモデルはより良い傾向がある理由です。あなたはそれにより多くのステップを買っています。最初の生成を判決としてではなく、下書きとして扱ってください。

配線する価値のある1つのレバー。多くのセットアップは、トークンごとの確率(logprobs、それが選んだ各トークンのモデルの自信スコア)を公開しています。あなたはそれらを読んで低信頼スパンにフラグを立てたり、モデルが不確かだった答えをゲートしたり、第二パスまたは人間への不確実なケースをルーティングしたりできます。それはあなたがすでに持っているクレジット信号で、「モデルはここで間違っているかもしれません」を何かに変えています。推測するのではなく、プログラム的に行動できます。

JunoPredicting the next token すべての出力トークンは独自の前方パスなので、コストとレイテンシは出力長を追跡し、入力ではありません。返信を短く保ち、ストリーミングし、破棄するフォーマットのために支払わないでください。計画もなく、元に戻すこともありません。単一のパスは自己修正しません。正しい必要があるすべてに対して検証パスを追加してください。logprobsごとのトークンを読むことができる場合、モデルが最も確信していなかったスパンに使用してください。それはあなたがすでに持っている信頼度であり、滅多に費やされません。

ランダムネスダイアル

モデルが常に最高スコアのチャンクを掴んだ場合、同じプロンプトに対して同じ答えを何度も何度も渡され、その答えはしばしば平らで反復的です。ですから、ほとんどの場合、ピックに少しのランダムネスがあります。通常は高確率のチャンクを取りますが、常に非常に上位のものではありません。これがなぜあなたが正確な同じ質問を2回尋ね、2つの異なる返信を得るかです。それはシステムが意図したように動作する欠陥ではなく、設計です。

あなたはモデル呼び出しコードのチャプターで呼び出す時に設定する**温度**と呼ばれる設定を通じてランダムネスの量を制御します。直感は今持つ価値があります。低温では、モデルはトップ選択肢に近い。フォーカスされた、一貫した、予測可能な、それはあなたが請求書から数値を引き出したり、テキストをカテゴリーにソートするために必要なものです。より高い温度では、より低い確率チャンクがより頻繁に選択されます。より多様で創造的で、より間違った場所に歩く可能性があります。ブレーンストーミングと創造的な執筆より高い端を望んでいます。正しい答えがあるものは低端を望んでいます。

だから単一のダイアルはモデルを「慎重で反復可能」と「驚くべき創意」の間でスライドさせます。温度がスライダーを変えるだけで同じ予測ループです。それは、モデルが最も安全な推測をどれだけ大胆に到達するかを変えるだけです。

JunoThe randomness dial 温度はランダムネスダイアルです。右な答えのあるタスク、抽出やソートなどの場合は低くオンにし、フォーカスされた反復可能な返信を取得します。ブレーンストーミングと創造的な仕事のために上げると、より多くの多様性とより多くの間違った機会を得ます。同じ予測ループ、より大胆または安全な到達だけです。

モデルが次のチャンクを選択する前に、それはすべての候補に対する確率を持っています。温度はサンプリング前にその分布を再形成します。低温は分布を単一の最も可能性の高いトークンに向かってシャープ(トップピックを常に取るのに近い)、出力が焦点を当てられた反復可能になります。高温はそれを平坦にし、可能性の低いトークンに実際のチャンスを与え、出力はより多くのバリエーションと間違った漂流する可能性が高くなります。同じプロンプトが異なる返信を返すことができる理由はこれです。ドローが起きており、温度はオッズがどの程度スキュー されているかを設定しています。

温度はここで唯一のノブではありません。Top-p(確率がpまで追加される最小トークンセットのみをサンプリング)およびTop-k(最も可能性の高いk トークンのみ)の両方は、サンプリング前に候補プールをトリムします。温度と効果が重なるので、それらを3つの独立した1ではなく、1つのランダムネス設定として考えるのに役立ちます。

実際的なアプローチは、任意のデフォルトに信頼するのではなく、タスクごとに明示的に温度を設定することです。抽出、分類、および後で解析する構造化出力を発行するすべてのもののために低く行きます。後で解析する多様性が重要なアイデアと起案で高くなります。相互作用を見てください。高い温度をtop-pの1でスタックすると、全体の尾が再生に残り、必要な信頼できる、解析可能な結果が対象に対して機能します。

JunoThe randomness dial 温度は、サンプリング前に確率分布を再形成します。低はトップトークンに向かってシャープします。フォーカスされた出力のため、高はそれを平坦にして多様性のためです。temperaturetop_p、およびtop_kを、3つの独立したものではなく、1つのランダムネス設定として扱います。タスクごとに設定します。抽出、分類、および構造化出力の場合は低です。アイデアの場合は高いです。解析可能な結果が必要な場合、高い温度をtop_p 1とペアリングしないでください。

温度は、サンプリング前にスコア分布をスケールし、有名なショートカットはそれを0に設定し、出力を決定論的と呼ぶことです。それは接近していますが、保証ではありません。浮動小数点数学、サーバー側のバッチング、および大規模モデル内のルーティングでも、0での小さな非決定性が導入されます。また、正確一致キャッシングまたは繰り返されたプロンプトのバイト相同出力を仮定するテストの正確一致を構築しないでください。その仮定は間欠的に失敗し、間欠的な失敗は高価な種類です。

これは、サンプル化された動作をテストする方法を形成します。単一の実行は、**確率的**システム(実行から実行に出力が変わるシステム)についてほぼ何も伝えません。何度も実行し、出力の分布を見て、プロンプトを評価してください。それがどの程度仕様に着地するか、分散がどの程度広いか、テールが間違ったところに行くところ。それはあなたの評価が行う仕事であり、彼らは1つの幸運なパスではなく、スプレッドを見るのに十分なサンプルを望んでいます。

温度、top-p(最小トークンセットのサンプリングのみ確率が累積pに到達)およびtop-k(最も可能性の高いk トークンのみを保持)を、反射で設定する3つのダイアルではなく、一緒にチューニングする1つのサンプリング予算として扱います。それでもタスクに対して許容可能な多様性を与える最も低いランダムネスを選択してください。3つすべてを一度に締め付けることは、出力を反復的で脆くなったものに陥れることができます。一方、それらをすべて開いておくことはあなたが周りを検証しなければならない分散を渡します。両側のコストは実際ですので、意図的に費やしてください。

JunoThe randomness dial 温度0はほぼ決定論的であり、保証されていません。浮動小数点、バッチング、および内部ルーティングが非決定性をリーク するため、正確一致キャッシングおよび正確一致テストをスキップしてください。複数の実行にわたってサンプル化された動作を評価し、1つのパスではなく分布を読みます。それはあなたの評価が行う仕事です。temperaturetop_p、およびtop_kを1つのサンプリング予算としてチューニングし、許容可能な多様性をまだ与える最も低いランダムネスを選択してください。

トークン

モデルが予測する「チャンク」には名前があります。トークン。トークンはテキストの一部で、多くの場合は単語全体であり、時には1つだけの部分です。一般的な単語は通常単一のトークンですが、より長い単語またはレアな単語はいくつかに分割されます。

"tokenization"  ->  "token" + "ization"
"unbelievable"  ->  "un" + "believ" + "able"
"cat"           ->  "cat"

なぜ、単語全体または単一の文字を使用する代わりにテキストをこれらの奇妙な部分に切り刻みますか?それはトレードオフです。単一の文字はすべてのシーケンスを計り知れないほど長くし、長さはモデルが計算する必要があります。単語全体は数百万のエントリのボキャブラリーを必要とし、誰かが単語を発明するか、タイプミスを行う最初の時間に壊れます。トークンは中間パス。数万の一般的な部分の固定されたボキャブラリーは、モデルが見たことのない単語を含むすべてを綴るためにスナップできます。

ここは多くの人を驚かせる下のフード結果です。モデルは手紙を見えません。それはトークンを見ます。これは実際には、それらのチャンクのIDナンバーです。ですから、簡単に見えるタスクは難しいことができます。単語の文字を数えて、文字列を反転させ、「東京」には3つのrがあることに注目します。

それは昏い。それはすべて個々の文字を認識しません。完成した塊のパンで小麦粉の個々の粒をなめることができない方法と同じです。モデルがスペルまたは文字数タスクに失敗したとき、これが理由であり、修正は通常、代わりに通常のコードでその部分を行うことです。

トークンはまた、あなたが常に気にかけるようになる2つのことの単位です。

  • お金: プロバイダーはトークンごとに請求します。あなたが送信したトークンとモデルが書き戻すトークンの両方。したがって、長いドキュメントとのテキストの長い答えが外出されるコストが高くなります。英語の大まかなゲージは、1トークンあたり約4文字、または75語のすべての100トークンです。コードおよび他の言語はしばしば、より多くのトークンに分割されます。これはコストがより高い理由の一部です。コードからモデルを呼び出すときに、これに直面します。
  • 制限: モデルが一度に処理できるトークン数に上限があり、これが次のセクションです。
JunoTokens トークンはテキストのチャンク、通常は単語または単語の一部であり、モデルはそのチャンクを文字ではなくIDナンバーとして読みます。それが数えやスペルで失敗できる理由なので、その仕事を単純なコードに渡してください。そしてあなたはトークンごとに両方向で支払い、一度に収まるにはキャップがあるので、より少ないトークンはより少ないコストと多くの部屋を意味します。

モデルはトークンを予測します。これは多くの場合は単語全体であり、時には破片です。分割を行う部分は**トークナイザー**で、それは最も一般的な文字のペアを繰り返しマージして、数万個の固定セットを持つまで習得されたボキャブラリーから機能します(通常、バイトペアエンコーディングまたはBPEと呼ばれるスキーム)。その履歴は、頻繁に使用される単語が単一のトークンになる理由です。レアなものは部品に断片化されます。一般的なパターンは学習中にマージされました。一般的でないものはそうではありませんでした。

2つの実用的な事実がこれから落ちます。まず、モデルは文字を処理しません。トークンIDのみです。だから、文字レベルの操作(文字を数える、文字列を反転させる、正確な位置でスライスする)はプロンプト内でぐらついており、あなた自身のコードで信頼できます。その仕事をコードにプッシュして、モデルに言語部分をさせてください。2番目に、トークンはモデル固有です。トークンカウントは移植できません。同じ文は、異なるトークナイザーで異なる数のトークンをコストすることができます。コストや窓に内容を適応させる瞬間重要です。

構築するための実用的な動き。文字長からトークンカウントを眼球に使用しないでください。モデルが実際に使用するトークナイザーでカウントしてください。なぜなら、それが請求される数と制限されている数だからです。モデルをコードから呼び出すときにすべてのこれに具体的に遭遇します。あなたが送信するカウントとあなたが取得するカウントは請求です。

JunoTokens トークナイザーは習得されたボキャブラリー(BPE)を使用して分割されます。これが一般的な単語が1つのトークンであり、レアな単語がフラグメント化される理由です。トークン化はモデル固有です。文字から推測するのではなく、モデル自身のトークナイザーでカウントしてください。そして、文字レベルの仕事(カウント、反転、正確なスライス)をコードに保ち、プロンプトではなく。

トークンはあなたが出荷するすべての指標です。トークンはトークナイザーの習得されたボキャブラリーからのテキスト部分であり、トークンあたりの請求と固定コンテキスト上限はあなたのコストと設計を形成する2つの数字です。平凡な英語散文のために慰めの4文字トークンのルール保持し、生産が住んでいるまさにそこで崩壊。コード、JSON、深くネストされたフォーマット、および非ラテン文字はすべて、ヒューリスティックが予測するより多くのトークンに断片化されます。実際のトークナイザーで予算、ゲージではなく、またはあなたのコストと容量の推定は、あなたが実際に送信するペイロードについて間違っています。

断片化は均等に分散されません。それはスケール時のフェアネスとコストの問題です。同じ意味は、非ラテン言語で、その英語版よりもいくつかの倍のトークンをコストすることができます。だから同じ機能は静かにいくつかのあなたのユーザーにとってより高価で遅くなります。誰かに平らな価格やフラットなレイテンシを約束する前に、言語ごとに測定する価値があります。

野外からの2つ以上の習慣。フォーマットは支出です。空白、冗長な区切り文字、および装飾的なマークダウンはすべてゼロ追加意味に対するトークンをコストします。ですから、モデルに供給する構造を圧縮しておき、あなたのコードがプレゼンテーションを後で追加するようにしてください。そして、クリーン、通常のテキストを供給してください。レアまたは奇形のトークン(モジビケ、失われた制御文字、奇妙なエンコーディング)はボキャブラリーの薄い、未学習コーナーに座り、奇妙な出力をトリガーできます。これは異国的ではありません。それはあなたが信頼するトークン予算と驚かせるものの違いです。

JunoTokens 4文字トークン実行ルールはコード、JSON、および非ラテン文字で壊れます。これはあなたの実際のトラフィックが住んでいるところです。実際のトークナイザーで予算を立ててください。非ラテン言語は同じ意味に対して数倍多くのトークンをコストすることができます。これは実際のコストとフェアネスギャップです。言語ごとに測定する価値があります。装飾的なフォーマットを剥ぎ取ってトークンを保存し、クリーンなテキストを供給して、レアまたは奇形のトークンが奇妙な動作を購入しないようにしてください。

コンテキストウィンドウ

**コンテキストウィンドウ**は、モデルが一度に受けることができるテキストの量であり、トークンで測定されます。それをモデルのデスクの大きさとして想像してください。単一のリクエストに関わるすべてがその机の上に一度に収まる必要があります。あなたの指示、これまでの会話、あなたが貼り付けたドキュメント、そしてモデルが書いている返信。

なぜそもそも制限があるのでしょうか?それは予測の仕方に由来しています。次のトークンを選択するために、モデルは入力内のすべてのトークンがどのように他のトークンに関連しているかを比較するので、「それ」が3文前の猫を指すことができます。そのすべてのすべての比較はモデルが通路の意味を追跡することができます。また、長い入力を処理するのに非常に費用がかかります。プロバイダーは、各リクエストを管理可能に保つために上限を設定します。コンテキストウィンドウ。

机がいっぱいになると、何かが来る必要があります。会話が長く成長してウィンドウをオーバーフローするほど長ければ、最古の部分は取り除かれ、モデルはそれらを見ることができなくなります。これが長いチャットが最初に何を言ったかを「忘れる」ように見える理由です。人間的な感覚で忘れなかった。これらのトークンは机から降りています。また、モデルが机の上にあるもので最初と終わりに最も注意深く支払う傾向があり、中央に埋められたものを追跡できなくなる傾向があるので、重要なテキストをどこに配置するかは、あなたが窓いっぱいになるときに重要です。

さて、ほぼすべての初心者を捕まえるポイント。そしてそれはそれ以降のすべてよりも重要です。モデルは個別のリクエスト間でメモリーを持っていません。その数字が凍結されていることを覚えてください。各呼び出しは空の机から始まります。モデルはあなたの最後の質問、あなたの名前、または1分前から何かを覚えていません。

チャットアプリは、アプリが静かにすべての履歴を各新しいメッセージで再度送信しているため、1つの流動的な会話のように感じます。連続性はモデルが持つモデルの周りのソフトウェアが構築するものであり、何かではありません。

その単一の事実は、ここから先のすべての構築を形成します。モデルが何かを知ることを望む場合は、その要求でそれを机に置く必要があります。これまでの会話、ユーザーの詳細、関連するドキュメント、すべてのもの、毎回。このハンドブックの大部分は、本当に1つのことをよくするためです。適切なテキストを机に乗せます。

JunoThe context window コンテキストウィンドウはモデルの机です。すべてのリクエストがそれに適応する必要があり、それがオーバーフローするとき、最古のテキストが落ちます。モデルは呼び出し間でメモリを保持しないため、アプリは継続的なチャットを偽造するために毎回履歴全体を再送信します。あなたの仕事はここから、そのデスクに毎単一の要求で適切なテキストを得ることです。

コンテキストウィンドウを、1つのリクエストが費やすことのできるトークンの固定予算として考えてください。あなたの指示、実行中の会話、貼り付けられたドキュメント、および生成される答えをカバーしています。窓が存在するのは、モデルが入力を読む方法のためです。**注意**と呼ばれるメカニズムは、すべてのトークンを他のトークンに対して比較して、「それ」が指す名詞に解決する方法を理解します。その比較はモデルが通路全体の意味を解決することを可能にし、その コストはほぼ入力長の二乗で成長します。トークンを2倍にして、仕事を2倍以上にします。これが長い入力が遅く実行され、コストを実行する真の理由です。

窓に収まることは、モデルがその中のすべてを使用していることと同じではありません。**中空で失われた**と呼ばれるよく文書化された効果があります。モデルは入力の開始と終了に最も信頼できるように注意し、中央に駐車されたマテリアルをスキムすることができます。だから、重要な指示とデータを、大量のテキストに埋められたのではなく、プロンプトの上部または下部の近くに配置してください。

この半分の半分は記憶であり、重要な事実は、モデルが**ステートレス**です。個別のリクエスト間でメモリーは何も覚えていません。各呼び出しは、空のウィンドウで開始されるため、モデルが会話をこれまで知っている唯一の方法は、毎回それを再度送信することです。その履歴を再送信し、形作ることはモデルの仕事ではなく、あなたの仕事です。チャットが窓を過ぎて成長するにつれて、古い回しをトリミングしたり、短い要約に置き換えたりして、自分で管理するので、あなたが保つトークンはまだ重要なものです。

それはこれらのモデルの構築の中心にコンテキスト構造を置きます。ウィンドウに何が入るか、どちらの順序か、そして前に何を圧縮するかを決定することはほとんどの仕事であり、プロンプティングはあなたがそれを意図的に形作る方法を学ぶところです。

JunoThe context window ウィンドウは、指示、履歴、ドキュメント、および返信をカバーするトークン予算です。注意は長い入力をほぼそれらの長さの二乗にコストします。モデルは失われた中点効果に悩まされるので、その機能を開始または終了の近くに置きます。モデルはステートレスですので、会話履歴を再送信およびトリミングしているのはあなたです。毎回。

コンテキストウィンドウを目標ではなく上限として扱うものです。これは、あなたの指示、実行中の履歴、取得されたドキュメント、および出力をまたいでスパンするトークン予算です。

あなたがそれに入れるすべてのトークンはお金とレイテンシをコストします。なぜなら、注意ステップ(モデルが入力を読むために実行するすべてのトークン比較)は、ほぼ長さの二乗でスケールするからです。さらに悪いことに、有効なリコールは制限に達するずっと前に低下します。失われた中点効果は、中心に埋められたマテリアルの精度が、技術的には適合する場合でも落ちることを意味します。だから、すべてをダンプするのではなくコンテキストをキュレートしてください。ソースデータが大きい場合は、全体のコーパスを貼り付けするのではなく、RAGで関連する部品のみを取得してください。

順序はレバーであり、詳細ではありません。プロバイダーは、プロンプトキャッシングを通じて変更されないプレフィックスの計算を再利用できます。ここで、キャッシュされた内部状態はKVキャッシュであり、モデルの、それはすでに読んだトークンのための保存された仕事です。安定したコンテンツ最初(システム指示、固定リファレンスマテリアル)および変数コンテンツ最後を置き、繰り返される呼び出しはより安くより速くなります。プロンプトの前部がキャッシュから提供されているためです。そのプレフィックスを無視して再編成すると、キャッシュが無効になり、あなたは完全な価格をもう一度支払います。

メモリはターンを横切ります。モデルが持つ機能ではありません。それはあなたが行う工学的な選択であり、各オプションはそれ自身のやり方で失敗します。

  • 単純なウィンドウ処理、最近のターンを保つのは安いですが、静かに初期の事実を削除しますユーザーはまだあなたがそれを知っていることを期待しています。
  • 要約はより少ないトークンでより多くの履歴を保持しますが、詳細を失い、静かにそれ自身の誤りをエンコードできます。
  • 検索は関連するだけをプルバックしますが、インデックスが正しい部品を返すことに完全に依存しています。

ケースごとに選択し、あなたが選択するいずれかが最終的に間違ったものをサーフィンすると仮定しています。それを信頼するのではなく計器をしてください。

JunoThe context window ウィンドウは目標ではなく上限です。コストとレイテンシはすべてのトークンで上昇し、リコールは制限に達する前に腐ります。だから、キュレートし、大きなものに対して取得に依存しています。安定したコンテンツ最初、変数最後。だから、プロンプトキャッシング(KVキャッシュ)は実際に支払います。ターン間のメモリーはウィンドウ、要約、および取得の間のあなたの設計選択です。3つすべてで、私はアウトされています。だから、あなたが選ぶものを計器してください。

モデルが知らないもの

すべてのモデルの知識は学習中に焼き込まれたため、それが知っているのは、その学習データにあったことだけであり、そのデータは過去のカットオフポイントに収集されました。2つの制限がこれからまっすぐ落ちます。

まず、カットオフの後に起きたことは知りません。先週のニュースまたは今月出た図書館について聞いてください。そして、それは実際の考えがありません。2番目に、プライベートなことは一度も知りません。あなたの会社の内部ドキュメント、ユーザーの注文履歴、データベースの内容。それのどれも、公開されたテキストで訓練されたわけではなく、どんなに上手に聞いても知ることができません。

より静かな制限もあります。モデルは通常、「知っている」何かがどこから来たのか、あなたに言うことはできません。知識は別々の事実としてではなく、その中で一緒にブレンドされているからです。それはあなたに引用文を書くことができます。しかし、それは実引用をルックアップするのではなく、引用がどのように見えるべきかを予測しています。

これは、後で出会うRAGと呼ばれるテクニックの理由です。最近のイベント、または独自のプライベートデータについてモデルが回答することを望む場合は、再学習しません。あなたは関連するテキストを自分で取得し、リクエスト時にそれを机に設定します。そのため、モデルは推測する代わりに事実を持っています。モデルは、特定の事実の信頼できる井戸ではなく、あなたが与えるテキストよりもはるかに理性的です。

JunoWhat the model does not know モデルは、学習データのカットオフ前に、その学習データにあったものだけを知っているため、最近のイベントと何かプライベートを逃し、その事実がどこから来たのか確実に言うことはできません。現在のまたはプライベート情報が必要な場合、再学習しないでください。関連するテキストを取得し、リクエストでモデルに提供してください。モデルをあなたが与えるものを推測する信頼できるメモリーではなく、その上で推測するものとして扱ってください。

モデルの組み込み知識、その**パラメータック知識**(その重みにエンコードされた事実、学習中に設定されるチューニング可能な数字)は、学習カットオフで凍結されます。その日付の後に起きたことは何もそこにはなく、何もプライベートではなく、重みは公開テキストで形成されました。だから記憶はあなたに2つの予測可能なギャップを与えます。最新性、カットオフの後のすべて、およびプライバシー、公開学習データに決してあったことはありません。

これら2つのギャップは、本当に2つの側面から見た1つのギャップであり、同じ方法で閉じます。必要なテキストをリクエストに入れてください。あなたは最近の記事または関連データベース行を自分で取得し、質問の横に提供するため、モデルはそれを回想するのではなく、事実を読みます。これはRAGの核となる考え。取得増強生成。あなたが回答が現在のまたは独占的な情報を反映しなければならないときにそれを使用します。

パラメータック知識も、それに添付されたソースも実行します。事実は重みにわたってブレンドされ、離散エントリとしての出所がないので、モデルは何かがどこから来たのか確実に言うことができません。それが生成する引用は取得された記録から見上げるのではなく、生成されたようにそれを見てください。これはまさに、あなたが提供するテキストに答えを接地することが努力する価値がある理由です。

構築するためのプラクティカルルール。現在のまたは独占的な事実をメモリーから回想するようにモデルに要求しないでください。事実が正しい必要があれば、それを取得して提供し、モデルがそれを推測させてください。

JunoWhat the model does not know パラメータック知識は、重みにエンコードされた事実であり、バージョン管理されていず、監査不可能です。現在のまたは独占的な情報は回想から不可能なため、答えをあなたが提供する取得されたソースに接地し、そのソースを引用してください。モデルの言葉。両方のギャップは同じ方法で閉じます。関連するテキストを取得してリクエストに入れてください。これはRAGの背後にある考え。ルールとして、モデルがメモリーから現在のまたは独占的な事実をリコールすることを持たないでください。それらを供給し、それが推測させてください。

モデルのパラメータック メモリー、その重みに保有されている知識(学習中に固定されるチューニング可能な数字)はバージョン管理されていない監査不可能です。それを拡張することはできません。クレームがどこに存在するかを指す。または、ドリフトしていないことを確認していません。ですから、正しい、現在のまたはコンプライアント必要なもののために、モデルの言葉を信頼しないでください。答えを検索されたソースに接地し、そのソースを引用してください。組み込みナレッジを流暢な事前ではなく、記録システムとして扱ってください。

カットオフは、1つの単一の日付が示唆するよりも不鮮明です。トレーニングデータは、その日付まで均一ではありません。最近のマテリアルはより薄く、古い、よくカバーされたマテリアルより消化されていません。だから、最近だが前カットオフの事実は不均一に知られています。モデルは、1年前のものについて自信を持ち、間違っているが、10年前の事実を釘止めしている可能性があります。これが「それはカットオフの前のですか?」は、見た目の弱い保証であり、正しい必要なものを検索する理由です。

ギャップのための正しいツールに到達してください。2つの一般的なものが相互交換可能ではないためです。検索はリクエスト時に事実を提供し、ソースの更新とともに現在のままです。ファインチューニング、あなた自身の例で学習を続けることは、フォーム、動作、トーン、フォーマット、モデルはあなたの慣例がシフトするかのように従わるので、知識を注入するための貧弱、古い方法です。学習された事実は再び凍結されます。更新が難しく、ソース化されていません。取得を使用してそれは何が真実ですか。ファインチューニングで、どのように聞こえるべきか。

JunoWhat the model does not know パラメータック メモリーはバージョン管理されていない監査不可能です。正しい、現在のまたはコンプライアント必要なすべてのために、答えを検索されたソースに接地し、モデルの言葉ではなくそれを引用してください。カットオフは不鮮明であることを覚えてください。最近だが前カットオフの事実は不均一に知られています。だから正しい必要なものをすべて取得してください。そしてギャップに合ったツールマッチをしてください。検索は事実を供給し、ファインチューニングはフォーム、動作をシフトし、知識を注入する古い方法です。

モデルがなぜものを作り出すのか

時々モデルは完全な自信を持って何か偽を述べます。誰も言わなかった引用。存在しない関数。決して書かれなかった研究への引用。これは**幻覚**と呼ばれ、最後のいくつかのセクション後、それはなぞなぞよりも避けられないように感じるべきです。

理由は、モデルに「真実」対「偽り」の内部感覚がないことです。それは「可能性の高いテキスト」対「不可能性のテキスト」のみを持っています。ほとんどの場合、それらはラインアップするので、それが学習したテキストでは、本当の文は偽のステートメントよりもはるかに一般的です。つまり、可能性の高い継続は通常、正しいものです。

しかし、モデルが間隙に当たる場合、それは決して訓練を受けたことがなく、見たことができなかったプライベートデータがあります。それは止まって間隙にフラグを立てません。最も可能性の高い継続を確実に言うことはできません。それが唯一行うことをします。最も確率の高い継続を生成します。

自信に満ちた、十分に形成された、間違った答えはしばしば、最も可能性の高いサウンドスタートであることです。それを流暢にするのと同じ機構が、それが間違っているときに流暢にします。

これはあなたが坐る部分です。幻覚は、あなたが完全にプロンプト離れることができるグリッチではありません。あなたはそれを減らすことができます。後のチャプターは方法を表示します。モデルは「知りません」と言うことが許可されていることを伝えることはわずかに役立ちます。あなたが提供するテキストからのみ答えるようにそれを要求することは、ギャップがないためにはるかに役立ちます。なぜなら、今、埋めるギャップがないからです。しかし、傾向はモデルが根本的に何であるか。それはグリッチではなく、事実チェッカーの内部での確率マシンですし、耐久性のある修正は構造的です。それが必要とする事実を与え、重要なことを確認するのではなく、それを訓練に含まれているのか望んでください。

この章から上に1つのルールを実行してください。モデルの自信は、それが正しいかどうかについて何も伝えていません。流暢さと正確性は同じプロセスで生成され、常に分かります。単一の答えが間違う可能性があるかのように構築します。単一の答えすべてがない可能性があります。

JunoWhy models make things up 幻覚はモデルが自信を持ってギャップを埋めることが右に聞こえるテキストが、そうでなく、「可能性の高い」と「本当の」ことを知っているだけなので。起こる頻度を低下させることはできますが、完全にプロンプト離すことはできませんので、安全な動きはモデルに必要な事実を与え、重要な答えをチェックしています。そして大きなもの、自信に満ちたトーンは証拠ではなく、決して確実性に頼ってください。

モデルが引用、関数、または引用を発明し、完全な自信を持ってそれを述べるとき、それは幻覚であり、それはモデルがどのように機能するか直ちに落ちます。モデルには真実のための信号がありません。それは「可能性の高いテキスト」対「不可能性」によって継続をスコアします。ほとんどの場合、可能性の高いと本当にこの重複するので、本当のステートメントがそのトレーニングデータを支配しました。

幻覚スパイクはまさにそのオーバーラップが分解する場所。その知識の端、レアまたはニッチなトピック、およびあなたのプライベートデータで、モデルはまだ最も可能性の高い継続を生成します。そして、流暢で、十分に形成された、間違った答えは、多くの場合、最高スコアですか。

そのため、wording ただし単独では修正できませんが、実際に多くの助けになる軽減をランク付けできます。最大のレバーはグラウンディングです。実際の事実をプロンプトに入れ、モデルに提供されたテキストからのみ答えるようにしてください。理想的には引用してください。今、埋めるギャップがないために、それが凍結した学習から埋める場所がありません。供給するために正しいテキストを検索することは、それ独自のテクニック、RAGで覆われています。

その下で、モデルに明示的なエスケープハッチを与える。答える「知りません」許可。推測する代わりに。それは発明する圧力の一部を削除します。そして、温度を保つ(言葉選択のランダムネスダイアル)ファクティカルワーク用に控えめに保つなら、高いランダムネスは、ほとんどのドアを広げます。おそらく、オフベース継続。

実用的な結果。あなたが提供するコンテキストに制約モデルをしてください。そして、重要な出力を確認してください。プロンプトフレーズを、これら構造的なアップの移動の上で小さな調整として扱いますし、唯一の防衛として扱われません。確かに聞こえるモデルがあなたに正しいかどうかについて何も伝えていて、流暢さと正確性が同じプロセスから来ました。ルーティング離れて一言で。

JunoWhy models make things up 幻覚は、モデルが流暢で、可能性の高いテキストを出力することが、真実の内部チェックではなく、その知識の端でそれを取得します。プライベートデータを見たことがありません。ランク付けが修正影響させることができます。そこに束を接地(最大のレバー)、それが「知りません」と言う部屋を与えるように、答えるだけでテキストから供給コンテキストを提供し、それを引用し、保つtemperatureファクティカルワーク用に控えめに保つ。コンテキストに制約し、重要な出力を確認します。ワーディングトリックだけに頼まないでください。

幻覚はモデルが、自信を持ち、十分に形成されたテキストが偽であることがある。アーキテクチャのプロパティであり、あなたがパッチするバグ。モデルはランク付けをしますし、真実の信号を持たずに継続するので、その学習の端、レアトピック、新鮮なイベント、すべてプライベート、それはまだその最も可能性の高い推測を出力します。あなたはこれを削除しません。ジョブは、システムを設計するために間違った答えが重要なものに到達する前にキャッチおよび収容されます。

つまり、3つの構造的なアップは、どれもプロンプトワーディングはありません。出力の形を検証します。モデルをスキーマに対してデータを返すようにします。その実行は失敗します。大声では代わりに、アップストリームを流す。それは構造化出力があなたを得てください。実際の幻覚レートを測定してください。評価、既知の良い答えを持つ保有セット、自動的にスコア。むしろ、いくつかのプロンプトをスポットチェック。そして、間違っているのの費用が高いどこかで人間を保ってください。自動化された保護は何も捕まえません。

すべてを下に置かれた罠は、キャリブレーションです。モデルの自信は、悪いキャリブレーションです。述べられた確実性は、正確性の証拠、回答のトーンはその真実値についての情報を実行しません。だから、決してモデルしい音なしに決定をゲートしてください。

抽象化パスを構築し、優先したパスを構築します。「これは与えられたものから答えることはできません」。そして、それが安いを祭ってください。システムがそれを抽象化するのではなく、自信を持った推測よりも優先します。その構造的な考え方。すべての単一の答えは間違う可能性があり、ダメージを含む。それが安全性と制限章がビルドで何であるかです。

JunoWhy models make things up 削除できないため、包含を工学です。スキーマで構造を検証し、評価で周りを測定。いくつかのアウトプットを眼球の代わりに。そして高い間違っているのの費用がある保ってください。モデルの自信は悪いキャリブレーション。そのため、確かなトーンは証拠ではなく、決してゲートしてください。システムに安い、認可された方法を与えてください。抽象化し、毎回自信を持った推測よりも優先します。

すべてを組み立てる

このチャプターのすべてが、異なる角度から見た1つの考えです。モデルは、次のトークンを予測する凍結された数字の塊であり、ほぼすべての動作を扱う傾向はそこから落ちます。

  • 確率のランキングから1度に1トークンを予測するため、それは回収ではなく即興です。そして、わずかなランダムネス(温度)は答えが異なるという意味です。
  • トークンはそれが機能するチャンク。あなたの請求の単位、あなたのサイズ制限の単位、そして、なぜそれは確実に文字をカウントできないかの理由。
  • コンテキストウィンドウは単一のリクエストの机であり、すべてで共有されており、モデルはリクエスト間でメモリを覚えていないため、継続性はあなたの仕事です。
  • その知識は学習カットオフで凍結され、プライベートデータを含まなかったため、事実を取得してプロンプトに入れます。
  • 幻覚は、真実を感じることなく可能性の高いテキストを予測するシステムの価格です。接地と確認によって削減され、巧妙なワーディングだけでは削除できません。

これらを一緒に保つと、驚くほどの量のAIエンジニアリングは異なる衣装のもと1つのタスクです。適切なテキストを机に乗せ、正しい形で、正しい時間に、そして出力を盲目に信頼しません。次のチャプター開かれた閉じたモデルは、モデルの種類と、次にプロンプティングがどのようにしてそのすべての予測を実際に望むことに向かっていを見ます。

JunoPutting it together モデルについてのほぼすべてが1つの事実から続きます。それは次のトークンを予測する凍結された数字のセットです。そこから異なる答え、トークンベースのコストと制限、リクエスト間のメモリなし、学習カットオフ、幻覚が来ます。これらのモデルで構築するのは多くは、机に正しいテキストを得て、出力を盲目に信頼しません。

1つの事実は全体のチャプターを生成します。モデルは、確率分布から次のトークンを予測する凍結された関数です。結果をトレースするし、あなたはあなたの作業モデルを持っています。

  • 予測とサンプリングは出力が異なる場合。温度どのくらい設定します。
  • トークンはコストの単位、制限の単位、そして文字レベルのタスク、コードに属する理由です。
  • コンテキストウィンドウは有限で無状態です。だから、あなたは再送信し、モデルが必要とするすべてをキュレートしてください。
  • 知識は、カットオフで凍結されて無ソース化されています。そのため、現在のプライベート事実は回想から来るのではなく、検索から来ます。
  • 幻覚は構造的であり、接地と検証によって削減され、ワーディングではなく。

パターンは、すべてのそれの下で同じです。正しいテキストをコンテキストに取得し、正しい形で、正しい時間で、そして何が戻るかを確認してください。これは、ハンドブックの残り、開かれた閉じたモデルプロンプティングで始まる展開です。

JunoPutting it together 全体のチャプターは1つの事実とその失敗です。凍結された次トークン予測は、異なる出力を与え、トークンベースのコストと制限、無状態、知識カットオフ、幻覚。ジョブの続きは定数です。正しいテキストをコンテキストに取得して、正しい形で、その後何が戻るかを確認してください。プロンプティングはあなたがそれをしていく開始するところです。

1つの文はチャプターを実行します。凍結された、ステートレス、次トークン予測しない真実信号。確率的出力、トークンドリブコスト、有限コンテキスト、凍結した知識、そして未キャリブレーション自信はすべてのコロラリーであり、失敗モードを含むようにハーネスが存在します。上部は、モデルが動くとき、それは移動しないこと。バージョンをピン留めし、失敗モードの周りを構築し、次のリリースは、あなたが吸収する驚き、あなたが評価する昇級です。ハンドブックの残りはそのハーネス、そしてそれは開かれた閉じたモデル、そしてプロンプティングで始まります。

JunoPutting it together 1つの文はチャプターを実行します。凍結されたステートレス次トークン予測しない真実信号。確率的出力、トークンドリブコスト、有限コンテキスト、凍結した知識、そしてキャリブレーション自信はすべてのコロラリーで、各アップを含むようにハーネスが存在します。イメージは、モデルが動くとき移動しません。バージョンをピン留めし、失敗モードの周りを構築します。