本堂課之程式展示了如何利用 LangChain 與 OpenAI 的 API 來進行自然語言處理和文本摘要。以下是對代碼的詳細解釋和分析,以及學習要點: code解釋與分析 1. 導入模塊和設置 API 金鑰 import os open_api_key = "您的API金鑰" os.environ["OPENAI_API_KEY"] = open_api_key 解釋: 設置 OpenAI API 金鑰,以便於後續使用 OpenAI 模型進行操作。 2. 基本提示摘要 from langchain.chat_models import ChatOpenAI from langchain.schema import (AIMessage, HumanMessage, SystemMessage) speech = "【一長段演講文本】" chat_messages = [ SystemMessage(content='You are an expert assistant with expertise in summarizing speeches'), HumanMessage(content=f'Please provide a short and concise summary of the following speech:\\\\n TEXT: {speech}') ] llm = ChatOpenAI(model_name='gpt-3.5-turbo') 解釋: 使用 LangChain 中的 ChatOpenAI 模型,對一段演講進行摘要。這段代碼定義了演講的文本和一組用於摘要的交談式消息。 3. 提取摘要 llm(chat_messages).content print(llm(chat_messages).content) 解釋: 調用 LangChain 的聊天模型來處理聊天消息,並輸出演講的摘要。 4. 使用提示模板進行文本摘要 from langchain.chains import LLMChain from langchain import PromptTemplate generic_template = '''...''' prompt = PromptTemplate(input_variables=['speech','language'], template=generic_template) llm_chain = LLMChain(llm=llm, prompt=prompt) summary = llm_chain.run({'speech':speech,'language':'hindi'}) PromptTemplate 函數中的 input_variables 參數用於指定將在模板內部使用的變數。這些變數是佔位符,將在生成提示時替換為實際值。 在這個特定的案例中,input_variables=['speech','language'] 表示模板字符串包含 'speech' 和 'language' 的佔位符。當使用這些變數的實際值調用 PromptTemplate.format() 方法時,這些值將替換模板中的佔位符。例如,'speech' 可能是需要總結的文件的文本,'language' 可能指定應以何種語言撰寫總結。 input_variables 參數是一個列表,它包含模板字符串中的佔位符。這些佔位符在運行時會被相應的實際值替換。因此,您可以根據需要改變 input_variables。例如: 如果您的模板字符串中需要包含一個日期,您可以添加一個 "date" 的佔位符到 input_variables 列表中,如:input_variables=['speech', 'language', 'date']。 如果您需要在模板字符串中包含一些特定的關鍵詞,您可以將這些關鍵詞添加到 input_variables 列表中,如:input_variables=['speech', 'language', 'keyword1', 'keyword2']。 如果您的模板需要包含使用者的名字,您可以添加一個 "username" 的佔位符,如:input_variables=['speech', 'language', 'username']。 請注意,模板字符串中的每個佔位符都必須在 input_variables 列表中有對應的項,並且在運行鏈時,需要為每個佔位符提供相應的值。 解釋: 這部分代碼使用 LangChain 提供的提示模板和 LLMChain 來進行文本摘要和翻譯。 5. 使用 Map Reduce 進行大型文檔摘要 from langchain.text_splitter import RecursiveCharacterTextSplitter from PyPDF2 import PdfReader # PDF 文本處理 pdfreader = PdfReader('apjspeech.pdf') # ...(省略文本處理代碼) llm = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo') text_splitter = RecursiveCharacterTextSplitter(chunk_size=10000, chunk_overlap=20) chunks = text_splitter.create_documents([text]) # 創建並運行摘要鏈 chain = load_summarize_chain(llm, chain_type='map_reduce', verbose=False) summary = chain.run(chunks) 解釋: 讀取 PDF 文件的文本,將其分割為較小的塊,然後利用 LangChain 提供的 Map Reduce 摘要鏈進行文本摘要。 RecursiveCharacterTextSplitter 是用於將長文本切分成較小塊的工具。它的工作原理是使用遞歸方法來將超過特定大小的文本切分成較小的塊。 以下是如何使用 RecursiveCharacterTextSplitter 的範例: from langchain.text_splitter import RecursiveCharacterTextSplitter # 創建一個 RecursiveCharacterTextSplitter 實例 text_splitter = RecursiveCharacterTextSplitter(chunk_size=10000, chunk_overlap=20) # 使用 create_documents 方法來切分文本 chunks = text_splitter.create_documents([text]) 在以上的範例中,chunk_size=10000 指定了每一塊的最大字符數量,而 chunk_overlap=20 則是指定了相鄰塊之間重疊的字符數量。這種重疊是為了確保切分後的文本塊之間的語境連貫性。 最後,create_documents 方法被用於將長文本(例如一部書或一篇長文章)切分成多個較小的文本塊。這些文本塊可以被獨立處理,例如用於餵養到自然語言處理模型進行分析或摘要。 chunk_size 是指每一塊的最大字符數量,而 chunk_overlap 則是指定了相鄰塊之間重疊的字符數量。使用chunk_overlap 是為了確保切分後的文本塊之間的語境連貫性。換言之,這兩個參數用於控制當我們將長文本切分成較小的塊時,每個塊的大小和他們之間的重疊程度。 chunk_size 是用來定義每一個切割文檔的最大字符數量,而不是 token 數量。這意味著,每一塊的長度(以字符為單位)不會超過設定的 chunk_size 值。 您最終得到的 chunks 數量取決於您要分割的原始文本的長度。RecursiveCharacterTextSplitter 將原始文本分割為最大字符數為 chunk_size 的塊,並且相鄰塊之間會有 chunk_overlap 數量的字符重疊。因此,如果您的文本長度為 20,000 個字符,您將獲得兩個長度為 10,000 個字符的塊,這兩個塊在末尾和開頭有 20 個字符的重疊。 此方法的主要應用場景是處理大型文檔,例如長篇文章或書籍。當您需要將這種大型文檔輸入到自然語言處理模型(如 OpenAI 的 GPT-3)進行分析或摘要時,通常需要將文檔分割為更小的塊。這是因為大多數自然語言處理模型都有輸入大小的限制。此外,這種方法也可以用於平行處理大型文檔,將文檔分割為多個塊後,可以將這些塊分發到多個處理器或機器進行獨立處理,從而提高處理速度。 當然可以,首先,你需要將你的 PDF 文件讀入 Python,然後使用 langchain.text_splitter 中的 RecursiveCharacterTextSplitter 來將長文本切分成較小的部分。這些部分可以被獨立處理,例如用於餵養到自然語言處理模型進行分析或摘要。 下面是一個範例代碼: from PyPDF2 import PdfReader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.chat_models import ChatOpenAI from langchain.chains.summarize import load_summarize_chain # 讀入 PDF 文件 pdfreader = PdfReader('pytorch_cookbook.pdf') # 讀取文字內容 text = '' for i, page in enumerate(pdfreader.pages): content = page.extract_text() if content: text += content # 建立 ChatOpenAI 實例 llm = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo') # 將文字內容切成小塊 text_splitter = RecursiveCharacterTextSplitter(chunk_size=10000, chunk_overlap=20) chunks = text_splitter.create_documents([text]) # 創建並運行摘要鏈 chain = load_summarize_chain(llm, chain_type='map_reduce', verbose=False) summary = chain.run(chunks) 在這個範例中,pytorch_cookbook.pdf 是你的 PDF 文件的名稱,你需要將其替換為你自己的文件的實際路徑和名稱。此外,chunk_size=10000 和 chunk_overlap=20 是你可以根據自己的需求調整的參數,它們分別控制每個文本塊的大小和塊之間的重疊程度。 運行這段代碼後,你將得到一個名為 summary 的變量,其中包含了對你的 PDF 文件進行摘要後的結果。 然後,你可以對 summary 進行進一步的分析。例如,你可以使用自然語言處理工具來分析摘要中的主題,或者你可以使用數據視覺化工具來視覺化摘要中的關鍵字的分佈等。 視覺化是一種強大的工具,可以幫助我們更好地理解和解釋數據。在Python中,我們可以使用各種庫來視覺化數據,例如matplotlib,seaborn,或者是更高級的庫如Plotly和Bokeh。 以下是一個基本的範例,使用matplotlib庫來視覺化一個詞頻分佈: import matplotlib.pyplot as plt from collections import Counter # 假設我們有一段文字摘要 summary = "這是一段摘要文字,其中包含了許多重要的關鍵字,例如語言,處理,工具等等..." # 我們先將摘要分詞 words = summary.split() # 使用Counter計算每個詞的頻率 word_counts = Counter(words) # 將詞和對應的頻率分別存入兩個列表 labels, values = zip(*word_counts.items()) # 繪製長條圖來視覺化每個詞的頻率 plt.figure(figsize=(10,5)) plt.bar(labels, values) plt.show() 在這個範例中,我們首先將摘要分詞,然後使用Counter計算每個詞的頻率。然後,我們使用matplotlib的bar函數繪製長條圖,來視覺化每個詞的頻率。 請注意這只是一個基本的範例,實際上在進行文字處理和視覺化時,我們還需要處理更多的問題,例如去除停用詞(如"的","是"等常見但無實質意義的詞),或者使用更複雜的視覺化方法來呈現更多的信息。 學習知識點與總結 LangChain 與 OpenAI 的整合:此 Notebook 展示了如何將 LangChain 與 OpenAI API 結合來進行自然語言處理和文本摘要。 文本摘要的多種方法:從基本的提示摘要到使用提示模板和 Map Reduce 技術,這個示例展示了多種不同的文本摘要方法。處理大型文檔:使用 LangChain 的文本分割功能和 Map Reduce 技術來處理並摘要大型文檔,例如 PDF 文件。自然語言處理的實際應用:此代碼提供了一個實際的應用案例,展示了自然語言處理技術在實際問題中的應用。 整體來說,這個 Colab Notebook 是一個很好的學習資源,它不僅展示了如何使用 LangChain 和 OpenAI 進行文本摘要,而且還提供了對處理大型文檔和實現多種摘要方法的深入了解。