延續使用Meta釋出的模型,實作Chat GPT - Part 4,我們現在遇到一個問題:語言模型回答的資訊不是我想要的。
於是我參照ChatGPT回答不是你要的怎麼辦?,想使用低成本的技術:RAG,來改善這問題。
以下開始實作,首先引入一個重量級工具包,它叫做LangChain,這是做語言模型AI在實作上的一個省力工具。
from langchain.llms import HuggingFacePipeline
LLM = HuggingFacePipeline(pipeline = Generate_Text)
這部分程式如下圖,我們一樣按下「紅色框框」處來執行,大約一秒鐘後,執行完成,「紅色框框」處會有綠色提示 (0秒處)。
然後我們回顧ChatGPT回答不是你要的怎麼辦?,RAG的核心思想就是索引外部資料庫,來當作我的大腦,往後我希望我的語言模型在回答問題之前可以先來這個大腦知識區索引一下資料。
我同時將兩種知識索引的程式都列出來給大家使用,一種是以網站資料為知識索引,另一種是以PDF文件為知識索引,大家可以二選一執行。
# ------------------- Web Version -------------------
from langchain.document_loaders import WebBaseLoader
Web_Links = ['https://1688.com']
Loader = WebBaseLoader(Web_Links)
Documents = Loader.load()
from langchain.text_splitter import RecursiveCharacterTextSplitter
Text_Splitter = RecursiveCharacterTextSplitter(chunk_size = 1000, chunk_overlap = 30)
All_Splits = Text_Splitter.split_documents(Documents)
這部分程式如下圖,我們一樣按下「紅色框框」處來執行,大約兩秒後,執行完成,「紅色框框」處會有綠色提示 (2秒處)。
# ------------------- Single PDF Version -------------------
from langchain.document_loaders import PyPDFLoader
from google.colab import files
uploaded = files.upload()
Loader = PyPDFLoader('1688.pdf')
Documents = Loader.load()
from langchain.text_splitter import RecursiveCharacterTextSplitter
Text_Splitter = RecursiveCharacterTextSplitter(chunk_size = 500, chunk_overlap = 100)
All_Splits = Text_Splitter.split_documents(Documents)
這部分我們需要準備一個檔名叫做「1688.pdf」的文件,我的作法是直接到阿里巴巴首頁https://1688.com,然後按右鍵轉存pdf,這樣我就有該網頁的pdf檔案了。
這部分程式如下圖,我們一樣按下「紅色框框」處來執行,大約43秒後,執行完成,「紅色框框」處會有綠色提示 (43秒處)。
然後我希望不論透過上述哪種方式得到的知識都能存在一個向量資料庫,於是我要做Embedding,然後使用FAISS來儲存,它是Facebook開發的技術,全名叫做Facebook AI Similarity Search。
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
Model_Name = 'sentence-transformers/all-mpnet-base-v2'
Model_Kwargs = {"device": "cuda"}
Embedding = HuggingFaceEmbeddings(model_name = Model_Name, model_kwargs = Model_Kwargs)
VectorStore = FAISS.from_documents(All_Splits, Embedding)
這部分程式如下圖,我們一樣按下「紅色框框」處來執行,大約8秒後,執行完成,「紅色框框」處會有綠色提示 (8秒處)。
接著把我們的大型語言模型與上述的向量資料庫一起拼湊成RAG技術,作法如下:
from langchain.chains import ConversationalRetrievalChain
RAG = ConversationalRetrievalChain.from_llm(LLM,
VectorStore.as_retriever(),
return_source_documents = True)
這部分程式如下圖,我們一樣按下「紅色框框」處來執行,大約一秒後,執行完成,「紅色框框」處會有綠色提示 (1秒處)。
最後我們就可以問問題囉,我一樣問什麼是1688 ?
Chat_History = []
Query = "What is 1688 ?"
Result = RAG({"question": Query, "chat_history": Chat_History})
print(Result['answer'])
Chat_History.append((Query, Result['answer']))
這部分程式如下圖,我們一樣按下「紅色框框」處來執行,大約22秒後,執行完成,「紅色框框」處會有綠色提示 (22秒處)。
最後得到的回答是:
可以回顧一下使用Meta釋出的模型,實作Chat GPT - Part 4,之前回答我1688和威士忌有關係,加入RAG技術之後,他終於回答我正確答案:1688是一個電商平台,叫做阿里巴巴。
由上述實作可以看到引入大腦知識可以顯著讓大型語言模型得到你想要的答案的機率。