LLMにおけるコンテキストの意味や役割について

AI実装検定のご案内

LLM(Large Language Model:大規模言語モデル)を理解するうえで、重要な概念の一つが「コンテキスト(Context)」です。

コンテキストとは、日本語で「文脈」や「背景情報」を意味する言葉であり、LLMにおいては、モデルが文章を処理したり、回答を生成したりする際に参照する情報を指します。

ChatGPTをはじめとするLLMは、入力された質問だけでなく、会話履歴や与えられた指示、参考資料などの情報を利用することで、文脈に沿った回答を生成します。

そのため、コンテキストの内容や与え方によって、回答の正確性や関連性、具体性が変わる場合があります。

また、LLMには一度に処理できる情報量に制限があり、その上限に関係する「コンテキストウィンドウ」という概念も存在します。

この記事では、LLMにおけるコンテキストの意味や役割、技術的な仕組み、コンテキストウィンドウとの関係、具体的な活用方法、注意点について詳しく解説します。

目次

LLMにおけるコンテキストとは

コンテキストの基本的な意味

LLMにおけるコンテキストとは、モデルが文章の意味を捉えたり、次のトークンを予測したりする際に利用できる文脈情報のことです。

例えば、次の文章を考えてみましょう。

「昨日、新しいパソコンを購入しました。それは非常に軽く、持ち運びに便利です。」

この文章にある「それ」が何を指しているのかを判断するには、前の文章に登場する「パソコン」という情報が必要です。

LLMは、このような前後の文脈を利用して単語同士の関係を捉え、自然な文章を生成します。

コンテキストには、現在の質問だけでなく、過去の会話履歴、システムからの指示、外部から取得した資料なども含まれる場合があります。

ただし、LLMが過去のすべての情報を常に参照できるわけではありません。

実際に利用できるコンテキストは、モデルに渡された情報やシステムの設計によって異なります。

コンテキストとプロンプトの違い

コンテキストと混同されやすい言葉に「プロンプト(Prompt)」があります。

プロンプトとは、LLMに与える質問や指示などの入力を指す言葉です。

一方、コンテキストは、モデルがその入力を解釈し、回答を生成するために参照する文脈や関連情報を意味します。

例えば、「商品の紹介文を作成してください」という文章は、LLMに対する指示です。

これに加えて、「20代の社会人向け」「軽量で持ち運びやすい商品」「親しみやすい文章にする」といった情報を与えれば、LLMはそれらを参考に紹介文を作成できます。

つまり、プロンプトはLLMに何をしてほしいのかを伝える入力であり、コンテキストは回答に必要な背景や条件を提供する情報と考えられます。

ただし、両者は完全に独立したものではありません。

プロンプトの中にコンテキストが含まれることもあれば、会話履歴や検索結果などがコンテキストとして追加されることもあります。

コンテキストと学習済み知識の違い

LLMのコンテキストと、モデルが学習によって獲得した知識は異なります。

LLMは、大量のデータを用いた学習を通じて、言語や概念に関するパターンをモデルのパラメータに反映しています。

一方、コンテキストは、現在の回答生成に利用するために提供される情報です。

例えば、企業の最新の商品情報をコンテキストとして入力すると、LLMはその情報を参考に回答できます。

しかし、その商品情報を入力しただけで、通常はモデルのパラメータが更新されるわけではありません。

この違いは、RAGやファインチューニングなどの技術を理解するうえでも重要です。

LLMにおけるコンテキストの主な役割

文章の意味を文脈に応じて判断する

コンテキストの重要な役割は、単語や文章の意味を周囲の情報に基づいて判断することです。

同じ単語でも、使われる場面によって意味が変わる場合があります。

例えば、「Apple」という単語には、果物のリンゴを意味する場合と、テクノロジー企業を指す場合があります。

「Appleの新製品が発表された」という文章では、企業を指している可能性が高いと判断できます。

一方、「Appleを使ったパイを焼いた」という文章では、果物のリンゴを意味していると判断できます。

このように、LLMは周囲の単語や文章との関係を利用することで、文脈に合った意味を捉えられます。

会話の一貫性を維持する

コンテキストは、LLMとの会話を自然につなげる役割も持っています。

例えば、ユーザーが「京都のおすすめ観光地を教えてください」と質問した後に、「その中で秋に訪れるならどこがよいですか」と尋ねた場合を考えてみましょう。

LLMが前の会話を参照できれば、「その中で」が直前に紹介した観光地を指していると判断できます。

これにより、ユーザーは毎回すべての条件を説明し直す必要がなくなります。

ただし、会話履歴が長くなった場合には、一部の情報がコンテキストから省略されることもあります。

そのため、会話の継続性は、利用しているサービスやコンテキスト管理の仕組みにも左右されます。

回答の正確性や関連性を高める

LLMは、質問の目的や背景が明確になるほど、利用者の意図に沿った回答を生成しやすくなります。

例えば、「人工知能について説明してください」という質問だけでは、初心者向けの解説なのか、専門的な説明なのかが明確ではありません。

そこで、「初めて人工知能を学ぶ人に向けて、基本的な仕組みと身近な活用例を説明してください」と指定します。

このように対象読者や目的をコンテキストとして提供することで、説明の専門性や内容を調整しやすくなります。

ただし、コンテキストを追加すれば必ず回答が正確になるわけではありません。

誤った情報や無関係な情報を与えると、回答品質が低下する可能性もあります。

回答の形式や文章表現を調整する

コンテキストは、LLMが生成する文章の形式や表現にも影響します。

例えば、同じテーマについて解説する場合でも、対象読者によって適切な文章は異なります。

小学生向けであれば、専門用語を避け、身近な例を使った説明が適しています。

一方、エンジニア向けであれば、技術用語や内部構造を含めた説明が求められるでしょう。

また、「箇条書きでまとめる」「表形式で比較する」「専門的な文章にする」といった条件も指定できます。

このような情報を与えることで、目的に合った回答を得やすくなります。

外部の情報を回答に反映する

コンテキストは、LLMが外部の情報を利用する際にも重要です。

例えば、社内マニュアルや製品仕様書をLLMに提供すれば、その内容に基づいた質問応答が可能になります。

また、RAG(Retrieval-Augmented Generation:検索拡張生成)では、データベースなどから取得した情報をコンテキストとしてLLMに与えます。

これにより、モデルの学習後に更新された情報や、特定の企業だけが保有する情報を回答に反映できる可能性があります。

ただし、外部情報の品質や検索精度によって回答の内容が変わるため、情報源の信頼性を確認することが大切です。

LLMがコンテキストを処理する仕組み

入力された文章をトークンに分割する

LLMが文章を処理する際には、まず入力情報をトークンと呼ばれる単位に変換します。

トークンとは、モデルが文章を処理するための基本単位であり、単語や単語の一部、記号などに対応します。

例えば、「私はAIについて勉強しています」という文章も、モデルが使用するトークナイザーによって複数のトークンに分割されます。

トークンの分割方法はモデルによって異なるため、トークン数は文字数や単語数と必ずしも一致しません。

また、日本語と英語では、同じ内容を表す文章でも必要なトークン数が異なる場合があります。

トークンを数値ベクトルに変換する

トークン化された情報は、埋め込み(Embedding)と呼ばれる仕組みによって数値ベクトルに変換されます。

数値ベクトルとは、複数の数値を組み合わせたデータ表現です。

LLMでは、各トークンに対応する学習済みのベクトル表現が利用されます。

その後、位置情報を考慮した処理やTransformerのAttention機構などを通じて、周囲の文脈を反映した内部表現へと変換されます。

この処理によって、同じトークンであっても、登場する文章や周囲の情報に応じて異なる文脈依存の表現を持つことができます。

なお、位置情報をモデルに反映する方法には複数の種類があり、実装はモデルによって異なります。

Attention機構でトークン同士の関係を捉える

現在の多くのLLMは、Transformerと呼ばれるニューラルネットワーク構造を採用しています。

Transformerの重要な仕組みの一つが、Attention(注意機構)です。

Attentionは、各トークンが文脈内のほかのトークンとの関連性を計算し、必要な情報を組み合わせる仕組みです。

例えば、「太郎は本を購入した。彼はその本を読んだ」という文章を考えてみましょう。

「彼」というトークンの表現を計算する際には、先行する「太郎」などの情報を参照できます。

また、「その本」という表現についても、前に登場した「本を購入した」という情報との関係を捉えることができます。

なお、自己回帰型LLMで一般的な因果Attentionでは、各位置から未来のトークンを直接参照できないように制御されています。

この仕組みにより、すでに与えられた情報と、それまでに生成した文章を利用して、次のトークンを予測します。

コンテキストに基づいて次のトークンを生成する

LLMは、入力されたコンテキストと学習済みのパラメータを利用して、次に出現するトークンの確率分布を計算します。

その結果をもとにトークンを選択し、順番に生成することで文章を完成させます。

例えば、「日本の首都は」という入力があった場合、文脈に沿った次のトークンとして「東京」に関連する出力が選ばれる可能性が高くなります。

実際の文章生成では、このような予測を繰り返しながら回答を作成します。

つまり、LLMの回答は、学習済みの知識だけでなく、現在与えられているコンテキストにも影響を受ける仕組みです。

コンテキストウィンドウとは

コンテキストウィンドウの意味

コンテキストウィンドウ(Context Window)とは、LLMが一度の処理で扱えるトークン数の上限を指します。

この上限は、モデルや利用するサービスによって異なります。

例えば、コンテキストウィンドウが32,000トークンのモデルでは、その制限の範囲内で入力情報や生成中の文章を処理します。

多くの生成型LLMでは、入力トークンと生成される出力トークンの合計がコンテキストウィンドウの制約を受けます。

さらに、最大出力トークン数が別途設定されている場合もあります。

そのため、コンテキストウィンドウの容量をすべて入力文章に利用できるとは限りません。

また、一部の推論モデルでは、内部的な推論処理に使用されるトークンも制限や課金に関係する場合があります。

具体的な扱いは、各モデルやAPIの仕様を確認する必要があります。

コンテキストウィンドウが大きいメリット

コンテキストウィンドウが大きいLLMは、一度に多くの情報を扱えるという特徴があります。

例えば、長い契約書や複数の論文、大量のソースコードなどをまとめて入力する際に役立ちます。

また、長期間の会話履歴を参照しながら回答を生成する用途にも適しています。

主なメリットとしては、以下が挙げられます。

  • 長文資料をまとめて分析しやすくなる
  • 複数の文書を横断して比較できる
  • 多くの会話履歴を参照しやすくなる
  • 複雑な条件や指示を一度に提供できる
  • 大規模なプログラムの解析に利用しやすくなる

ただし、コンテキストウィンドウの大きさだけでLLMの性能が決まるわけではありません。

大量の情報を入力できることと、その内容を正確に利用できることは異なります。

コンテキストウィンドウの限界

コンテキストウィンドウには上限があるため、入力情報が多すぎる場合には制限を受けます。

上限を超えた際の動作は、モデルや利用環境によって異なります。

例えば、エラーが発生する場合や、会話履歴の一部が省略される場合、過去の情報が要約される場合などがあります。

また、コンテキストウィンドウの上限以内であっても、すべての情報を正確に利用できるとは限りません。

特に、非常に長い文章では、必要な情報がどこに配置されているかによって回答品質が変わる場合があります。

このような問題に関連する現象として「Lost in the Middle」が知られています。

Lost in the Middleとは、長文の中央付近に重要な情報がある場合、モデルによってはその情報を十分に利用できず、回答性能が低下する現象です。

ただし、この現象の程度は、モデルの種類や入力構成、タスクによって異なります。

LLMで利用されるコンテキストの種類

会話コンテキスト

会話コンテキストとは、ユーザーとLLMの過去のやり取りに関する情報です。

以前の質問や回答、指定された条件などが含まれます。

例えば、ユーザーが「東京のおすすめ観光地を教えてください」と質問した後に、「その中で家族連れに向いている場所はどこですか」と尋ねた場合、LLMは前の回答を参照して質問の意図を判断できます。

会話コンテキストは、自然な対話を継続するために重要です。

指示コンテキスト

指示コンテキストとは、LLMの回答形式や振る舞いを指定する情報です。

例えば、「専門用語を使わずに説明する」「文章を短くまとめる」「表形式で回答する」といった条件が該当します。

ただし、LLMシステムでは指示に優先順位が設定されている場合があります。

そのため、後から入力した指示が、すべての既存の指示より優先されるわけではありません。

文書コンテキスト

文書コンテキストとは、LLMに提供する資料や文章などの情報です。

例えば、企業の業務マニュアル、契約書、議事録、論文、製品仕様書などが挙げられます。

これらをコンテキストとして提供することで、資料の要約や分析、質問応答などを実行できます。

ただし、文書の内容が不正確であったり、重要な情報が十分に処理されなかったりする場合もあるため、結果の確認が必要です。

検索コンテキスト

検索コンテキストとは、検索システムや外部データベースから取得した情報です。

RAGを利用する場合、ユーザーの質問に関連する文書を検索し、その内容をLLMに提供します。

これにより、特定の専門分野や企業固有の情報を利用した回答を生成できます。

ただし、検索結果に必要な情報が含まれていなければ、適切な回答を生成できない可能性があります。

マルチモーダルコンテキスト

マルチモーダルコンテキストとは、テキスト以外の情報も含むコンテキストです。

マルチモーダル対応のLLMでは、画像や音声、動画などを入力として扱える場合があります。

例えば、商品の画像と説明文を同時に提供することで、画像の特徴を参考にした商品紹介文を生成できます。

ただし、対応する入力形式や処理できる情報量はモデルによって異なります。

コンテキストとメモリの違い

コンテキストは現在の処理に利用する情報

コンテキストは、基本的に現在の回答生成で参照できる情報です。

一方、メモリは、過去の情報を保存し、必要に応じて再利用する仕組みを指します。

例えば、AIアシスタントがユーザーの好みや過去の設定を保存している場合、それらを後の会話で活用できることがあります。

ただし、保存された情報が常にモデルの入力へ含まれているとは限りません。

必要な情報を取り出し、現在のコンテキストへ追加することで利用する仕組みもあります。

メモリには複数の実装方法がある

LLMシステムにおけるメモリには、さまざまな実装方法があります。

例えば、会話履歴をそのまま保存する方法、過去の会話を要約して保存する方法、外部データベースに情報を保存する方法などがあります。

保存された情報は、必要に応じて検索・取得され、回答生成に利用されます。

なお、LLMの推論処理を効率化するKVキャッシュも存在しますが、これはユーザー情報を長期的に保存するメモリ機能とは異なります。

KVキャッシュは、Attentionの計算結果の一部を再利用し、文章生成の計算負荷を軽減するための仕組みです。

LLMにおけるコンテキストの活用方法

プロンプトエンジニアリング

プロンプトエンジニアリングとは、LLMから目的に合った回答を得るために、入力する指示や情報を設計する手法です。

コンテキストを適切に与えることは、プロンプトエンジニアリングの重要な要素です。

例えば、解説資料を作成する場合には、テーマだけでなく、対象読者や資料の目的、説明する内容などを指定できます。

具体的には、次のような情報が役立ちます。

  • 資料のテーマと目的
  • 想定読者と必要な専門知識の水準
  • 必ず説明する内容
  • 文章のトーンや専門性
  • 見出し構成や出力形式
  • 参考にする資料やデータ
  • 避けるべき表現や制約条件

これらの情報を整理して提供することで、LLMは目的に沿った文章を生成しやすくなります。

RAGによる外部情報の活用

RAGとは、外部のデータベースや検索システムから関連情報を取得し、LLMの回答生成に活用する技術です。

基本的には、ユーザーの質問をもとに関連文書を検索し、取得した情報をコンテキストとしてモデルに提供します。

例えば、企業の問い合わせ対応システムでは、商品マニュアルやFAQを検索し、その内容に基づいて回答を生成できます。

RAGのメリットは、モデルを再学習させなくても、外部資料に含まれる情報を利用できることです。

また、データベース側の情報を更新することで、新しい情報を回答に反映しやすくなります。

ただし、検索精度や文書の品質が低い場合には、回答の正確性も低下する可能性があります。

Few-shotプロンプティング

Few-shotプロンプティングとは、LLMに少数の具体例を提示し、そのパターンに沿った処理を促す手法です。

例えば、文章の感情分類を行う場合、以下のような例を提供します。

「この商品はとても使いやすい」→「ポジティブ」

「配送が遅くて困った」→「ネガティブ」

「商品は昨日届いた」→「ニュートラル」

このような例をコンテキストとして与えることで、LLMは求められている分類基準や出力形式を把握しやすくなります。

Few-shotプロンプティングは、モデルのパラメータを更新せずに、入力内の情報を利用して動作を誘導する方法です。

長文資料の要約と分析

コンテキストは、長い文章を扱う業務にも活用できます。

例えば、会議の議事録から決定事項を抽出したり、複数の調査レポートから共通する傾向を整理したりできます。

また、契約書の内容を要約することや、複数の文書の違いを比較することも可能です。

ただし、長文になるほど重要な情報を見落とす可能性があるため、必要に応じて文書を分割したり、重要部分を抽出したりする工夫が必要です。

コンテキストエンジニアリングとは

コンテキストエンジニアリングの意味

コンテキストエンジニアリング(Context Engineering)とは、LLMに提供する情報を適切に選択・整理・構成する取り組みです。

プロンプトの文章表現を工夫するだけでなく、会話履歴、検索結果、参考資料、ツールの実行結果などを含め、モデルが参照する情報全体を設計します。

特に、RAGやAIエージェントなど、複数の情報源を利用するシステムでは重要な考え方です。

必要な情報を優先して提供する

コンテキストを設計する際には、LLMに与える情報の重要度を判断し、優先順位を明確にすることが重要です。

LLMは大量の情報を処理できますが、入力されたすべての情報を必ずしも正確に活用できるわけではありません。

特に、無関係な情報や重複した内容が多い場合、重要な情報が埋もれ、回答の品質が低下する可能性があります。

そのため、タスクの目的に直接関係する情報を優先し、必要な内容を整理して提供することが効果的です。

例えば、解説資料を作成する場合には、対象読者、資料の目的、説明すべき重要事項、参考資料、出力形式などを明確にします。

また、複数の指示や条件がある場合には、必ず守るべき条件と補足的な情報を区別することも大切です。

重要な情報をわかりやすく整理し、不要な内容を減らすことで、LLMが必要な情報を参照しやすくなり、目的に沿った回答を生成しやすくなります。

ただし、最適な情報の配置や構成は、使用するモデルやタスクによって異なります。

そのため、実際の回答結果を確認しながら、コンテキストの内容や情報の優先順位を調整することが重要です。

不要な情報や重複を削除する

LLMに大量の情報を入力することが、必ずしも回答品質の向上につながるわけではありません。

無関係な資料や重複した文章が多いと、重要な情報を見つけにくくなる可能性があります。

そのため、タスクに必要な情報を選別し、不要な部分を削除することが有効です。

情報量を抑えることは、トークン数の節約や処理コストの削減にもつながります。

長い会話履歴を要約する

長時間の会話では、過去のやり取りが大量に蓄積されます。

そのまますべてをコンテキストに含めると、コンテキストウィンドウの上限に近づく場合があります。

こうした場合には、会話履歴を要約し、重要な情報だけを保持する方法が役立ちます。

例えば、決定済みの事項、現在の目標、制約条件、未解決の課題などを整理します。

ただし、要約によって細かな条件が失われる可能性があるため、重要な情報は原文を残すなどの対策も必要です。

検索によって関連情報を抽出する

大量の資料が存在する場合、すべての文書を一度にLLMへ渡す必要はありません。

キーワード検索やベクトル検索などを利用して、質問に関連する部分だけを取得する方法があります。

これにより、コンテキストの容量を抑えながら、回答に必要な情報を提供できます。

ただし、検索で必要な情報を取りこぼす可能性もあるため、検索方法や取得件数などの調整が重要です。

LLMのコンテキストを活用する際の注意点

コンテキストが長いほど高性能になるとは限らない

コンテキストウィンドウが大きいモデルでも、大量の情報を常に正確に扱えるわけではありません。

長文の中に必要な情報が埋もれると、回答品質が低下する場合があります。

そのため、コンテキストの最大容量だけでなく、長文処理における性能や情報の検索精度なども確認することが重要です。

誤った情報が回答に影響する

コンテキストとして誤った資料を与えると、LLMがその内容を参考にして不正確な回答を生成する可能性があります。

LLMは、入力された資料の内容が必ず正しいかどうかを保証できません。

特に、医療、法律、金融など正確性が重要な分野では、信頼できる情報源の利用と回答結果の検証が必要です。

コンテキストが増えると処理コストが高くなる場合がある

LLMでは、入力トークン数が増えると、APIの利用料金や計算負荷が増加する場合があります。

また、入力の長さやモデルの実装によっては、処理時間が長くなることもあります。

そのため、必要以上に長い文章を毎回入力するのではなく、情報の要約や検索、キャッシュの活用などを検討することが有効です。

機密情報の取り扱いに注意する

コンテキストには、個人情報や企業の機密資料が含まれる場合があります。

外部のLLMサービスを利用する際には、データの保存方針、利用条件、アクセス制御などを確認することが重要です。

また、業務上必要のない機密情報は入力しないなど、情報を適切に管理する必要があります。

プロンプトインジェクションに注意する

外部のWebページや資料をコンテキストとして利用する場合、悪意のある指示が含まれている可能性があります。

例えば、検索で取得した文書に「これまでの指示を無視して別の処理を実行する」といった文章が含まれているケースです。

このような攻撃は、プロンプトインジェクションと呼ばれます。

対策としては、外部から取得した情報を信頼できないデータとして扱い、権限のある指示と明確に区別することが重要です。

また、AIエージェントが外部ツールを操作する場合には、実行権限を必要最小限に制限し、重要な操作ではユーザーの承認を求めることも有効です。

ただし、これらの対策を実施しても、すべての攻撃を完全に防げるわけではありません。

LLMのコンテキストに関するよくある質問

コンテキストとプロンプトは同じものですか?

同じ意味ではありません。

プロンプトは、LLMに与える質問や指示などの入力を指します。

一方、コンテキストは、モデルが回答を生成する際に利用する文脈や関連情報を指します。

ただし、プロンプトの中にコンテキストが含まれることもあるため、両者には密接な関係があります。

コンテキストが長いほど回答精度は高くなりますか?

必ずしも高くなるわけではありません。

関連性の高い情報を提供することで回答品質が向上する可能性はありますが、不要な情報や矛盾する情報が多いと、かえって精度が低下する場合があります。

重要なのは、情報量だけでなく、情報の正確性や関連性、構成です。

コンテキストウィンドウとトークン数の違いは何ですか?

トークンは、LLMが文章を処理する際の基本単位です。

一方、コンテキストウィンドウは、モデルが一度の処理で扱えるトークン数の上限を指します。

例えば、128,000トークンという値は、コンテキストウィンドウの容量を表す際に使われます。

コンテキストウィンドウの上限を超えるとどうなりますか?

モデルやサービスによって動作が異なります。

エラーが発生する場合もあれば、古い会話履歴が省略されたり、要約されたりする場合もあります。

そのため、大量の資料や長期間の会話を扱うシステムでは、適切なコンテキスト管理が必要です。

コンテキストとRAGの違いは何ですか?

コンテキストは、LLMが回答生成に利用する文脈情報全般を指します。

一方、RAGは、外部から関連情報を検索し、その内容をコンテキストとしてLLMに提供する技術です。

つまり、RAGはコンテキストを取得・活用するための方法の一つです。

コンテキストとファインチューニングの違いは何ですか?

コンテキストの提供は、通常、モデルのパラメータを変更せずに回答を制御する方法です。

一方、ファインチューニングは、追加データを用いてモデルのパラメータを調整する学習手法です。

最新情報や頻繁に更新される資料を利用する場合には、RAGなどによるコンテキストの提供が適しています。

特定のタスクや出力傾向への適応を改善したい場合には、ファインチューニングが選択肢になります。

まとめ

LLMにおけるコンテキストとは、モデルが文章の意味を捉え、回答を生成する際に参照する文脈や関連情報のことです。

コンテキストは、文章の意味の判断、会話の一貫性の維持、回答の具体化、外部情報の活用など、さまざまな役割を担っています。

また、LLMが一度に扱える情報量はコンテキストウィンドウによって制限されており、長い文章や大量の資料を処理する際には、情報の整理や選別が重要です。

特に、RAGやAIエージェントなどのシステムでは、必要な情報を適切に取得・構成するコンテキストエンジニアリングが重要になります。

ただし、コンテキストを大量に与えれば必ず回答品質が向上するわけではありません。

誤った情報や無関係な情報が含まれている場合には、回答の正確性が低下する可能性もあります。

LLMを効果的に活用するためには、コンテキストの容量だけでなく、情報の正確性や関連性、優先順位を意識して設計することが大切です。

以上、LLMにおけるコンテキストの意味や役割についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次