Dreambooth 作為 Stable Diffusion 的微調模型,能以少量影像生成特定主體影像。訓練 Dreambooth 模型需準備多樣化影像資料集,並透過轉換指令碼將模型轉換為 ckpt 格式,再使用 AUTOMATIC1111 進行訓練。訓練完成後,即可使用該模型生成特定主體的影像,並透過調整引數控制生成結果。進一步的應用包含使用 SDXL Refiner 模型,藉由基礎模型和細化模型的協作,生成更精細的影像。此外,結合 OpenClip 和 OpenAI 的 CLIP ViT-L 語言模型,SDXL 能更好地理解使用者提示,並解決提示轉移性的問題,同時支援更多樣化的影像尺寸。更進階的應用則包含使用 Langchain 進行主題研究、網頁內容收集和文字摘要,並透過自訂 Loader 和 Chain 來最佳化流程,最終建立 AI 驅動的應用程式。

Dreambooth模型簡介

Dreambooth是一種根據Stable Diffusion的模型,允許您使用少量的影像來微調模型,以生成特定主體的影像。這個過程涉及到將您的影像資料集輸入到模型中,然後模型會學習如何生成與您的資料集相似的影像。

訓練Dreambooth模型

要訓練一個Dreambooth模型,您需要準備一組影像資料集,這些影像應該是您想要生成的主體的不同視角和表情。接下來,您需要使用轉換指令碼將您的模型轉換為.ckpt格式,這是AUTOMATIC1111可以使用的格式。

以下是訓練Dreambooth模型的步驟:

  1. 準備影像資料集:收集您想要生成的主體的影像,並確保影像品質良好且多樣化。
  2. 安裝必要的函式庫和工具:您需要安裝diffuserstransformers函式庫,以及AUTOMATIC1111工具。
  3. 轉換模型:使用轉換指令碼將您的模型轉換為.ckpt格式。
  4. 訓練模型:使用AUTOMATIC1111工具來訓練您的Dreambooth模型。

使用Dreambooth模型

一旦您訓練好了Dreambooth模型,您就可以使用它來生成特定主體的影像。您可以使用AUTOMATIC1111工具來載入您的模型,並生成影像。

示例

假設您想要生成一位名叫Adam Bruce Thomson的人的專業頭像。您可以準備一組Adam的影像,並使用Dreambooth模型來生成新的影像。

# 載入必要的函式庫和工具
import os
import torch
from diffusers import StableDiffusionPipeline

# 定義模型路徑和影像路徑
model_path = "path/to/model.ckpt"
image_path = "path/to/image.jpg"

# 載入模型和影像
model = StableDiffusionPipeline.from_pretrained(model_path)
image = torch.load(image_path)

# 生成影像
generated_image = model(image)

# 儲存生成的影像
generated_image.save("generated_image.jpg")
圖表翻譯:
  graph LR
    A[準備影像資料集] --> B[安裝必要的函式庫和工具]
    B --> C[轉換模型]
    C --> D[訓練模型]
    D --> E[使用Dreambooth模型]
    E --> F[生成影像]

此圖表展示了訓練和使用Dreambooth模型的流程。從準備影像資料集開始,然後安裝必要的函式庫和工具,接下來轉換模型,然後訓練模型,最後使用Dreambooth模型來生成影像。

個人化生成式AI體驗:Dreambooth技術

Dreambooth是一種能夠讓使用者個人化其生成式AI體驗的技術。使用者只需提供5到30張圖片作為概念的例子,然後在短短一小時的訓練時間內,就可以擁有一個完全個人化的自定義模型。

Dreambooth與其他訓練方法

除了Dreambooth之外,還有其他的訓練和微調方法可供選擇。然而,Dreambooth目前是最常用的技術之一。較早的技術,如Textual Inversion,雖然可以近似地代表使用者的概念,但其效能遠不及Dreambooth。另一種新興的技術是LoRA(低秩適應大語言模型),它透過新增新層並訓練這些新層來構建自定義模型,而不需要耗費過多資源。此外,還有Hypernetworks,它們可以訓練引數以生成新的層。

Stable Diffusion XL Refiner

Stable Diffusion XL(SDXL)是一種具有6.6億引數的模型,相比之下,v1.5模型只有0.98億引數。SDXL的強大火力帶來了令人印象深刻的結果,因此越來越多的使用者開始偏愛它。SDXL的力量來自於基礎模型和細化模型之間的分工合作,基礎模型設定全域性組成,而細化模型新增更細緻的細節。

SDXL的優勢

SDXL使用了一種結合OpenClip(ViT-G/14)和OpenAI的CLIP ViT-L的語言模型,從而能夠更好地理解使用者的提示。與Stable Diffusion v2相比,SDXL解決了提示轉移性的問題,使得v1.5上有效的提示也能在SDXL上得到更好的結果。此外,SDXL還被訓練以支援更多樣化的影像尺寸,從而能夠生成非標準方形比例的影像。

使用Refiner模型

要使用Refiner模型,需要在AUTOMATIC1111介面中啟用“Switch at”功能,這個值控制著管道在哪個步驟切換到Refiner模型。一般建議在0.4到1.0之間切換,使用20到50個取樣步驟以獲得最佳結果。

影像生成例項

透過輸入特定的提示,例如“動漫風格的貓女孩,粉紅色頭髮,戴著貓耳裝,站在花架前,寫實風格”,可以生成高品質的影像。調整Refiner模型的切換引數,可以觀察到不同設定下的影像生成結果。

功能改進

為了提高使用者經驗,可以安裝長寬比選擇器擴充套件,這允許使用者輕鬆設定常用的影像尺寸或長寬比。這可以簡化生成特定比例影像的過程。

建立AI驅動的應用程式

在這個章節中,您將學習如何將五個提示原則應用於內容寫作的AI工作流程。這個服務將根據使用者對訪談問題的回答,生成部落格文章,並以使用者的寫作風格呈現。這個系統最初是在Saxifrage部落格上記錄的。

AI部落格寫作

建立一個使用AI的部落格寫作服務的天真方法是直接提示ChatGPT:「寫一篇關於{blogPostTopic}的部落格文章」。結果內容可能是合理品質的,但不太可能包含有價值的意見或獨特的經驗。內容也可能很短且通用,因此不太可能在Google上排名。

一個更成熟的方法可能是構建一個更長的提示,包含更多指令。例如,可以新增關於寫作風格、部落格文章架構和要包含的關鍵字的細節。以下是一個常見的部落格文章寫作提示範例:

輸入: 建立一篇關於「{blogPostTopic}」的部落格文章。以「{tone}」風格撰寫。 使用過渡詞彙。 使用主動語態。 撰寫超過1000字。 為部落格文章建立非常創意的標題。 為每個部分新增標題。確保至少有9個部分。 每個部分應至少有兩段。 包含以下關鍵字:「{keywords}」。 為這篇文章建立一個好的slug和一個元描述,最大100個字,並將其新增到部落格文章末尾。

這個更長、更成熟的提示可能會導致更好的品質內容。但是,讓我們運用五個提示原則作為檢查清單:

  1. 方向:有一些指令,例如風格、使用過渡詞彙和主動語態。但是,內容仍然可能聽起來像AI,而不是使用者。
  2. 格式:雖然有一些結構提及,包括九個部分,每個部分有兩段,但ChatGPT可能無法遵循這些指令。
  3. 範例:沒有提供如何完成任務的範例,這可能會損害可靠性。
  4. 評估:這是一個盲命令(在未經測試的情況下新增指令到提示中)的例子。一些指令可能對品質沒有影響,或者甚至可能降低品質。
  5. 分割:整個任務嘗試使用單個提示完成,這可能會損害效能。沒有將任務分解為子任務,很難瞭解哪部分過程成功或失敗。

透過這個章節,您將建立多個LLM鏈元件。每個鏈將在LangChain中實作,以使其更易於維護並提供易於監控和最佳化的日誌記錄。結果系統將幫助您根據使用者的獨特意見和經驗生成人類化內容。為了做到這一點,您需要先準備好您的工作空間,具備必要的工具。因此,讓我們將焦點轉移到主題研究,並開始設定您的程式設計環境。

主題研究:有效利用LangChain的檔案載入器

要有效地使用LangChain的檔案載入器,需要安裝幾個Python套件,包括:

  • google-searchresults:一個用於抓取和處理Google搜尋結果的Python函式庫。
  • pandas:提供資料結構和操作,用於操縱數字表和時間序列資料。
  • html2text:一個工具,將HTML從檔案或網頁轉換為Markdown(.md)檔案或文字。
  • pytest-playwright:一個套件,啟用了Playwright的端對端測試。
  • chromadb:一個開源向量資料函式庫。
  • nest_asyncio:一個擴充套件Python標準asyncio的套件,用於修補和渲染它與Jupyter Notebook相容。

可以使用以下命令輕鬆安裝這些套件:

pip install google-searchresults pandas html2text pytest-playwright chromadb nest_asyncio --quiet

另外,您還需要使用LangChain的檔案載入器,它需要Playwright。請在您的終端中輸入以下命令:

playwright install

此外,您需要選擇一個主題並設定環境變數SERPAPI_API_KEYSTABILITY_API_KEY。如果您不使用Jupyter Notebook執行指令碼,那麼您不需要使用任何nest_asyncio程式碼。

以下是示例程式碼:

from langchain_openai.chat_models import ChatOpenAI
from langchain.output_parsers import PydanticOutputParser
from langchain_text_splitters import RecursiveCharacterTextSplitter
import os

# 自定義匯入:
from content_collection import collect_serp_data_and_extract_text_from_webpages
from custom_summarize_chain import create_all_summaries, DocumentSummary

import nest_asyncio
nest_asyncio.apply()

# 常數變數:
TOPIC = "神經網路"

os.environ["SERPAPI_API_KEY"] = ""
os.environ["STABILITY_API_KEY"] = ""

接下來,您將著重於高效地總結網頁內容:

# 從網頁中提取內容到LangChain檔案:

文字摘要與網頁內容收集

要建立一個AI驅動的應用程式,首先需要收集和處理相關的網頁內容。這個過程涉及到使用特定的工具和技術來抓取網頁資料、提取有用的文字資訊,並將其轉化為結構化的摘要。

收集網頁內容

首先,需要使用合適的工具來收集網頁內容。這可以透過以下步驟實作:

text_documents = await collect_serp_data_and_extract_text_from_webpages(TOPIC)

這行程式碼使用 collect_serp_data_and_extract_text_from_webpages 函式來收集與指定主題(TOPIC)相關的網頁內容,並提取出有用的文字資訊。

文字分割和解析

接下來,需要將收集到的文字內容進行分割和解析,以便於後續的處理。這可以透過以下步驟實作:

llm = ChatOpenAI(temperature=0)
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
    chunk_size=1500, chunk_overlap=400
)
parser = PydanticOutputParser(pydantic_object=DocumentSummary)

這段程式碼建立了一個 ChatOpenAI 物件,用於生成文字摘要。同時,定義了一個 RecursiveCharacterTextSplitter 物件,用於將長文字分割成較小的塊,以便於處理。另外,建立了一個 PydanticOutputParser 物件,用於解析和結構化生成的摘要。

生成摘要

最後,需要使用上述工具和技術來生成文字摘要。這可以透過以下步驟實作:

summaries = await create_all_summaries(text_documents, parser, llm, text_splitter)

這行程式碼使用 create_all_summaries 函式來生成與收集到的文字內容相關的摘要。這個過程涉及到使用 ChatOpenAI 物件生成文字摘要,然後使用 PydanticOutputParser 物件解析和結構化生成的摘要。

自訂化和擴充套件

LangChain 提供了豐富的自訂化和擴充套件機制,允許開發者根據自己的需求定製化工具和技術。例如,可以透過繼承 AsyncChromiumLoader 類別來建立一個自訂的非同步載入器:

class ChromiumLoader(AsyncChromiumLoader):
    async def load(self):
        raw_text = [await self.ascrape_playwright(url) for url in self.urls]
        return [Document(page_content=text) for text in raw_text]

這段程式碼定義了一個自訂的 ChromiumLoader 類別,用於非同步載入網頁內容。

取得HTML內容

另外,可以使用以下函式來取得指定URL的HTML內容:

async def get_html_content_from_urls(
    df: pd.DataFrame, number_of_urls: int = 3, url_column: str = "link"
) -> List[Document]:
    urls = df[url_column].values[:number_of_urls].tolist()
    if isinstance(urls, str):
        urls = [urls]
    urls = [url for url in urls if url!= ""]
    #...

這個函式可以用於取得指定數量的URL的HTML內容,並傳回一個包含 Document 物件的列表。

自訂實作:使用Chrome瀏覽器從多個URL非同步抓取內容

玄貓將引導您完成一個自訂實作,使用Chrome瀏覽器從多個URL非同步抓取內容。這個過程涉及到建立一個自訂的_loader_,它可以處理多個URL,並確保抓取的內容是最新且完整的。

步驟1:移除重複的URL

首先,您需要確保要抓取的URL列表中沒有重複的專案。這可以透過將URL列表轉換為一個集合(set)來實作,因為集合中不允許有重複的元素。

urls = list(set(urls))

步驟2:檢查URL列表是否為空

如果URL列表為空,則需要丟擲一個錯誤,以便及時發現和處理這個問題。

if len(urls) == 0:
    raise ValueError("No URLs found!")

步驟3:建立一個ChromiumLoader例項

接下來,您需要建立一個_ChromiumLoader_例項,它將負責抓取URL列表中的內容。

loader = ChromiumLoader(urls)

步驟4:抓取內容

使用_ChromiumLoader_例項,您可以抓取URL列表中的內容,並將其儲存在_docs_變數中。

docs = await loader.load()

步驟5:傳回抓取的內容

最後,您需要傳回抓取的內容,以便進行後續的處理。

return docs

Expert Interview:與LLM進行訪談

現在,您已經成功地從Google中提取了前三個搜尋結果的摘要。接下來,您將與一個LLM(Large Language Model)進行訪談,生成相關的問題,以確保您的文章具有獨特的視角。這個過程涉及到建立一個_InterviewChain_例項,並使用它來生成問題。

from expert_interview_chain import InterviewChain
interview_chain = InterviewChain(topic=TOPIC, document_summaries=summaries)

步驟6:生成問題

使用_InterviewChain_例項,您可以生成相關的問題,以便進行訪談。

interview_questions = interview_chain()

步驟7:回答問題

接下來,您需要回答生成的問題,以便完成訪談。

for question in interview_questions.questions:
    print(f"Answer the following question: {question.question}\n", flush=True)
    answer = input(f"Answer the following question: {question.question}\n")
    print('------------------------------------------')
    question.answer = answer

InterviewChain例項化

最後,您需要建立一個_InterviewChain_例項,並將其設定為您的主題和摘要,以便進行訪談。

interview_chain = InterviewChain(topic=TOPIC, document_summaries=summaries)

透過這些步驟,您可以完成一個自訂的實作,使用Chrome瀏覽器從多個URL非同步抓取內容,並與LLM進行訪談,以確保您的文章具有獨特的視角。

生成問題和大綱的過程

在開始生成問題和大綱的過程中,玄貓首先需要了解如何利用 Langchain 這個函式庫來建立一個能夠與使用者進行互動的對話系統。這個系統可以用來生成一系列的問題,然後根據使用者的回答來生成一個大綱。

從技術架構視角來看,Dreambooth 作為一個根據 Stable Diffusion 的微調模型,其核心價值在於個人化影像生成能力。透過少量影像訓練即可生成特定主體的圖片,相較於 Textual Inversion 等早期技術,Dreambooth 在生成品質和控制性方面有顯著提升。然而,Dreambooth 的訓練過程仍需一定的技術門檻,包括資料集準備、模型轉換、引數調整等。對於普通使用者而言,簡化訓練流程和降低使用門檻是未來發展的關鍵。同時,模型大小和計算資源消耗也是限制其廣泛應用的因素。展望未來,隨著硬體效能提升和演算法最佳化,根據雲端的 Dreambooth 服務或更輕量化的模型將成為趨勢,讓更多使用者能輕鬆體驗 AI 影像生成的魅力。玄貓認為,Dreambooth 代表了 AI 影像生成技術的重要發展方向,其易用性和個人化能力將推動其在更多領域的應用。