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模型的步驟:
- 準備影像資料集:收集您想要生成的主體的影像,並確保影像品質良好且多樣化。
- 安裝必要的函式庫和工具:您需要安裝
diffusers和transformers函式庫,以及AUTOMATIC1111工具。 - 轉換模型:使用轉換指令碼將您的模型轉換為
.ckpt格式。 - 訓練模型:使用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個字,並將其新增到部落格文章末尾。
這個更長、更成熟的提示可能會導致更好的品質內容。但是,讓我們運用五個提示原則作為檢查清單:
- 方向:有一些指令,例如風格、使用過渡詞彙和主動語態。但是,內容仍然可能聽起來像AI,而不是使用者。
- 格式:雖然有一些結構提及,包括九個部分,每個部分有兩段,但ChatGPT可能無法遵循這些指令。
- 範例:沒有提供如何完成任務的範例,這可能會損害可靠性。
- 評估:這是一個盲命令(在未經測試的情況下新增指令到提示中)的例子。一些指令可能對品質沒有影響,或者甚至可能降低品質。
- 分割:整個任務嘗試使用單個提示完成,這可能會損害效能。沒有將任務分解為子任務,很難瞭解哪部分過程成功或失敗。
透過這個章節,您將建立多個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_KEY和STABILITY_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 影像生成技術的重要發展方向,其易用性和個人化能力將推動其在更多領域的應用。