由 Facebook AI Research 團隊在 2018 年 3 月開始在 Github 上活躍,其優點為提供高效算法來快速搜索和聚類詞嵌入向量資料。
上手方式也極其簡單
首先先安裝 Python 套件,官方提供了 faiss-cpu 與 faiss-gpu 兩個不同版本的套件。文字轉向量說實在不是非常繁重的工作,日常使用可以用 faiss-cpu 版本即可
pip install faiss-cpu langchain-community
# pip install faiss-gpu langchain-community
再來就是開始撰寫程式碼讓他去分割我們的文本內容啦,這邊我選擇的內容是開放源碼授權概觀中對不同開源授權的解釋。
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("./license.txt")
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=30)
docs = text_splitter.split_documents(loader.load())
embeddings = HuggingFaceBgeEmbeddings(
model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
model_kwargs = {'device': 'cpu'},
encode_kwargs = {'normalize_embeddings': True}
)
embed_document = FAISS.from_documents(docs, embeddings)
Line 7: 我們將讀進來的文本字串分割成每段 300 個單位,每個單位都加上前一段的 30 單元的文字
Line 9: 我們使用一個支援多國語言的一個詞嵌入模型,幫我做文字向量化的工作
簡單測試一下,若我們想要詢問有關 "Apache License" 的相關內容
docs = embed_document.similarity_search("Apache License")
print(docs[0].page_content)
"""
重點規則:
散佈時要附上 Apache 2.0 授權
衍生作品不需要開源
專利授權方面允許製造、使用、販售等多種權利
可為使用者提供擔保、支援服務等,但是不得使用其他貢獻者的名義擔保或背書支援服務
明確說明授權不處理商標權
關於 Apache 2.0 與 BSD 的差異可以參考這篇林懿萱著作的《化簡為繁的 Apache-2.0 授權條款》。
MPL 2.0 授權
https://opensource.org/licenses/MPL-2.0
"""
可以看到,使用 Langchain 的字串分割與 Faiss 去做相似度搜尋,成功地搜尋出關於 "Apache License" 的相關授權資訊。
若分割完後要儲存給下一次做相似度搜尋使用,可以使用 sqlite 去儲存我們的文字資料。
import sqlite3
conn = sqlite3.connect("vector.sqlite")
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS text_segments (
id INTEGER PRIMARY KEY,
segment TEXT
)
''')
cursor.executemany('''
INSERT INTO text_segments (segment) VALUES (?)
''', [(segment.page_content,) for segment in docs])
若我們下次要使用同一份文本,就可以透過讀取資料庫的方式去獲取資料,不用重複讀取 txt 文件
from langchain_core.documents import Document
result = cursor.execute('SELECT * FROM text_segments').fetchall()
fetch_data = [Document(page_content=record[1]) for record in result]
embeddings = HuggingFaceBgeEmbeddings(
model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
model_kwargs = {'device': 'cpu'},
encode_kwargs = {'normalize_embeddings': True}
)
embed_document = FAISS.from_documents(fetch_data, embeddings)
docs = embed_document.similarity_search("Apache License")
print(docs[0].page_content)