Welcome to Mashykom WebSite



Transformers を用いた LLM の運用

 Hugging Face 社が提供する Transformers と呼ばれるアーキテクチャを使った大規模なモデルの利用が急速に普及しています。

 Transformers は最先端の学習済みモデルを簡単にダウンロードして学習するAPIとツールを提供します。学習済みモデルを使用することで計算コストを削減でき、またゼロからモデルを学習するために要求される時間とリソースを節約することができます。 これらのモデルは以下のような異なるモダリティにおける一般的なタスクをサポートします:

 Transformers はPyTorch, TensorFlow, JAX間のフレームワーク相互運用性をサポートしています。 これはモデルの各段階で異なるフレームワークを使うための柔軟性を提供します。あるフレームワークで3行のコードでモデルを学習し、別のフレームワークで推論のためにモデルをロードすることが可能です。また、本番環境のデプロイのためにモデルをONNXやTorchScriptのような形式でエクスポートすることも可能です。

 このページでは、Transformers の簡単な使用例を説明し、最終的な目的として、大規模言語モデルを用いた文章生成の運用を取り上げます。このページで説明したコードはすべて Google Colab で実証済です。ダウンロードされる LLM のサイイズは 6GB 以下なので、Google Colab の無料アカウントでも実行可能です。

Last updated: 2024.10.24



Transformers : pipeline() の使用法


 Transformersは、自然言語処理(NLP)、コンピュータビジョン、音声処理などの最新の事前学習済みモデルのライブラリです。このライブラリには、Transformerモデルだけでなく、コンピュータビジョン・タスク向けの畳み込みニューラルネットワークなどの Transformer 以外のモデルも含まれています。

 pipeline() を使用すると、Hub にある任意のモデルを、あらゆる言語、コンピューター ビジョン、音声、マルチモーダル・タスクの推論に簡単に使用できます。特定のモダリティの経験がない場合や、モデルの背後にある基礎コードに精通していない場合でも、pipeline() を使用して推論に使用できます。

 パイプラインの使用について説明します。各タスクには関連付けられた pipeline() がありますが、一般的な pipeline() を使用する方が簡単です。 pipeline() は、タスクの推論が可能なデフォルト・モデルと前処理クラスを自動的に読み込みます。最初に、自動音声認識 (ASR)、つまり音声テキスト変換に pipeline() を使用する例を見てみましょう。

 1. pipeline()を作成し、推論タスクを指定して始めます:

!pip install transformers

from transformers import pipeline

speech_recognizer = pipeline(task="automatic-speech-recognition")


 2. pipeline()に入力テキスト(この場合、音声データ)を渡します:


speech_recognizer("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")

--- response
{'text': 'I HAVE A DREAM BUT ONE DAY THIS NATION WILL RISE UP LIVE UP THE TRUE MEANING OF ITS TREES'}


 音声データが言語化されます。「No model was supplied, defaulted to facebook/wav2vec2-base-960h and revision 55bb623. Using a pipeline without specifying a model name and revision in production is not recommended.」という警告が表示されます。そこで、利用するモデルを指定しましょう。例えば、openai/whisper-large を試してみましょう。


speech_recognizer = pipeline(model="openai/whisper-large-v2")
speech_recognizer("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")

--- response
{'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.'}

 複数の入力がある場合、以下のように、入力をリストとして渡すことができます。

 device=nを設定すると、パイプラインは自動で指定されたデバイスにモデルを配置します。これは、PyTorchであろうがTensorflowであろうが動作します。モデルが単一GPUでは大きすぎる場合、Accelerateがモデルの重みのロード方法、格納方法を自動で判断するように、device_map="auto"を設定することができます。ただし、この設定は任意です。

from transformers import pipeline

generator = pipeline(model="openai/whisper-large", device_map="auto")

generator(
    [
        "https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac",
        "https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/1.flac",
    ]
)
--- response 
[{'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.'},
 {'text': ' He hoped there would be stew for dinner, turnips and carrots and bruised potatoes and fat mutton pieces to be ladled out in thick, peppered, flour-fattened sauce.'}]


 pipeline()は、任意のタスクに対してデータセット全体を繰り返し処理することもできます。この例では、自動音声認識をタスクとして選びます.


import torch
from transformers import pipeline

speech_recognizer = pipeline("automatic-speech-recognition", model="facebook/wav2vec2-base-960h")


 この場合、タスクの種類を指定し、モデルも指定します。指定されたモデルが Hub から自動的に読み込まれます。ただし、指定できるモデルはHagging Face の Hub に登録されているものに限ります。

Vision pipeline を用いてコンピュータビジョンのタスクを実行する方法はほぼ同じです。

 タスクを指定し、画像を classifier インスタンスに渡します。例えば、以下は、画像はどの種類の猫ですか?という課題を実行するコードです。


from transformers import pipeline

vision_classifier = pipeline(model="google/vit-base-patch16-224")
preds = vision_classifier(
    images="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg"
)

preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds]
preds

--- response 
[{'score': 0.4335, 'label': 'lynx, catamount'}, {'score': 0.0348, 'label': 'cougar, puma, catamount, mountain lion, painter, panther, Felis concolor'}, {'score': 0.0324, 'label': 'snow leopard, ounce, Panthera uncia'}, {'score': 0.0239, 'label': 'Egyptian cat'}, {'score': 0.0229, 'label': 'tiger cat'}]

 北米などでみられる野生の猫(lynx, catamount)という分類が、43% となっています。確認したいときは、上記のリンク先の画像を見て下さい。

 Transformer を用いたコンピュータビジョン、画像分類と物体検出等の課題の実行の方法については、Vision Ttarnsormer と DEtection TRansformer のページを見て下さい。

 pipeline()を使用することは、自然言語処理のタスクに対してほぼ同じです。

 マスクされた言葉を予測する課題は以下のコードで簡単にできます。


from transformers import pipeline
pipe = pipeline("fill-mask")
pipe("Paris is the <mask> of France.")

--- response 
[{'score': 0.6814395189285278,'token': 812,'token_str': ' capital',
  'sequence': 'Paris is the capital of France.'},
 {'score': 0.051595184952020645,'token': 32357,'token_str': ' birthplace',
  'sequence': 'Paris is the birthplace of France.'},
 {'score': 0.03583149611949921,'token': 1144,'token_str': ' heart',
  'sequence': 'Paris is the heart of France.'},
 {'score': 0.02711125835776329,'token': 29778,'token_str': ' envy',
  'sequence': 'Paris is the envy of France.'},
{'score': 0.020788351073861122,'token': 28288,'token_str': ' heartbeat',
  'sequence': 'Paris is the heartbeat of France.'}]

 次に、感情分析の課題を取り上げます。


from transformers import pipeline

classifier = pipeline("sentiment-analysis")
classifier(
    [
        "I've been waiting for a HuggingFace course my whole life.",
        "I hate this so much!",
    ]
)

--- response
[{'label': 'POSITIVE', 'score': 0.9598048329353333},
 {'label': 'NEGATIVE', 'score': 0.9994558691978455}]



from transformers import pipeline

classifier = pipeline("sentiment-analysis")

results = classifier(
    [
    "🤗 Transformersライブラリをご紹介できて非常に嬉しいです。",
    "嫌いにならないでほしいです。"
    ]
)
for result in results:
    print(f"label: {result['label']}, スコア: {round(result['score'], 4)}")

--- response
label: NEGATIVE, スコア: 0.8933
label: NEGATIVE, スコア: 0.8892

 このモデルでは、日本語が理解できないようです。日本語で使用するときは、日本語向けのモデルを指定して利用する必要があります。

 文章生成を pipeline() を利用して実行してみましょいう。


from transformers import pipeline

pipe = pipeline("text-generation")
pipe("Hello, I'm a language model,")

--- response
{'generated_text': 'Hello, I\'m a language model, you will understand that at the beginning, when most people did not understand anything, and had a bad memory, and they began saying "here is a model that was created." And I said, "you can'}

 入力した文に続いた文章が作成されています。

 自然言語処理に関わる多種な課題を実行するためには、文章の形態素解析などが必要となるので、AutoTokenizer() というモジュールを使用する必要があります。


Transformers : AutoTokenizerの使用法


 テキストデータの前処理に使用する主要なツールは、トークナイザです。トークナイザは、一連のルールに従ってテキストをトークンに分割します。トークンは数値に変換され、その後テンソルに変換され、モデルの入力となります。モデルが必要とする追加の入力は、トークナイザによって追加されます。これを実行するために、AutoTokenizer をロードします。学習済みモデルとして bert-base-multilingual-uncased-sentiment をダウンロードして、このモデルに付属する形態素解析のツールを使います。


from transformers import AutoTokenizer

model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
tokenizer = AutoTokenizer.from_pretrained(model_name)

encoding = tokenizer("私たちは🤗 Transformersライブラリをお見せできてとても嬉しいです。")
print(encoding)

{'input_ids': [101, 6260, 100, 58263, 65429, 15483, 21572, 11465, 24851, 7753, 88989, 16181, 11883, 11651, 40167, 3137, 18658, 11883, 16018, 1483, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}


 BERTのモデルの形態素解析ツールが使用されています。input_ids は各トークンに割り振られた番号です。 token_type_ids は文章の順番を示す番号で、最初の文章は0 となります。 attention_mask は入力トークンについて、attentionの対象となるかを示すもの(埋め込みを判別するバイナリマスク)です。これらの3種類の情報が tokenizer に保存されています。

 日本語の自然言語処理を実行するためには、日本語の辞書と形態素解析ツールが必要となります。fugashi は、 MeCab の Cython ラッパーで、日本語モデルで使用される形態素解析のツールです。ipadic は形態素解析に使用する日本語辞書です。これらをインストールします。AutoModel.pretrained() で日本語の学習済み BERT モデル "cl-tohoku/bert-base-japanese" をダウンロードします。さらに、AutoTokenizer.from_pretrained() を用いて、対応する形態素解析用のトークナイザーをダウンロードします。tokenizer のインスタンスを定義して、入力日本語文章を形態素解析(fugashi)を用いて、トークン化し、それをテンソルに変換します。return_tensors="pt" なので、Pytorch の形式です。tokenizer.decode() は番号化されたトークンを単語に変換します。



!pip install fugashi
!pip install ipadic

import torch
from transformers import AutoModel, AutoTokenizer

bertjapanese = AutoModel.from_pretrained("cl-tohoku/bert-base-japanese")
tokenizer = AutoTokenizer.from_pretrained("cl-tohoku/bert-base-japanese")

## Input Japanese Text
line = "吾輩は猫である。"

inputs = tokenizer(line, return_tensors="pt")

print(tokenizer.decode(inputs["input_ids"][0]))

outputs = bertjapanese(**inputs)

[CLS] 吾輩 は 猫 で ある 。 [SEP]

 [CLS]は文章の始まりを意味する特殊トークン、[SEP]は文字通りSeparation 文の区切を示します。トークン化された番号の系列が、日本語の文章に再現されています。

 形態素解析ツールとしての fugashi は MeCab の Python ラッパーですが、MeCabは日本語の自然言語処理で広く用いられている有名な形態素解析器です。MeCab を用いた日本語処理については、このページで解説しています。

 次に、文章生成の課題を取り上げます。文章生成を利用する際の課題の種類は、text-generation になります。


from transformers import pipeline

generator = pipeline('text-generation', model = 'openai-community/gpt2')

generator(prompt)

--- response
Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.
[{'generated_text': "Hello, I'm a language model based on C++ with a very high level of functionalities and a robust API and I've also tried many other languages. There are plenty of advantages, of course.\n\nSome examples include many languages and frameworks"}]


 Rinna社のGPT2で日本語の文章を生成してみました。Rinna社のGPT2モデルはトークナイザに T5Tokenizerを用いていますが、モデルとトークナイザのクラスモデルが異なる際は、モデルとトークナイザをそれぞれインスタンス化してから、pipelineクラスに入力する必要があります。


from transformers import T5Tokenizer, GPT2LMHeadModel

model_name = "rinna/japanese-gpt2-small"

tokenizer = T5Tokenizer.from_pretrained(model_name)
tokenizer.do_lower_case = True  # due to some bug of tokenizer config loading
model = GPT2LMHeadModel.from_pretrained(model_name)

generator = pipeline("text-generation", model=model, tokenizer=tokenizer)
generator("吾輩は猫である。")

--- response
Hardware accelerator e.g. GPU is available in the environment, but no `device` argument is passed to the `Pipeline` object. Model will be on CPU.
[{'generated_text': '吾輩は猫である。吾輩は猫である。 なぜなら、吾輩は我が家に泊まりに来るねこたちを決して恐れているわけではないから。 猫のせいで、我が家に来なくなった、とも言い張られるが'}]



Transformers : LLM の基礎的利用法


  LLM (大規模言語モデル) は、テキスト生成の背後にある主要なコンポーネントです。簡単に言うと、入力テキストから次の単語 (より正確にはトークン) を予測するようにトレーニングされた、事前トレーニング済みの大規模なトランスフォーマー・モデルで構成されています。一度に 1 つのトークンを予測するため、新しい文を生成するには、モデルを呼び出すだけでなく、より複雑な操作を行う必要があります。つまり、自己回帰生成を行う必要があります。 自己回帰生成は、推論時の手続きで、いくつかの初期入力を与えた状態で、モデルを反復的に呼び出す手法です。Transformersでは、これはgenerate()メソッドによって処理されます。

 まず最初に、必要なライブラリをインストールします。


!pip install -U bitsandbytes


 LLM モデルをダウンロードします。


from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(
    "google/gemma-2-2b-it"", device_map="auto", load_in_4bit=True
)


 モデルに続いて、2つのフラッグが記述されています。device_map="auto" は モデル用の GPU メモリの配置を自動で行います。load_in_4bit=True はモデルを 4bit で量子化して配置します。これを実行するためには bitsandbytes モジュールが必要です。

 次に、入力テキストをトークン化するために AutoTokenizer をインポートします。


from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b-it", padding_side="left")
model_inputs = tokenizer(["A list of colors: red, blue"], return_tensors="pt").to("cuda")


 このトークン化されたテキスト(model_inputs)をモデルに入力して、新しいテキストのトークン系列(generated_ids)を生成します。 generate() メソッドを用いてこれを実行します。その後、batch_decode を用いてトークン系列から言語単語の文章に変換します。


generated_ids = model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

 --- response
'A list of colors: red, blue, green, yellow, orange, purple, brown,'


 デフォルトで、20トークンの文章が生成されます。生成するテキストの単語数を増やしたときは、例えば max_new_tokens=50 と指定します。
generated_ids = model.generate(**model_inputs, max_new_tokens=50)
とします。

 Pipeline() を利用してテキスト生成をしてみましょう。Gemma 2-2B-it の日本語バージョンを用いてみます。


import torch
from transformers import pipeline

pipe = pipeline(
    "text-generation",
    model="google/gemma-2-2b-jpn-it",
    model_kwargs={"torch_dtype": torch.bfloat16},
    device="cuda",  # replace with "mps" to run on a Mac device
)

messages = [
    {"role": "user", "content": "マシーンラーニングについての詩を書いてください。"},
]

outputs = pipe(messages, return_full_text=False, max_new_tokens=256)
assistant_response = outputs[0]["generated_text"].strip()
print(assistant_response)

--- response 
## マシーンラーニングの詩

**1.** 
データの海、深淵の広がり、
複雑なパターン、隠された知識。
機械学習、その力強さ、
未来を予測、その道を開く。

**2.** 
ニューラルネットワーク、複雑な枝、
学習の旅、その過程は静か。
データから学び、進化する姿、
予測の精度、その力強さ。

**3.** 
教師あり学習、正解を導く、
教師なし学習、未知の世界へ。
機械学習、その進化は止まらない、
未来の扉を開く、新たな時代へ。

**4.** 
画像認識、音声認識、
複雑なタスク、その答えを見つける。
機械学習、その力強さ、
未来の技術、その可能性を語る。


 LLM が実行できるタスクの一つは翻訳です。以下に例を示します。


from transformers import pipeline, AutoTokenizer
import torch

model = "google/gemma-2-2b-jpn-it"

tokenizer = AutoTokenizer.from_pretrained(model)
pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)

prompt = """Translate the English text to Japanese.
Text: We’ve heard your voices about wanting more artistic freedom, including requests to allow nude images. We’ve also received thoughtful feedback from both sides of the discussion, and we appreciate the passion and perspectives shared with us.
Translation:
"""

sequences = pipe(
    prompt,
    max_new_tokens=30,
    do_sample=True,
    top_k=10,
    return_full_text = False,
)

for seq in sequences:
    print(f"{seq['generated_text']}")

--- response
私たちは、より芸術的な自由を求める声が聞こえてきました。また、ヌード画像を許可するなどのリクエストも頂いております。両陣営から考えさせられる意見もたくさん寄せられましたし、私たちはその熱意と多様な見解を心より感謝しております。 


 以上が、 pipleline() を利用したテキスト生成の例でした。pipleline() を利用するときは、AutoModelForCausalLM.from_pretrained() を用いてモデルを定義し、generate() メソッドを使用することは必要ありません。


Transformers : chat prompt の基礎的利用法


 Hub で利用できる最近の LLM チェックポイント(学習済モデル)のほとんどには、基本モデル と 会話型の2 つのバージョンがあります。基本モデルは、最初のプロンプトが与えられたときにテキストを完成させるのには優れていますが、自然言語処理における課題の多くには理想的ではありません。 指示に従う必要がある場合、または会話で使用する場合に使用するために、指示 (会話型) バージョンが登場します。 これらのチェックポイントは、命令と会話データに基づいて事前トレーニングされた基本バージョンをさらに微調整した結果です。 この追加の微調整により、会話型の多くの課題にとってより適切な選択肢になります。

 LLM を利用する一般的な使用事例の1つは「チャット」です。 チャットのコンテキストでは、通常の言語モデルのように単一のテキストストリングを継続するのではなく、モデルは1つ以上の「メッセージ」からなる会話を継続します。 各メッセージには「ロール」と「メッセージテキスト」が含まれます。最も一般的に、これらのロールはユーザーからのメッセージには「ユーザー」、モデルからのメッセージには「アシスタント(あるいは、システム)」が割り当てられます。

 以下の例を見て下さい。tokenizer の apply_chat_template というメソッドで定義された chat_template に従いプロンプトが構築されます。


from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b-jpn-it")

chat = [
  {"role": "user", "content": "こんにちわ、お元気ですか?"},
  {"role": "assistant", "content": "元気です。何かお手伝いすることはありますか?"},
  {"role": "user", "content": "チャットボットについて教えて下さい。"},
]

tokenizer.apply_chat_template(chat, tokenize=False)

--- response 
user\nこんにちわ、お元気ですか?\nmodel\n元気です。何かお手伝いすることはありますか?\nuser\nチャットボットについて教えて下さい。\n


 tokenizer.apply_chat_template()に chat メッセージを渡すことで、チャットモデルテンプレートをもとにプロンプトが作成されます。チャット全体が単一の文字列にまとめられています。 tokenize=False を指定し、トークナイズせずテキストのまま返して結果を確認しています。tokenize=True とすると、メッセージがトークン化されます。ここで用いたモデル, google/gemma-2-2b-jpn-it では、"system" ロールは使用できません。また、user/assistant/user の順に chat のメッセージを記述する必要があります。 詳細な説明は、Transformers :チャットモデルのテンプレートのページを読んでください。

 上記の例からわかるように、チャット・テンプレートは簡単に使用できます。role キーと content キーを使用してメッセージのリストを作成し、それを apply_chat_template() メソッドに渡すだけです。これを行うと、すぐに使用できる出力が得られます。チャット・テンプレートをモデル生成の入力として使用する場合は、 add_generation_prompt=True を使用して生成用プロンプトを追加することになります。


from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b-jpn-it")
model = AutoModelForCausalLM.from_pretrained("google/gemma-2-2b-jpn-it")  # You may want to use bfloat16 and/or move to GPU here

messages = [
  {"role": "user", "content": "こんにちわ、お元気ですか?"},
  {"role": "assistant", "content": "元気ですか?何かお手伝いすることはありますか?"},
  {"role": "user", "content": "チャットボットについて教えて下さい。"},
]

tokenized_chat = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt")

outputs = model.generate(tokenized_chat, max_new_tokens=128) 
print(tokenizer.decode(outputs[0]))

--- response 
user
こんにちわ、お元気ですか?
model
元気です。何かお手伝いすることはありますか?
user
チャットボットについて教えて下さい。
model
了解です!チャットボットについて詳しく説明します。

**チャットボットとは?**

チャットボットは、人間と自然な会話をすることができる、AI(人工知能)を搭載したソフトウェアです。 
主に、以下の様な機能で利用されます。

* **質問応答:**  ユーザーからの質問に対して、適切な回答を提供します。
* **会話の進行:**  ユーザーの意図を理解し、自然な会話の流れで応答します。
* **情報提供:**  ユーザーの興味や要望に応じた情報を提供します。
* **カスタマーサポート:**  


 生成するトークン数を128と指定しているので、生成されたテキストが途中で切れています。

 チャット形式でLLMモデルを利用するときに最も簡単な方法は pipeline() を活用することです。以下のようなチャットメッセージを作成します。


chat = [
  {"role": "user", "content": "こんにちわ、お元気ですか?"},
    {"role": "assistant", "content": "あなたはとても優秀なAIアシスタントです。"},
    {"role": "user", "content": "東京に滞在中に楽しい経験をする計画を教えて下さい。"}
]


 ユーザーのメッセージ、アシスタント・メッセージ、ユーザーのメッセージの順に構成されています。すべてのチャット・モデルがシステム(アシスタント)・メッセージをサポートしているわけではありませんが、サポートしている場合は、会話でモデルがどのように動作するかについての高レベルの指示を表します。次に、 TextGenerationPipeline を用いてテキストを生成します。


import torch
from transformers import pipeline

pipe = pipeline("text-generation", "google/gemma-2-2b-jpn-it", torch_dtype=torch.bfloat16, device_map="auto")
response = pipe(chat, max_new_tokens=512)
print(response[0]['generated_text'][-1]['content'])

--- response 
東京滞在中に楽しい経験をする計画、いいですね!😊

いくつか質問させてください!

1. **どんなことに興味がありますか?** (例:歴史、アート、グルメ、ショッピング、自然など)
2. **誰と行く予定ですか?** (例:家族、友人、恋人、 soloなど)
3. **滞在期間はどのくらいですか?** 
4. **予算はどのくらいですか?** 


これらの情報があれば、あなたにぴったりの東京旅行プランを提案できます! 


例えば、

* **歴史好きなら**  
    * **浅草寺:**  歴史と文化を感じられる、東京のシンボル。
    * **皇居:**  日本の伝統と歴史を感じられる、皇室の邸宅。
    * **江戸東京博物館:**  江戸時代から現代までの歴史を学ぶことができます。
* **アート好きなら**  
    * **国立西洋美術館:**  世界的な芸術作品を鑑賞できます。
    * **東京国立博物館:**  日本の歴史や文化を学ぶことができます。
    * **渋谷スクランブル交差点:**  アートとファッションの街として有名です。
* **グルメ好きなら**  
    * **築地市場:**  新鮮な魚介類や海鮮料理を味わえます。
    * **新宿御苑:**  緑豊かな公園で、美味しいランチやカフェを楽しめます。
    * **銀座:**  高級レストランやおしゃれなカフェが立ち並ぶ街。
* **ショッピング好きなら**  
    * **新宿御苑:**  緑豊かな公園で、美味しいランチやカフェを楽しめます。
    * **渋谷:**  最新のファッションや雑貨が揃う街。
    * **原宿:**  個性的なショップやカフェが立ち並ぶ街。


 続けて会話を続けるときは、以下のように、前の会話の結果を受けます。


chat = response[0]['generated_text']
chat.append(
    {"role": "user", "content": "浅草寺はどんなところですか?"}
)
response = pipe(chat, max_new_tokens=512)
print(response[0]['generated_text'][-1]['content'])

--- response
浅草寺は、東京のシンボル的な存在で、歴史と文化を感じられる場所です! 

**主な特徴は以下の通りです:**

* **歴史:**  江戸時代から続く歴史ある寺で、日本文化の象徴として知られています。
* **建築:**  独特の建築様式で、美しい装飾と歴史を感じさせる雰囲気があります。
* **境内:**  広い境内には、雷門、五重塔、本堂など、多くの建造物が存在します。
* **信仰:**  多くの信仰者が訪れる寺で、様々な祈りの儀式が行われています。
* **観光スポット:**  浅草寺周辺には、様々な観光スポットがあり、お土産屋さんや飲食店もたくさんあります。
* **伝統芸能:**  浅草寺周辺には、伝統芸能の舞台やイベントが開催されることもあります。

**浅草寺を訪れると、**

* **日本の伝統文化に触れる:**  歴史や文化を感じられる、貴重な体験ができます。
* **美しい景色を楽しむ:**  境内には、様々な建造物が存在し、美しい景色を楽しむことができます。
* **美味しい食べ物を味わう:**  浅草寺周辺には、様々な飲食店があり、美味しい食べ物を味わえます。


 以上で chat prompt の簡単な書き方が理解できたと思います。

 続く To be continued ---


このページの先頭に戻る

トップページに戻る