Prompt Engineering for Generative AI読書メモ

Chapter 1. The Five Principles of Prompting
-
方向性を示す
希望するスタイルを詳細に記述するか、関連するペルソナを参照する -
フォーマットを指定する
どのようなルールに従うべきか、また回答の構成はどのようなものであるべきかを定義する -
例を示す
タスクが正しく実行された多様なテストケースを挿入する -
品質を評価する
エラーを特定し、回答を評価する。 -
作業を分割する
タスクを複数のステップに分割し、複雑な目標のために連鎖させる
1. Give Direction
コンテキスト(この章ではルールという表現でも当てはまってそう)を与える例を紹介
他にも「スティーブ・ジョブズ風に」、「ヴァン・ゴッホ風に」商品名、画像を生成するようAIに要求する例でこれを説明している。この具体的な指示は、AIが特定の美学に沿ったアウトプットを生成するよう導く。
2. Specify Format
テキスト形式では、JSON、CSVで出力して、画像ではストックフォト、イラスト、油絵から、ダッシュカムの映像、氷の彫刻、マインクラフト等、希望の出力形式を指定することが不可欠だ、という紹介
3. Provide Examples
one-shotやfew-shotのこと
4. Evaluate Quality
5. Divide Labor
プロンプトにLet's think step by stepを追加するだけで、推論と熟練度が明らかに向上するだけでなく、品質保証とデバッグのための監査証跡を提供することができるからだ。 推論に時間とトークンをかけると、評価が変化し、採点基準との整合性が高まります。
OpenAIはこれを「モデルに考える時間を与える」と呼び、プロンプト・エンジニアリングの重要な信条としている。 事実上、このような思考の連鎖のテクニックは、モデルがそのステップを列挙するよう促すもので、同じプロンプト内でタスクを分割するようなものだ。 商品のアイデアを与えて商品名を自動化したら、再びChatGPTを呼び出して各商品を説明し、それをMidjourneyに入力して各商品の画像を生成することができる。
この章では、promptへ質問を分けて深堀りしている例を紹介

Chapter 2. Introduction to Large Language Models for Text Generation

Chapter 3. Standard Practices for Text Generation with ChatGPT
List
LLMを使ってリストの作成、洗練、重複除去を処理する間、ユーザはより高いレベルのタスクに集中できるようにします。この章では、正規表現を使用して階層リストをPython辞書に解析するテクニックを紹介し、JSON、YAMLで返却するよう指示し構造化データを抽出する方法を示します。
ex.
- https://github.com/BrightPool/prompt-engineering-for-generative-ai-examples/blob/main/content/chapter_3/prompts/prompt_yaml.txt
- https://github.com/BrightPool/prompt-engineering-for-generative-ai-examples/blob/main/content/chapter_3/yml_parsing.py
Diverse Format Generation with ChatGPT
Mermaid format、csv formatでの出力の例を紹介
Explain It like I’m Five
5歳の子どもに説明しているように解説して、と言うといいよという紹介
Explain the following text as if I was 5 years old. Explain it like I'm 5.
Text: This is a review regarding different types of cancer treatments.
We aimed at analyzing...
Manipulating Complexity
ユーザーは、LLMにテキストを簡略化したり、より複雑なものにするよう要求することができ、言語や文体を適応させるモデルの能力を探ることができる。 このテクニックは、技術文書の簡略化や、さまざまなスタイルでの創造的な文章の生成など、さまざまな用途に役立つ可能性がある。
Ask for Context
LLMが環境コンテキストに基づいて意思決定を行うエージェ ントとしてどのように機能するかを検討する。 必要なときにLLMがより多くのコンテキストを要求できるようにすることで、ユーザーはプロンプトを繰り返し改良し、十分な情報に基づいた意思決定へとモデルを導くことができる
input
Should I use MongoDB or PostgreSQL for my project?
Provide a list of requirements that would help you to make an informed
and high-quality decision about which database solution I should choose?
output
To make an informed decision between MongoDB and PostgreSQL for your
project, consider the following requirements:
1. Data Structure: Evaluate the structure of your data. If your data
...
10. Cost: Assess the cost implications of each database solution. MongoDB
...
input
Should I use MongoDB or PostgreSQL for my project?
Context:
- Data Structure: Highly unstructured data with varying document formats
...
- Cost: Assess the cost implications of each database solution. MongoDB
If you need more context, please specify what would help you to make
a better decision.
Text Style Unbundling
文章のスタイル、つまりはTone of voice, Vocabulary and phrasingを抜き出して、文章の作成の例を紹介
input
Analyze the following text and identify core features that will allow
further documents to imitate the same style, consistency, and formatting
as the document below.
Provide all of the features as a style writing guide that will be used
for future documents.
Analyze the following text:
何かの文章
output
スタイルを分析した結果
input
分析結果を利用して文書の作成
Write a new blog post on [topic] using the same tone of voice, length, vocabulary, and structure as the previously analyzed text.
Summarization
テキストの要約: LLMは、テキストの要約を生成し、重要な情報を抽出する一方で、関連性の低い詳細は削除することができる。 これは特に、長い文書や記事を素早く理解するのに役立つ。
Summarize the following text:
何かの文章
Chunking Text
LLMを使用する際の「チャンキング」の概念について説明している。チャンキングとは、モデルのコンテクストウィンドウによる制限を克服するために、テキストをより小さなセグメントに分割することだ。文、段落、トピック、固定文字数による分割など、さまざまなチャンキング戦略について説明している。
Chunking Strategies
- Splitting by sentence
- Splitting by paragraph
- Splitting by topic or section
- Splitting by complexity
- Splitting by length
- Splitting by tokens using a tokenizer
Sentence Detection Using SpaCy: https://github.com/BrightPool/prompt-engineering-for-generative-ai-examples/blob/main/content/chapter_3/sentence_detection_in_spacy.py
文字の長さに基づいてテキストをチャンクに分割する方法を紹介
character length chunking: https://github.com/BrightPool/prompt-engineering-for-generative-ai-examples/blob/main/content/chapter_3/character_chunking_hubspot_blog_post.py
Sliding Window Chunking: https://github.com/BrightPool/prompt-engineering-for-generative-ai-examples/blob/main/content/chapter_3/sliding_window.py
Text Chunking Packages
ここでのText Chunkingはtoken chunkingと同じ意味だと思う
Tiktokenは、テキストをサブワード単位に分解する高速バイトペアエンコーディング(BPE)トークン化ツールで、OpenAIのモデル用に設計されている
英語では、トークンの長さはtのような1文字から、greatのような単語全体までさまざまです。 これはトークン化の適応性の高さによるもので、複雑なスクリプト言語では1文字よりも短いトークンにも対応でき、スペースがない言語やフレーズが1つの単位として機能する言語では単語よりも長いトークンにも対応できる
tiktoken example: https://github.com/BrightPool/prompt-engineering-for-generative-ai-examples/blob/main/content/chapter_3/tiktoken_example.py
chat形式のトークンのカウントのコードも紹介。tiktoken exampleの中に掲載
Sentiment Analysis
ex.
input
Using the following examples as a guide:
positive: 'I absolutely love the design of this phone!'
negative: 'The battery life is quite disappointing.'
neutral: 'I liked the product, but it has short battery life.'
Only return either a single word of:
- positive
- negative
- neutral
ここに文章
5つの原則の他に以下のこともやると効果的ですよという紹介
- Special characters removal
- Lowercase conversion
- Spelling correction
あと皮肉やドメイン固有の専門用語や、文化表現に関連するようなものは限界や課題に直面しているとのこと
Least to Most
Flaskというwebアプリフレームワークでのアプリ構築方法を例にとった紹介。以下inputの例
- シンプルなFlask "Hello World "アプリケーションの基本アーキテクチャをアウトラインして。
-> output - Flaskのシンプルな "Hello World "ルートのコードスニペットを提供して。
-> output - Flask アプリケーションの "Hello World" ルートのテストケースの例を示して。
-> output
これらが基本的な質問から始まり、与えられたトピックのより複雑な側面へと徐々に進んでいく least to mostの例
(個人的にはオーソドックスな使い方な印象)
Role Prompting
役割プロンプトとは、AIに特定の役割やキャラクターを与え、その役割を演じさせながら応答を生成させる手法である。
ex.
I want you to act as a tech reviewer. I will give you the name of a piece
of technology and you will provide me with an in-depth review - including
pros, cons, features, and comparisons to other technologies on the market.
My first suggestion request is: MongoDB.
I want you to act as a tech reviewer.の部分のこと
課題としてステレオタイプ化された役割を割り当てることは、偏った応答を生成することにつながり、ユーザビリティを損なったり、個人を不快にさせる可能性がある。さらに、長時間の対話を通して役割の一貫性を維持することは困難だ。
Avoiding Hallucinations with Reference
hallucinationsを回避するためのtips
input
Refer to the articles enclosed within triple quotes to respond to queries.
You must follow the following principles:
- In cases where the answer isn't found within these articles, simply
return "I could not find an answer".
"""
B2B clients tend to have l...
"""
Example responses:
- I could not find an answer.
- Yes, B2B clients tend to have l...
コンテキストウィンドウサイズが課題。Augのようなシステムで対応することを紹介
Give GPTs “Thinking Time”
例は書籍内参照
The Inner Monologue Tactic
ユーザーから隠蔽されるべき出力部分を特定のフォーマットで構造化するようモデルに指示。
例は書籍内参照
Self-Eval LLM Responses
生成されたLLMの出力を批評し、LLMが何か情報や重要な事実を見逃していないかを尋ねることだ。あなたは本質的に、LLMに以前の出力に基づいて自分自身を評価するよう求めている。
例は書籍内参照
Classification with LLMs
LLMを使って分類問題を解くには、zero-shot学習とfew-shot学習という2つの包括的な戦略があるとのこと
Building a Classification Model
Given the statement, classify it as either "Compliment", "Complaint", or
"Neutral":
1. "The sun is shining." - Neutral
2. "Your support team is fantastic!" - Compliment
3. "I had a terrible experience with your software." - Complaint
You must follow the following principles:
- Only return the single classification word. The response should be either
"Compliment", "Complaint", or "Neutral".
- Perform the classification on the text enclosed within """ delimiters.
"""The user interface is intuitive."""
Classification:
Meta Prompting
メタ・プロンプトとは、テキスト・プロンプトを作成し、そのテキスト・プロンプトが他のテキスト・プロンプトを生成するというテクニック
Act as a GPT Prompt Engineer, you are solely responsible for producing
highly effective large language model text prompts given a task.
You must follow the following principles:
- Return only a single prompt, never return the output of a prompt.
- You must follow the task properly.
- You must either refine the prompt or create a new prompt depending upon
the Task.
- Bullet point out any important features so that another Prompt Engineer
can easily copy inputs into the prompt.
Task: してほしいこと

Chapter 4. Advanced Techniques for Text Generation with LangChain
Introduction to LangChain
LangChainはLLMを使ったアプリケーションを作成するためのフレームワークです。コンテキストの長さの制限や複雑な推論タスクなどの問題に対するソリューションを提供する
フレームワークはPythonとTypeScriptで利用可能で、6つのコアモジュールを提供する
- モデルI/O
モデルに関する入出力操作を処理する。 - 検索
LLMに関連するテキストを検索する。 - チェーン
LangChain runnablesとしても知られているチェーンは、LLM操作や関数呼び出しのシーケンスを構築することができます。 - エージェント
チェーンが高レベルの指示や命令に基づいて、どのツールを使うかを決定できるようにする。 - メモリ
チェーンの異なる実行間でアプリケーションの状態を保持する。 - コールバック
新しいトークンが生成されるときなど、特定のイベントで追加のコードを実行する。
LangChainの主な利点の一つは、プラットフォームにとらわれないアプローチであり、開発者はAnthropic、Vertex AI、OpenAI、BedrockChatのような様々なLLMモデルを試すことができる。
Chat Models
GPT-4のようなチャットモデルは、OpenAIのAPIと対話するための主要な方法だ。これらは、チャットメッセージが入力と出力の両方の役割を果たす会話アプローチを採用している。LangChainはこれらのモデルと対話するために、AIMessage、HumanMessage、SystemMessageのようなメッセージタイプを定義している。LLMはこのメッセージタイプ内のガイドラインを優先するので、明確な指示にはSystemMessageを使うことをお勧めする。
Streaming Chat Models
for chunk in chat.stream(messages):
print(chunk.content, end="", flush=True)
Creating Multiple LLM Generations
LangChain は効率的な同時APIリクエストのために非同期関数 (接頭辞に 'a' が付く、例えば .ainvoke() や .abatch()) をサポートしている
chat.invokeではなくchat.batch
また、asyncio.run(chat.abatch
LangChain Prompt Templates
LangChain Expression Language (LCEL)
LCELはLangChainのコア・コンポーネントで、パイプ演算子(|)を使って、異なるコンポーネントやランナブルをシーケンスで連鎖させる。基本コンポーネントから複雑なチェーンを構築し、処理パイプライン内のスムーズなデータフローを保証する。連鎖の順序は重要であり、誤った順序は実行中のエラーにつながる。
Using PromptTemplate with Chat Models
LangChainはより伝統的なテンプレートアプローチのためにinput_variablesとテンプレート引数を必要とするPromptTemplateクラスを提供する。これはチャットモデルのプロンプトを柔軟にフォーマットすることができる。しかし、複雑なシナリオや特定の出力フォーマットでは、フォーマットされたプロンプトを持つSystemMessageを直接呼び出す方がシンプルかもしれない。
Output Parsers
LangChainの出力パーサーはLLM文字列レスポンスから構造化データを抽出する。第3章で示したように、正規表現を手動で使うよりも高いレベルの抽象化を提供する。LangChainは様々な出力パーサーを提供している。
- List parser(リスト・パーサー)
- Datetime parser(日時パーサー)
- Enum parser(列挙パーサー)
- Auto-fixing parser(自動修正パーサー)
- Pydantic (JSON) parser(Pydantic (JSON) パーサー)
- Retry parser(リトライパーサー)
- Structured output parser(構造化出力パーサー)
- XML parser(XMLパーサー)
LangChain Evals
LangChain Evalsは、各プロンプト応答のパフォーマンスを測定するための評価指標だ。これらは検索用の肯定的な例と否定的な例を識別したり、カスタムモデルを微調整するためのデータセットを構築するために使用することができ、プロンプトのテストに役立つだけではない。LangChainには、LangSmithプラットフォームやWeights and Biasesのような代替の機械学習プラットフォームに直接ログインして、デバッグ、モニタリング、テストを行うことができる、既製の評価ツールが多数ある。評価者は、正解がわかっている入力と出力の組み合わせのテストケースのセットを使用することができる。文字列の完全一致のような基本的なものから、2つの異なるプロンプトやモデルからの出力を比較するような、LLMを評価対象として使用する高度なものまである。より複雑な評価では、評価者自身を評価することが重要だ。
↑ labeled_pairwise_stringを使用したサンプル
# Pairwise comparison between GPT-4 and Mistral
from langchain.evaluation import load_evaluator
evaluator = load_evaluator("labeled_pairwise_string")
row = df.iloc[0]
transaction = row["Transaction Description"]
gpt3pt5_category = row["gpt3.5_transaction_category"]
gpt3pt5_type = row["gpt3.5_transaction_type"]
mistral_category = row["mistral_transaction_category"]
mistral_type = row["mistral_transaction_type"]
reference_category = row["transaction_category"]
reference_type = row["transaction_type"]
# put the data into JSON format for the evaluator
gpt3pt5_data = f"""{{
"transaction_category": "{gpt3pt5_category}",
"transaction_type": "{gpt3pt5_type}"
}}"""
mistral_data = f"""{{
"transaction_category": "{mistral_category}",
"transaction_type": "{mistral_type}"
}}"""
reference_data = f"""{{
"transaction_category": "{reference_category}",
"transaction_type": "{reference_type}"
}}"""
# set up the prompt input for context for the evaluator
input_prompt = """You are are an expert at analyzing bank transactions,
you will be categorising a single transaction.
Always return a transaction type and category: do not return None.
Format Instructions:
{format_instructions}
Transaction Text:
{transaction}
"""
evaluator.evaluate_string_pairs(
prediction=gpt3pt5_data,
prediction_b=mistral_data,
input=input_prompt.format(
format_instructions=output_parser.get_format_instructions(),
transaction=transaction),
reference=reference_data,
)
OpenAI Function Calling
開発者が推論とユーザー入力に基づいて特定の関数をトリガーするためにLLMを活用することを可能にします
Function Calling in LangChain
LangChainはLLMアプリケーションへの関数呼び出しの統合を簡素化する。Pydanticモデルを使った関数呼び出しにより、LLMレスポンスから構造化データを抽出することができる。
サンプルコードは一つ上の項のリンクと同じ
# Create a prompt telling the LLM to extract information
prompt = ChatPromptTemplate.from_messages(
{("system", _EXTRACTION_TEMPLATE), ("user", "{input}")}
)
model = ChatOpenAI()
pydantic_schemas = [Article]
# Convert Pydantic objects to the appropriate schema:
tools = [convert_to_openai_tool(p) for p in pydantic_schemas]
# Give the model access to these tools:
model = model.bind_tools(tools=tools)
# Create an end to end chain
chain = prompt | model | PydanticToolsParser(tools=pydantic_schemas)
Extracting Data with LangChain
LangChainは様々な方法でテキストから構造化データを抽出することに優れている。一つの方法は、PydanticスキーマをOpenAIツールに変換し、これらのツールをLLMにバインドし、ツールパーサーを組み込んだLCELチェーンを作成することだ(これが一つ上のFunction Calling in LangChainの項)。また、create_extraction_chain_pydantic関数を使えば、このプロセスを簡略化して並列関数呼び出しができる。
from langchain.chains.openai_tools import create_extraction_chain_pydantic
from langchain_openai.chat_models import ChatOpenAI
from langchain_core.pydantic_v1 import BaseModel, Field
# Make sure to use a recent model that supports tools
model = ChatOpenAI(model="gpt-3.5-turbo-1106")
class Person(BaseModel):
"""A person's name and age."""
name: str = Field(..., description="The person's name")
age: int = Field(..., description="The person's age")
chain = create_extraction_chain_pydantic(Person, model)
chain.invoke({'input':'''Bob is 25 years old. He lives in New York. He likes to play basketball. Sarah is 30 years old. She lives in San Francisco. She likes to play tennis.'''})
# -> [Person(name='Bob', age=25), Person(name='Sarah', age=30)]
Query Planning
LangChainは、クエリ構造を表すPydanticモデルを定義し、LLMを使用してユーザクエリを依存関係を持つ複数のステップに解析することで、クエリプランニングを可能にします。この構造化されたアプローチにより、複雑なタスクが管理可能なサブクエリに分割されます。
parser = PydanticOutputParser(pydantic_object=QueryPlan)
result = chain.invoke({
"query":'''I want to get the results from my database. Then I want to find
out what the average age of my top 10 customers is. Once I have the average
age, I want to send an email to John. Also I just generally want to send a
welcome introduction email to Sarah, regardless of the other tasks.''',
"format_instructions":parser.get_format_instructions()})
print(result.query_graph)
ouput
[Query(id=1, question='Get top 10 customers', dependencies=[]),
Query(id=2, question='Calculate average age of customers', dependencies=[1]),
Query(id=3, question='Send email to John', dependencies=[2]),
Query(id=4, question='Send welcome email to Sarah', dependencies=[])]
Creating Few-Shot Prompt Templates
LangChainでfew-shotプロンプトのテンプレートを作成することができる2つの方法を見てみる
Fixed-Length Few-Shot Examples
あらかじめ定義された例を作成し、ChatPromptTemplateオブジェクトを使用してチャットメッセージにフォーマットする。この方法は、例題があらかじめ決まっているシナリオに適している。
Selecting Few-Shot Examples by Length
ユーザー入力の長さが大きく異なる場合に使用する。LengthBasedExampleSelectorは、入力の長さに基づいて例の数を調整し、LLMがコンテキストウィンドウの制限内に収まるようにする。
Limitations with Few-Shot Examples
Saving and Loading LLM Prompts
Data Connection
LLM をデータと接続し、その機能を強化する方法について説明します。組織は多くの場合、構造化データ(SQLデータベースなど)と非構造化フォーマット(Google Docsなど)のデータを保有している。情報源は、非構造化データを処理後にベクトル・データベースに格納することを推奨している。ベクトル・データベースは、ベクトルとして表現されたデータを効率的に保存し、類似検索を行うことができる。
LangChainは、データのロード、変更、保存、取得に不可欠なコンポーネントを提供する
Document loaders: ウェブページ、PDF、その他のドキュメントフォーマットなど、さまざまなソースからデータをロードするツール
Document transformers: これらのツールは、文書の分割、Q&Aレイアウトへの変換、余分な文書の削除などを可能にする。
Text embedding models: 構造化されていないテキストを数値表現(埋め込み)に変換し、ベクトルデータベース内の類似性を検索する。
Vector databases (vector stores):これらのデータベースは、埋め込みデータに対する効率的な類似性検索を可能にし、セマンティック検索や検索拡張世代などのタスクで重要な役割を果たす。
Retrievers:ベクトルストアやその他のデータソースからデータを照会・検索するために設計されたツール。
Document Loaders
ドキュメントローダはLangChainに不可欠なコンポーネントで、ウェブページ、PDF、その他のドキュメントフォーマットを含む様々なソースからのデータロードを担当する。異なるソースからのデータにアクセスし、処理するための標準化された方法を提供する。
langchain_communityというモジュールからそれぞれのデータのローダーが提供されている
from langchain_community.document_loaders import Docx2txtLoader
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.document_loaders.csv_loader import CSVLoader
Text Splitters
テキストの分割は、LLMのコンテキスト・ウィンドウに収まるように、大きなテキストを小さなチャンクに分割するために重要だと説明。文、段落、トピック、複雑さ、長さによる分割、トークナイザーの使用など、さまざまなチャンキング戦略について説明している。
Text Splitting by Length and Token Size
LLMが処理するテキストの各チャンクがその制限内に収まるようにします。tiktokenのようなツールを使用することで、チャンクの重複を管理しながら、トークン数に基づいてテキストを分割し、コンテキストを保持することができる
from langchain.text_splitter import TokenTextSplitter
from langchain_community.document_loaders import PyPDFLoader
text_splitter = TokenTextSplitter(chunk_size=500, chunk_overlap=50)
loader = PyPDFLoader("data/principles_of_marketing_book.pdf")
pages = loader.load_and_split(text_splitter=text_splitter)
print(len(pages))
Text Splitting with Recursive Character Splitting
再帰的文字分割は、より文脈を意識したアプローチで、改行や空白などの論理的な区切り位置でテキストを分割し、コンテンツの意味的な整合性を維持することを目的としている。このアプローチは、テキストをより小さな塊に分割しながら、テキストの意味と構造を保持するのに役立つ。
サンプルコードは上の項と一緒
Task Decomposition
タスクの分割は、複雑な問題の解決にLLMを効果的に活用するための重要な戦略である。タスクをより小さく、管理しやすいサブタスクに分解することで、LLMは各コンポーネントをより効果的に処理し、対処することができ、全体としてより良い結果を導くことができる。
Prompt Chaining
単一のプロンプトではタスクを合理的に達成できない場合、プロンプトチェーニングが解決策を提供する。このテクニックでは、複数のLLMプロンプトとその出力をリンクさせて、複雑な目標を達成する。ある映画会社が、映画制作の一部を自動化したいと考えたとする。それは以下のような多面的なタスクです。
- キャラクター作成
- プロット生成
- シーン/世界構築
これらはそれぞれ別のLLMプロンプトにすることができ、一連のシーケンスとして連鎖させることができる。
Sequential Chain
シーケンシャル・チェーンは、その名の通り、タスクを複数のチェーンに分解し、特定の順序で実行する。それぞれの連鎖は、その前の連鎖の出力に依存する。映画制作の例では次のようになる:
- character_generation_chain: 指定されたジャンルに基づいてキャラクターを作成する。
- plot_generation_chain: 生成されたキャラクターとジャンルからプロットを作成する。
- scene_generation_chain: プロットとキャラクターに基づいてシーンを生成する。
この順次的なアプローチにより、より管理しやすく論理的な情報の流れが可能になる。
itemgetter and Dictionary Key Extraction
前のステップで生成した結果を次のチェーンでどのように使うかを紹介した章。
またタスクを分割して生成の精度をあげている例でもある
コード例
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from operator import itemgetter
master_chain = (
{"characters": character_generation_chain, "genre": RunnablePassthrough()}
| RunnableParallel(
characters=itemgetter("characters"),
genre=itemgetter("genre"),
plot=plot_generation_chain,
)
| RunnableParallel(
characters=itemgetter("characters"),
genre=itemgetter("genre"),
plot=itemgetter("plot"),
scenes=scene_generation_plot_chain,
)
)
story_result = master_chain.invoke({"genre": "Fantasy"})
Structuring LCEL Chains
itemgetterとRunnableLambda, RunnablePassthroughの使用例
sample: 上の項のサンプルコードの一番上のセルに掲載
Document Chains
本一冊を要約するような大量のテキストを扱う場合、コンテキストの長さに制限があるため、単一のLLMリクエストでは不十分な場合がある。ドキュメントチェーン(?いきなり出てきたような)は、テキストを管理可能なチャンクに分割し、構造化された方法で処理することで、解決策を提供する。

Chapter 5. Vector Databases with FAISS and Pinecone
Retrieval Augmented Generation (RAG)
検索拡張生成(RAG)は、大規模言語モデル(LLM)をベクトルデータベースのような外部知識ソースに接続して強化する技術だ。RAGは大きなテキストを小さなチャンクに分解し、エンベッディングに変換してベクトルデータベースに格納する。ユーザがLLMに問い合わせると、意味的に類似した文書を特定し、文脈としてプロンプトに挿入する。この方法により、LLMはより正確で関連性の高い応答を生成でき、幻覚のリスクを最小限に抑えることができる。RAGの有効性は、エンベッディングとその生成に使用されるAIモデルの品質に依存する。
Introducing Embeddings
エンベッディングは、事前に訓練されたAIモデルによって生成されたテキストの数値表現であり、意味や文脈情報を扱う場合はベクトル表現と呼ばれることが多い。エンベッディングは、類似性や意味に基づいてクエリを実行するベクトルデータベースにとって非常に重要だ。埋め込みを生成する標準的なモデルは、OpenAIのtext-embedding-ada-002だ。エンベッディングモデルを学習させると、学習データで一緒に現れたテキストは近い値になり、無関係なテキストは離れた値になる。
以下を紹介
OpenAIのモデルを使ったembedding
HuggingFaceのモデルを使ったembedding
word2vecを使った例。特定のドメイン内で用語が固有の意味を持つような特殊な語彙を扱う場合には、カスタム埋め込みを訓練する必要があるかもしれない。そのときにword2vecは使えると紹介している。ただし一般的に膨大で多様なデータセットの時に有用とのこと
TF-IDF(Term Frequency-Inverse Document Frequency)も紹介。こちらはデータセットが小さいときに有用と紹介。
Document Loading
ドキュメント・ローディングとは、テキストを数値表現(エンベッディング)に変換し、データベースに格納することである。チャンキング戦略(テキストをより小さな単位に分解すること)やメタデータ管理など、文書ローディングの方法は、検索精度と効率に大きく影響する。
チャンク例
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
chunk_size=100, # 100 tokens
chunk_overlap=20, # 20 tokens of overlap
)
text = """
...
"""
chunks = text_splitter.split_text(text=text)
chunk_sizeパラメータを100に設定すると、テキストの各チャンクに約100個のトークンが含まれるようになる。chunk_overlapパラメータを20に設定すると、連続するチャンク間に20トークンのオーバーラップが生じる。このオーバーラップにより、チャンク間で文脈が失われることがなくなる。
Memory Retrieval with FAISS
FAISSは、高密度ベクトルの効率的な類似性検索とクラスタリングに使用されるオープンソースライブラリである。ベクトル類似度に基づく文書塊の保存とクエリを可能にし、与えられたクエリに対して最も関連性の高い情報の検索を可能にする。
RAG with LangChain
documents = [
"...",
"...",
...
]
vectorstore = FAISS.from_texts(texts=documents, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever()
template = """Answer the question based only on the following context:
---
Context: {context}
---
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| model
| StrOutputParser()
)
chain.invoke("What is data engineering?")
Hosted Vector Databases with Pinecone
Pineconeは、スケーラブルで効率的なベクトル埋め込みデータの保存とクエリを提供するホスト型ベクトルデータベースサービスだ。FAISSのように、Pineconeはユーザクエリに基づく類似検索を可能にし、LLMプロンプトを補強するために使用できる関連ドキュメントを返す。また、より詳細な検索のためのメタデータフィルタリングもサポートしている。
Self-Querying
"Self-Querying "はユーザーのクエリにメタデータを使用することで、ベクトル・データベースからより洗練された検索を可能にすると説明している。このアプローチでは、ユーザー記述のスキーマを定義することで、システムがユーザーの意図を構造的に理解できるようにする。その後、retrieverは二重の検索プロセスを実行する。まず、ユーザーの入力と保存されているデータの意味的類似性を評価する。同時に、保存されている文書のメタデータに基づいてフィルタを特定・適用し、正確な検索を実現する。この方法は、意味論的フィルタリングとメタデータに基づくフィルタリングの両方を組み合わせることで、検索された文書の関連性を高める。
retriever = SelfQueryRetriever.from_llm(
llm,
vectorstore,
document_content_description,
metadata_field_info,
enable_limit=True,
)
retriever.get_relevant_documents(
query="Return 2 Fantasy books",
)
# query=' ' filter=Comparison(
# comparator=<Comparator.EQ: 'eq'>, attribute='genre',
# value='Fantasy') limit=2
# Documents [] omitted to save space
Alternative Retrieval Mechanisms
このセクションでは、MultiQueryRetriever、Contextual Compression、Ensemble Retriever、Parent Document Retriever、Time-Weighted Vector Store Retrieverなど、その他の検索方法について説明する。
各アプローチには、文書の長さ、関連性の判定、計算要件などの要因に基づく長所と短所がある。適切な検索メカニズムの選択は、特定のユースケースと、精度、スピード、コストのトレードオフに依存する。

Chapter 6. Autonomous Agents with Memory and Tools
arge Language Models(LLM)を問題解決のための一連のステップに導く技術である、chain-of-thought reasoningの重要性を強調する。本章では、入力、目標、行動、そして記憶、計画戦略、検索方法といったLLMに特有の追加コンポーネントを含むエージェントのアーキテクチャを解明する。
Chain-of-Thought
Chain-of-Thought(CoT)は、複雑なタスクをより小さく管理しやすいステップに分解することで、AIの問題解決能力を向上させる。CoTでは、LLMに意思決定プロセスを詳しく説明したり、答えを確定する前に複数のステップを計画したりすることを要求する。
Agents
生成AIにおける重要な概念としてエージェントを記述している。エージェントは特定の目的を達成するために環境内で行動し、行動を起こし、結果を認識し、その結果に基づいて意思決定を行う。エージェントは、周囲から受け取ったデータポイントである入力、行動の方向性を示す目標または報酬関数、実行可能なタスクの範囲を示す利用可能な行動という3つの中核要素に基づいて動作する。
これらの概念をより分かりやすく説明するために、この章は自動運転車を例にしている:
入力:車の速度、カメラからの画像、他の物体との接近など、車はセンサーからデータを受け取る。
目的または報酬機能:クルマの目的は、安全かつ効率的に目的地に到達すること。
利用可能なアクション: 車は加速、ブレーキ、ハンドル操作、車線変更ができる。
これは、LLMが複雑な問題を解決するためにツールと思考ループを利用する高度な手法である。このプロセスには以下が含まれる:
- 環境の観察
- 思考を通して環境を解釈する
- 行動を決める
- 環境に対して行動する
- 解が見つかるか、最大反復回数に達するまでステップ1~4を繰り返す。
この章はReAct(Reason and Act (ReAct))プロンプトの作成方法を説明し、LLMに問題、利用可能なツール、具体的な指示を与えている。また、LangChainエージェントがこのプロセスを簡素化し、ツールの使用、ループ、潜在的なツールの不具合を自動的に処理することも紹介されている。
CoTのプロンプトテンプレートとreActの例は以下の中に記載されている
outputメモ
'1. Observe the original question:
original_question: Is Jason Derulo with a partner?
2. Create an observation:
observation: Jason Derulo is a celebrity singer.
3. Create a thought based on the observation:
thought: It is possible that Jason Derulo could have a partner, as many celebrities have relationships.
4. Use the search_on_google tool to find information about Jason Derulo\'s current relationship status:
action: search_on_google
action_input: "Jason Derulo current relationship status"
I will now search on google for information about Jason Derulo\'s current relationship status.'
using tools
上の例をすでに提供されているコンポーネントで実現する例を紹介?
Using LLMs as an API (OpenAI Functions)
OpenAI Functionsは、従来のReActパターンと比較して、ツール使用のための合理的なアプローチを提供する。LLMが実行時に関数を実行するかどうかを決定する推論エンジンとして機能する。
おすすめツール
Comparing OpenAI Functions and ReAct
OpenAI functionsとReActは、生成AIモデルでタスクを達成するための2つのエージェントフレームワークです。OpenAI FunctionsでのLLMは実行時に関数を実行するかどうかを決定します。このアプローチは、単純な検索やデータ抽出のような単一のツール実行を必要とするタスクに適しています。一方、ReActは、複数のツールの逐次的な使用を伴い、インタビューを保存してメールで送信するなど、複数の意図を持つクエリに適している。
Feature | OpenAI functions | ReAct |
---|---|---|
Runtime decision making | ✓ | ✓ |
Single tool execution | ✓ | ✓ |
Ease of implementation | ✓ | x |
Parallel function calling | ✓ | x |
Iterative thought process | x | ✓ |
Multi-intent handling | ✓ | ✓ |
Sequential tool execution | x | ✓ |
Customizable prompt | ✓ | ✓ |
Agent Toolkits
LangChainのエージェントツールキットは、複数のツールとチェインを含むビルド済みのパッケージで、特定のタスクを素早く自動化することができる。CSVエージェント、Gmailツールキット、Pandas DataFrameエージェントなどが有名だ。例えば、CSV AgentはPandas DataFrame Agentやpython_repl_astなどのツールを利用してCSVデータを分析する。
Customizing Standard Agents
LangChainでは、prefixやsuffixのような主要な関数引数を通してエージェントをカスタマイズできる。さらに、max_iterationsとmax_execution_timeは、APIコールと計算コストを制限し、無限ループを防ぐ。
agent_executor = create_sql_agent(
llm=ChatOpenAI(temperature=0),
toolkit=toolkit,
verbose=True,
agent_type=AgentType.OPENAI_FUNCTIONS,
prefix=SQL_PREFIX,
)
Custom Agents in LCEL
LangChain Expression Language (LCEL) は、カスタムエージェントの作成を容易にする。tool デコレータを使ってカスタムツールを定義し、MessagesPlaceHolder や OpenAIToolsAgentOutputParser のような LCEL コンポーネントを使ってチャットモデルと統合できる。
Understanding and Using Memory
LLM、特に自律型エージェントにおける記憶の重要性が強調されている。記憶によってLLMは過去の相互作用を記憶し、将来のステップにおける意思決定を改善できる。
記憶には主に2つのタイプがある。
長期記憶(LTM):これはテキスト、概念、フレームワークを含む大きな知識ベースのような働きをする。LTMは、LLMの理解と応答の生成を助ける。例えば、テキストを保存するためのベクターデータベース、洞察を記録するためのSelf-reflection、データに優先順位をつけるためのカスタムリトリーバーなどがある。
短期記憶(STM):これは最近のやりとり、タスク、または会話の文脈を保持するための一時的なワークスペースとして機能する。STMは会話の流れを維持するために非常に重要だ。
Memory in LangChain
全てのメモリ・システムは、実行前に読み込み(情報を取得)、完了後に保存(データを保存)することで、チェーンと相互作用する。このソースでは、メモリ・システムのセットアップに関わる2つの重要な決定事項、すなわち、状態の保存方法とメモリ状態のクエリ方法について詳しく説明している。
ConversationBufferMemoryの使用例の紹介
sample:
- https://github.com/BrightPool/prompt-engineering-for-generative-ai-examples/blob/main/content/chapter_6/agent_in_lcel.ipynb
- https://github.com/BrightPool/prompt-engineering-for-generative-ai-examples/blob/main/content/chapter_6/react_agent_with_memory.ipynb
Other Popular Memory Types in LangChain
LangChainはいくつかのメモリタイプを提供し、それぞれに明確な利点がある。
- ConversationBufferMemory:チャットメッセージを無制限に保存できる。このタイプは、チャット履歴のサイズに制限がない場合に便利だ。
- ConversationBufferWindowMemory:コンテキスト依存の会話に対応したメモリタイプで、直近の会話のスライディングウィンドウを保持する。
- ConversationSummaryMemory:長時間の会話に適しており、トークンの消費を最小限に抑えながら、会話を凝縮して要約する。
- ConversationSummaryBufferMemory:このハイブリッドなアプローチは、最近のメッセージのバッファと古い対話の要約をマージする。
- ConversationTokenBufferMemory:トークンの長さを利用して、最近のやりとりのバッファを保持し、いつやりとりをフラッシュするかを決定し、効率的なメモリ管理を保証する。
これらの様々なメモリタイプを理解することで、開発者はLangChainの包括的なメモリツールキットを使って効率的にメモリシステムを構築し、調整できる。
OpenAI Functions Agent with Memory
Advanced Agent Frameworks
Plan-and-Execute Agents
BabyAGI and AutoGPT.
BabyAGIのようなPlan-and-Execute Agentsは、タスクの計画と実行を別々のモジュールに分離し、しばしばChromaのようなベクトルデータベースを利用してコンテキスト認識を強化する。例えば、BabyAGIのアーキテクチャは、タスクの作成、実行、優先順位付けのために個別のエージェントを採用しており、与えられた目的を達成するために連携して動作する。
Tree of Thoughts
callbacks

Chapter 7. Introduction to Diffusion Models for Image Generation
OpenAI DALL-E
2021年にリリースされたDALL-Eは、AI画像生成のブレークスルーを示しました。2022年にリリースされた後継機「DALL-E 2」は、インペインティングやアウトペインティングなどの機能により、品質が大幅に飛躍した。しかし、当初は倫理的な懸念からアクセスが制限され、リアルな人間の姿を生成するには限界があった。ChatGPTと統合されたDALL-E 3では、合成機能が向上している。
Midjourney
Midjourney(ミッドジャーニー)は、2022年7月のローンチ後、急速に人気を集め、ゲームやデジタルアートのコミュニティのユーザーを魅了した。ファンタジーに特化したその美学は当初魅力的だったが、同時に限界ももたらした。Midjourneyの唯一のインターフェイスとしてDiscordに依存していることが、メインストリームユーザーへの普及を妨げている。さらに、ネガティブプロンプトや重み付けされた用語といったユーザーフレンドリーな機能にもかかわらず、Midjourneyには専用のAPIがないため、Stable DiffusionやDALL-Eのような競合と比べると、開発者にとってアクセスしにくいものとなっている。Midjourneyの革新的な機能は、ネガティブプロンプト、重み付けされた用語、「説明」機能など、非常に小規模なチームによって開発され、効率的でインパクトのある開発戦略を際立たせている。このプラットフォームのオープンチャンネルによる画像共有は、ダイナミックな学習環境を育み、ユーザーからのフィードバックによる迅速な導入と反復的なモデル改善に貢献している。

Chapter 8. Standard Practices for Image Generation with Midjourney
Format Modifiers
フォーマット修飾子:画像フォーマットを指定することは、画像生成の基本的な側面であると情報源は説明している。AI画像モデルは、ストックフォト、油絵、エジプトの象形文字など、さまざまな形式の画像を生成できる。選択されたフォーマットは、物体や人物の外観を含む画像全体のスタイルに影響を与える。重要なのは、生成されるスタイルとコンテンツは、学習データ内のそのフォーマットに関連する要素を反映することが多いということだ。例えば、油絵の場合、コンピュータは伝統的な油絵では描かれないため、コンピュータをうまく描けないかもしれない。
input
an oil painting of a business meeting, textured oil-on-canvas
using thick impasto and swirling dynamic brushstrokes
Art Style Modifiers
AIイメージモデルは、確立されたアートスタイルやアーティストを再現することに優れている。ゴッホやシュルレアリスムのような有名な芸術家や芸術運動をプロンプトに組み込むことで、モデルを特定の美的感覚に導くことができる。しかし、現存するアーティストのスタイルを模倣することは、特に著作権法に関する法的・倫理的な懸念を引き起こす。
input
illustration of a dragon, in the style of Alice's Adventures in Wonderland
by Lewis Carroll
Reverse Engineering Prompts
プロンプトのリバースエンジニアリング Midjourneyの「Describe」機能は、AIが生成した画像や通常の画像を含む画像からプロンプトを解読するのに役立つ。この機能は複数のプロンプトオプションを提供し、それぞれが画像に存在するアーティスト、スタイル、修飾、要素を示唆する。オプションを選択すると、そのプロンプトを使用して、オリジナルのスタイルを模倣した新しい画像が生成される。
Quality Boosters
プロンプトに高品質に関連する用語を含めることで、生成された画像のスタイルを大きく変えることなく、美的魅力を向上させることができる。例えば、「4K」、「とても美しい」、「artstationでトレンド」などがある。これらの用語はクオリティ・ブースターと呼ばれ、学習データ、特にArtStationのようなデザイン・ポートフォリオ・サイトの高品質な画像にリンクされているため、機能する。
Negative Prompts
これらのプロンプトは、生成される画像から特定の要素を除外するようモデルに指示する。Midjourneyでは、ネガティブプロンプトは「--no」の後に省略する要素をカンマ区切りで列挙することで実装される。例えば、油絵からフレームを取り除くには、「--no frame, wall」というネガティブプロンプトを使う。ネガティブプロンプトは便利であるが、必ずしも意図した結果が得られるとは限らない。
input
oil painting in the style of Rembrandt --no frame, wall
Homer Simpson --no cartoon
Weighted Terms
ネガティブプロンプトが要素を完全に除外するのに対し、ウェイト付き用語は特定の概念の強調を調整することで、より細かいコントロールを可能にする。Midjourneyでは、ダブルコロン(::)の後に数値を続けて重みを設定する。ウェイト1がデフォルトで、数値が大きいほど強調され、小さいほど強調されなくなる。負のウェイトを使用することで、特定のアスペクトの強調度をさらに下げることもできる。
input
painting of the Golden Gate Bridge::1 in the style of Van
Gogh::0.8, in the style of Dali::0.2
Prompting with an Image
AI画像生成ツールでは、プロンプトの一部としてユーザーが画像を提供できることがよくあり、Stable Diffusionコミュニティでは「Img2Img」として知られている。Midjourneyでは、プロンプトに画像リンクを含めることでこれを実現している。ベースとなる画像を提供することで、特定のスタイル、構図、雰囲気を維持することができる。ただし、画像をアップロードする際には、著作権や公正使用の規制に留意することが重要である。
Inpainting
この技法は、画像の特定の部分を再生し、残りの部分を保存することに重点を置いている。ユーザーは、必要な領域を消去し、その領域を埋めるようにモデルを誘導するプロンプトを提供することができる。一般的なアドバイスとしては、画像全体に対してプロンプトを出すことだが、消去した部分に焦点を当てることで、より優れた結果が得られることもある。
Outpainting
逆に、アウトペインティングは画像を元の境界を越えて拡大する。Midjourneyには様々なズームオプションがあり、カスタムアスペクト比も可能だ。ユーザーはプロンプトを繰り返し試しながら、元の領域と拡大された領域との一貫性を確保することができる。
Consistent Characters
インペインティングとアウトペインティングの貴重な応用により、複数世代にわたるキャラクターの見た目の一貫性が保証される。これは、2つの画像を並べて生成し、一方をアップスケールし、その半分をマスクして、異なる角度やポーズを指示するインペインティングを使用する。この手法では、既存の半分の画像を活用してキャラクターの特徴を維持する。
Prompt Rewriting
このテクニックは、AIを利用してユーザーが投稿したプロンプトを強化し、専門家ではないユーザーからもより良い結果を得られるようにする。これは、最初のプロンプトをChatGPTのような言語モデルに入力し、アーティストの好みの媒体などの関連情報を抽出し、プロンプトをより明確で効果的なものに書き換えるというものだ。
{medium} of a {subject} in the style of {artist}.
ex,
street art of a dachshund dog in the style of Banksy
Meme Unbundling
このテクニックは、AIを利用してユーザーが投稿したプロンプトを強化し、専門家ではないユーザーからもより良い結果を得られるようにする。これは、最初のプロンプトをChatGPTのような言語モデルに入力し、アーティストの好みの媒体などの関連情報を抽出し、プロンプトをより明確で効果的なものに書き換えるというものだ。
例えば
Briefly describe the characteristics and artistic style of
"The Persistence of Memory" by Salvador Dali, without
mentioning the artwork or the artist:
サルバドール・ダリの"The Persistence of Memory"をアーティストのアートワークなしに解説して、というプロンプトを投げる。そして回答をもらう。その回答をコンテキストとして、次の質問を投げる
Convert this description into a shortened prompt for an AI
image generation model such as DALL-E:
さきの説明からプロンプトを生成して、とうい内容。その回答を使って、画像を生成するプロンプトに組み込む。
Painting of Times Square, {ここからもらったプロンプトを記載}
Meme Mapping
このテクニックは、他のAIアーティストが使って成功したプロンプトからインスピレーションを得る。MidjourneyのDiscordサーバーやLexica.artのようなウェブサイトは、豊富な例やプロンプトを提供している。これらのプロンプトを分析することで、特定の画像タイプやスタイルに関連する繰り返しパターン、つまり「ミーム」が明らかになり、効果的なプロンプトを作成するための貴重な洞察が得られる。
Prompt Analysis
プロンプトがより精巧になるにつれ、その有効性を分析し、余分な要素を特定することが重要になる。Midjourneyの「/shorten」コマンドは、必要なトークンを残しながら不要な単語を削除することで、プロンプトを効率化するのに役立つ。このツールはまた、トークンレベルの重み付けを強調した視覚的なチャートを提供し、プロンプトに対するモデルの解釈に関する洞察を提供する。

Chapter 9. Advanced Techniques for Image Generation with Stable Diffusion
Running Stable Diffusion
オープンソースのStable Diffusionは、NVIDIA、AMD、またはApple Silicon GPUを搭載したコンピュータ上でローカルに動作します。初期バージョンは、GPUに無料でアクセスできるGoogle Colabノートブック上で動作することが多かったが、Hugging Face diffusersライブラリを使用することで、ローカルインストールが可能になる。
Stability AIによるホスト型ウェブインターフェイスであるDream Studioは、ローカルセットアップに代わるユーザーフレンドリーな選択肢を提供し、クレジットベースのシステムで動作し、インペインティングのような高度な機能を提供する。Dream Studioはまた、効率的な画像生成やアプリケーションとの統合のためのAPIアクセスも提供している。しかし、広範なカスタマイズやコミュニティ主導の機能性といったオープンソースの利点は、ホスト型ソリューションでは制限される。
AUTOMATIC1111 Web User Interface
AUTOMATIC1111は、Stable Diffusion用に広く推奨されているウェブUIで、その豊富な機能とコミュニティによって開発された拡張機能で人気がある。このインターフェースは、画像間の生成、アップスケーリング、インペインティング、カスタムモデルのトレーニング、一般に共有されている膨大なモデルのライブラリなど、さまざまな機能へのアクセスを提供する。
ローカルインストールには技術的なセットアップが必要で、AUTOMATIC1111 Wikiの最新ガイドを参照するのが最適だ。必要なファイルをローカルコンピュータにダウンロードする。ユーザーは、ローカルでアプリケーションを起動するスクリプトを実行することで、インターフェースにアクセスできる。インターフェースには、ネガティブ・プロンプト、シード値、サンプリング・ステップ、バッチ設定など、カスタマイズ用のさまざまなパラメーターが用意されている。プロンプトの重み付けと編集により、画像生成をきめ細かく制御できる。
重み付け
(pirate:1.5) パイレーツの重み成分を1.5倍
Marilyn Monroe as a (pirate:1.5) on a desert island, detailed clothing,
by Stanley Artgerm Lau and Alphonse Mucha
[Emma Watson: Amber Heard: 0.5] エマ・ワトソンの画像を生成し始め、途中で切り替わって最後のフレームの上にアンバー・ハードの画像を生成し、2人の女優の混合で終わる。
vogue fashion shoot of [Emma Watson: Amber Heard: 0.5],
highly realistic, high resolution, highly detailed,
dramatic, 8k
Img2Img
AUTOMATIC1111のウェブUIは、Midjourneyのベース画像入力と機能的に類似した機能であるImg2Imgを可能にし、出力のスタイルとコンポジションをコントロールできる。Img2Imgを効果的に使用するには、Eulerサンプリング、高いサンプリングステップ、20から30のCFGスケールを使用する。ユーザーは、ノイズ除去の強さ、CFGスケール、シード値などのパラメータを試して、望ましい結果を得ることができる。AUTOMATIC1111では、画像グリッドを生成することにより、複数のパラメータ値をテストすることができる。
Upscaling Images
Interrogate CLIP
AUTOMATIC1111は、画像からプロンプトのリバースエンジニアリングを可能にする「CLIPを質問する」ボタンを備えている。この機能はCLIPの埋め込みモデルを活用し、画像の内容を解析してプロンプトを生成する。これはMidjourneyの「Describe」機能に似ている。
SD Inpainting and Outpainting
ControlNet
ControlNetは、事前に学習されたモデルを活用して構図とスタイルをガイドすることで、画像生成の高度なコントロールを提供する。この方法では、画像をアップロードし、ControlNetモデルを選択して処理することで、オリジナルの構図を保持したまま、スタイルが異なる出力が得られる。AUTOMATIC1111インターフェースは、拡張機能によってControlNetを統合し、処理を微調整するためのさまざまなモデルとパラメータへのアクセスを提供する。適切なControlNetモデルを選択し、コントロールウェイト、コントロールステップの開始/終了、プリプロセッサの分解能などのパラメータを調整することは、最適な結果を得るために不可欠だ。
Segment Anything Model (SAM)
SAM(Segment Anything Model)は、Meta社によるオープンソースのモデルで、ユーザー入力または自動検出に基づいて、画像を異なるマスクに自動的にセグメンテーションする。このプロセスでは、画像内の必要なオブジェクトや領域を特定し、SAM がそれを個別のマスクに分離します。AUTOMATIC1111インターフェースは、sd-webui-segment-anything拡張機能によりSAMを組み込んでおり、ユーザーはインターフェース内のポイント選択に基づいてマスクを生成することができる。
DreamBooth Fine-Tuning
Stable Diffusion XL Refiner

Chapter 10. Building AI-Powered Applications
大規模言語モデル(LLM)を使ったアプリケーション開発のためのフレームワークであるLangChainを使って、ユーザーのユニークな経験を反映するAIを搭載したブログ作成サービスを構築することに焦点を当てている。インタビューの書き起こし、トピック調査、ブログのアウトライン生成、テキスト生成などのモジュールを含む、多数のLLMチェーン・コンポーネントの構築を通して今まで学んだ内容の集大成的章。
このアプローチではLangChainの複数のLLMチェーン・コンポーネントを利用し、それぞれが特定の目的を果たす。
まず、「InterviewChain」コンポーネントがユーザーと仮想インタビューを行う。このコンポーネントは、Google検索結果の要約を事前に作成し、ロールプロンプトのようなテクニックを使って、洞察力のある質問を生成するように設計されている。次に、「InterviewChain」は、ユーザーの主要なアイデアや意見を抽出し、整理するために出力構文解析を使用して、インタビューのトランスクリプトを処理する。
次に、「BlogOutlineGenerator」コンポーネントが構造化されたブログ記事のアウトラインを作成する。このコンポーネントは、インタビュー内容とGoogleの要約を使用し、最終的なコンテンツがよく整理され、ユーザー独自の視点が組み込まれていることを確認する。
最後に、「ContentGenerator」コンポーネントが、アウトライン、ユーザーのインタビュー回答、処理され埋め込まれたウェブページを含むベクターデータベースから取得された関連情報によって導かれ、ブログ記事の実際のテキストを作成する。このコンポーネントは、文章に一貫性を持たせ、繰り返しを避け、埋め込みや検索、カスタムメモリ管理などの技術によって、盗用することなく外部情報を取り込む。
文中に紹介されていた外部リンク
- https://github.com/Shingo-Kamata/japanese_qa_demo_with_haystack_and_es
- https://qiita.com/ippeiSuzuki2024/items/3103d8a3d25888ea7af3
- https://workwonders.jp/media/archives/6313/
- https://zenn.dev/kun432/scraps/52700695e1eb58