LangChainでのプロンプティング

最近、LLMが爆発的に普及し、新しいツールやアプリケーションが登場した。これらの新しい強力なツールの一つは、LangChainと呼ばれるLLMフレームワークである。LangChainはオープンソースのフレームワークで、プロンプトテンプレート、様々なプロンプトメソッド、会話コンテキストの保持、外部ツールとの接続の例を提供している。
LangChainは、様々なプロンプトメソッド、会話コンテキストの保持、外部ツールとの接続など、多くの機能を持っています。プロンプティングは、LLMアプリケーションを構築する上で、今日最もポピュラーで重要なタスクの一つです。より複雑なプロンプトのためにLangChainの使い方を広く見てみましょう。
この記事では
LangChainのシンプルなプロンプト
複数質問プロンプト
LangChainを使った数発学習
LangChainプロンプトのトークン制限
LangChainのプロンプトのまとめ
LangChainのシンプルなプロンプト
コードに入る前に、必要なライブラリをダウンロードする必要があります。langchain openai python-dotenvを
pip install langchain openai python-dotenvする必要がある。openai
と dotenv
ライブラリは GPT にアクセスするための OpenAI API キーを管理するために使います。
python import os from dotenv import load_dotenv import openai load_dotenv() openai.api_key = os.getenv("OPENAI_API_KEY")
前提条件が整ったら、まずは基本中の基本であるシングルプロンプトから始めましょう。単一のプロンプトとは、[OpenAIのChatGPT](https://zilliz.com/learn/ChatGPT-Vector-Database-Prompt-as-code)のウェブサイトと対話する方法です。しかし、LangChainプロンプトがどのように動作するかを理解することは重要です。
プロンプトを作成するには**PromptTemplate**オブジェクトを使います。テンプレート文字列の定義は簡単で、f-文字列と同じ構文を使い、中括弧を使って変数を挿入します。テンプレート文字列と対応する変数名を渡してプロンプトを定義します。あとは質問を入力するだけである。このセクションで使用する質問は1つだけです。
質問プロンプトに加えて、使用するLLMを追加する必要があります。この例ではOpenAIの`text-davinci-003`を使用します。次に、プロンプトのテンプレートとLLMのコンテキストで`LLMChain`を作成します。LLMChainを通して質問を`実行`し、応答を取得します。
python
from langchain import PromptTemplate
from langchain import LLMChain
template = """質問です:質問
答え"""
prompt = PromptTemplate(
template=template、
input_variables=["質問"])
)
user_question = "2010年のスーパーボウルで優勝したNFLチームは?"
from langchain.llms import OpenAI
davinci = OpenAI(モデル名="text-davinci-003")
llm_chain = LLMChain(
prompt=prompt、
llm=davinci
)
print(llm_chain.run(user_question))
複数の質問プロンプト
単一の質問に答えるのはつまらないので、もっと面白いものを見てみましょう。PromptTemplateオブジェクトは複数の質問を扱うこともできます。このチュートリアルでは、単一プロンプトとほぼ同じことを行いますが、別のプロンプトを使用します。今回のPromptTemplate**はLLMに一度に1つずつ質問に答えるように指示し、複数あることを示します。
もう一度、前と同じように PromptTemplate オブジェクトと LLMChain オブジェクトを作成します。今回は1つではなく、複数の質問文字列を作成します。この例では、4つの質問を組み合わせます。
python multi_template = """次の質問に1つずつ答えてください。
質問 質問
答え """ long_prompt = PromptTemplate(template=multi_template, input_variables=["questions"])
llm_chain = LLMChain( prompt=long_prompt、 llm=davinci )
qs_str = ( "2010年シーズンのスーパーボウルで優勝したNFLチームは?"+ "私の身長が6フィート4インチだとすると、センチメートルで表すと何センチですか?"+ "月面に降り立った12人目の人物は?"+ "草の葉には目がいくつあるか?" )
print(llm_chain.run(qs_str))
上の4つの質問を実行すると、下のような出力が得られるはずです。セインツは2010年のスーパーボウルで優勝した。6フィート4インチの人は約193.04cmです。月面に降り立った12番目の人物はハリソン・シュミットである。最後に、草の葉の目に関するひっかけ問題では、草の葉には目がないという答えが返ってくる。
LangChainプロンプト出力](https://assets.zilliz.com/prompting_langchain_b76269aae1.png)
## LangChainプロンプトによる数発学習
LangChainができるもっと面白いこと、"数ショット学習 "を見てみましょう。LangChainのFewShotPromptTemplateを使って、AIに振る舞いを教えることができます。このチュートリアルでは、LLMがどのように行動して欲しいかを示すために、いくつかの例を提供します。今回は、やや生意気な性格にします。
時間を尋ねると、「時計を買う時間だ」と言う。好きな映画を尋ねると、ターミネーターと答える。今日は何をすればいい?と聞くと、「外に出て、インターネット上のチャットボットと話すのをやめなさい」と言う。
パイソン
from langchain import FewShotPromptTemplate
# サンプルを作成する
例 = [
{
"query":"お元気ですか?
"answer":"I can't complain, but sometimes I still.".
}, {
"query":「今何時ですか?
答え"It's time to get a watch.".
}, {
"query":「人生の意味は何ですか?
答え"42"
}, {
"query":「今日の天気は?
「answer":"Cloudy with a chance of memes.".
}, {
"query":"好きな映画は何ですか?
「答え":「ターミネーター
}, {
"query":「あなたの親友は誰ですか?
"answer":"Siriです。人生の意味について熱く語り合っています。"
}, {
"query":「今日は何をすればいいですか?
"answer":"インターネットでチャットボットと話すのをやめて、外に出る。"
}
]
さて、いくつかの例の準備ができたので、数発学習のテンプレートを作ってみよう。まず、テンプレートを作成する。クエリを示してAIから答えを返すシンプルなテンプレートを使うことができる。
python
テンプレートの例を作成する。
example_template = "" ユーザー:{クエリ} AI: {答え} "" """
上記のテンプレートからプロンプトの例を作成する
example_prompt = PromptTemplate( input_variables=["query", "answer"]、 テンプレート=example_template )
プロンプトの設定に加えて、LLMに渡す会話の接頭辞と接尾辞を指定する。接頭辞はLLMに次の会話がコンテキストを提供する抜粋であることを示します。接尾辞はシステムに次の質問を与えます。LangChainの数ショット学習は[conversational context](https://go.mlops.community/7Xz16F)に似ていますが、より一時的なものです。
例、プロンプトテンプレート例、接頭辞、接尾辞の準備ができたので、これらをまとめて`FewShotPromptTemplate`を作ります。
``python
# 前のプロンプトをプレフィックスとサフィックスに分割します。
# プレフィックスは私たちの指示
prefix = """以下はAIアシスタントとの会話の抜粋です。
アシスタントとの会話の抜粋です。このアシスタントは皮肉屋で機知に富み、ユーザーの質問に対して創造的で面白い返答をします。
ユーザーの質問に対してクリエイティブで面白い返答をします。以下はその一部である。
例である:
"""
# およびサフィックスは、ユーザーの入出力インジケータです。
suffix = """
ユーザー: {クエリ}
AI: """
# 次に、数ショットのプロンプトテンプレートを作成する
few_shot_prompt_template = FewShotPromptTemplate(
example=examples、
example_prompt=example_prompt、
prefix=prefix、
suffix=suffix、
input_variables=["query"]、
example_separator="\nn"
)
query = "人生の意味とは?"
fs_llm_chain = LLMChain(
prompt=few_shot_prompt_template、
llm=davinci
)
fs_llm_chain.run(few_shot_prompt_template.format(query=query))
人生の意味についてのクエリを実行すると、下の画像のようなLLMからの応答が表示されます。あなたの走行距離や結果は異なるかもしれません。
LLMからの回答](https://assets.zilliz.com/query_prompting_langchain_706df7e053.png)
LangChainプロンプトを制限するトークン
AIにあなたの会話履歴の例を与えて学習させることは素晴らしいことですが、それはすぐに高くつく可能性があります。LangChainはトークンの使用量を制限する方法を提供しています。これは LengthBasedExampleSelector オブジェクトを使って行います。
すでに作成したオブジェクトを使って、長さベースのサンプル・セレクタを作成することができます。これには、例のリスト、上記で作成したプロンプト、および 1 つのクエリでのトークン使用を制限する max_length パラメータを渡します。
次に、別の数発のテンプレートを使用します。example_selectorという新しいパラメータを使用し、先ほどインスタンス化した長さベースの例セレクタを渡します。これは、上記の数発学習セクションのexamples**パラメーターと同じように機能します。あとは、LLMChainに渡してクエリーを送るだけです。
python from langchain.prompts.example_selector import LengthBasedExampleSelector
example_selector = LengthBasedExampleSelector( examples=examples、 example_prompt=example_prompt、 max_length=50 # これは、例題の最大長(単語数)を設定します。 )
プロンプトのテンプレートを作成する
dynamic_prompt_template = FewShotPromptTemplate( example_selector=example_selector, # exampleの代わりにexample_selectorを使用する。 example_prompt=example_prompt、 prefix=prefix、 suffix=suffix、 input_variables=["query"]、 example_separator="\n") )
d_llm_chain = LLMChain( prompt=dynamic_prompt_template、 llm=davinci ) d_llm_chain.run(dynamic_prompt_template.format(query=query))
この例から、私たちはまた別の思索的な回答を得ることができる。人生は自分が作るものだ。ベストを尽くして旅を楽しもう。
観照的応答](https://assets.zilliz.com/response_prompting_langchain_bee4e2b545.png)
## LangChainにおけるプロンプトの要約
この記事では、LangChainプロンプトがどのように機能するのかを掘り下げてみた。LangChainは堅牢なLLMアプリフレームワークで、[プロンプトエンジニアリング](https://zilliz.com/glossary/prompt-as-code-(prompt-engineering))アプリケーションを促進するプリミティブを提供する。基本的なレベルでは、LangChainはカスタマイズ可能なプロンプト・テンプレートを提供する。PromptTemplate**オブジェクトがどのように機能するかを理解するために、単一質問と複数質問のプロンプトを見てみました。
プロンプトテンプレートの他に、LLMがどのようにチャットすべきかを生成するための数ショット学習テンプレートも見てみました。この数ショット学習テンプレートはいくつかのQ/Aの例を取り、[LLMにプロンプトを出す](https://zilliz.com/blog/llm-powered-text-to-image-prompt-generation-with-milvus)ことで、例が示すように動作します。最後に、コストを抑えるためにクエリーをトークンで制限する方法について調べた。
## プロンプト・インジェクション攻撃
最後に、LangChainを使う上で重要なセキュリティ上の注意点、プロンプト・インジェクション攻撃について説明します。これは悪意のある入力がプロンプトに注入され、AIモデルの出力や動作を操作してしまうことです。LangChainはユーザー入力を言語モデルに渡すので、特にこの攻撃を受けやすい。リスクは、不正なデータアクセスから有害なコンテンツの生成、安全機能のバイパスまで多岐にわたります。
このようなプロンプトインジェクションのリスクを軽減するために、LangChainを使用する開発者は以下のことを行う必要があります。入力を徹底的にサニタイズし、LangChainのプロンプトテンプレートを使い、出力を厳密に解析し、最小特権の原則に従う。LangChainと関連ライブラリを定期的に更新し、包括的にテストし、最新のAIセキュリティ・ニュースを常に把握する。これらはプロンプト・インジェクション攻撃のリスクを減らすのに役立ちますが、完璧な解決策はなく、LangChainのようなAIを使うときは常に警戒する必要があることを忘れないでください。
読み続けて

Zilliz Cloud Introduces Advanced BYOC-I Solution for Ultimate Enterprise Data Sovereignty
Explore Zilliz Cloud BYOC-I, the solution that balances AI innovation with data control, enabling secure deployments in finance, healthcare, and education sectors.

Multimodal Pipelines for AI Applications
Learn how to build scalable multimodal AI pipelines using Datavolo and Milvus. Discover best practices for handling unstructured data and implementing RAG systems.

LLaVA: Advancing Vision-Language Models Through Visual Instruction Tuning
LaVA is a multimodal model that combines text-based LLMs with visual processing capabilities through visual instruction tuning.