天天看點

一文帶您了解向量資料庫:大模型場景下知識管理新方式

作者:新語資料故事彙

  向量資料庫在建構基于大語言模型的行業智能應用中扮演着重要角色。大模型雖然能回答一般性問題,但在垂直領域服務中,其知識深度、準确度和時效性有限。為了解決這一問題,企業可以利用向量資料庫結合大模型和自有知識資産,建構垂直領域的智能服務。向量資料庫存儲和處理向量資料,提供高效的相似度搜尋和檢索功能。通過向量嵌入,将企業知識庫文檔和資料轉化為向量表示,并與大模型進行互動,實作專有、私域的垂直的行業智能化應用。

基于大語言模型建構行業智能應用為什麼需要向量資料庫?

  在2023年這個春天,最受矚目的科技産品無疑是ChatGPT。ChatGPT的問世重新點燃了曾經靜寂已久的人工智能領域,為AI注入了新的活力。大語言模型(LLM)展示了生成式AI能夠達到與人類語言高度相似的表達能力,使得AI不再遙不可及,而是已經進入了人們的工作和生活中。衆多從業者都急切地投身于這個改變時代的機遇,生成式AI已經成為資本和企業不可忽視的下一代技術關鍵,同時也對底層基礎設施的提出了更高的要求。

  大模型能夠回答較為普世的問題,但是若要服務于垂直專業領域,會存在知識深度、知識準确度和時效性不足的問題,比如:醫療或法律行業智能服務要求知識深度和準确度比較高,那麼企業建構垂直領域智能服務?目前有兩種模式:

  • 基于大模型的Fine Tune方式建構垂直領域的智能服務,需要較大的綜合投入成本和較低的更新頻率,适用性不是很高,并适用于所有行業或企業。
  • 通過建構企業自有的知識資産,結合大模型和向量資料庫來搭建垂直領域的深度服務,本質是使用知識庫進行提示工程(Prompt Engineering)。以法律行業為例,基于垂直類目的法律條文和判例,企業可以建構垂直領域的法律科技服務。如法律科技公司https://www.harvey.ai/,正在建構“律師的副駕駛”(Copilot for lawyers)以提高法律檔案的起草、修改和研究服務。

  将企業知識庫文檔和資料通過向量特征提取(embedding)然後存儲到向量資料庫(vector database),應用LLM大語言模型與向量化的知識庫檢索和比對知識,建構智能服務。比如:應用大語言模型和向量資料庫(知識庫)可以讓企業應用級Chatbot(聊天機器人)的回答更具專業性和時效性,建構企業專屬Chatbot。

為啥是向量(vector)?

  向量(vector)是在大語言模型、知識庫互動、計算過程中的重要名額。它可以将文本和知識表示為數學向量,實作文本相似度計算、知識庫檢索和推理等功能。向量(vector)為語義了解和應用提供了一種友善有效的表示方法。

vector 是模型之根,是大模型與知識庫互動之橋。

  向量嵌入(vector embeddings)是一種AI原生的資料表示方式,适用于各種基于AI的工具和算法。它可以表示非結構化的資料或知識,如文本、圖像、音頻和視訊等。

一文帶您了解向量資料庫:大模型場景下知識管理新方式

圖:LLM進化之樹

什麼是vector embeddings

  羅伊·凱恩斯(Roy Keynes)的定義是:“嵌入(vector embeddings)是學習的轉換,使資料更有用”。神經網絡深度學習将文本轉化為一個包含其實際含義的向量空間。這更有用,因為它可以找到同義詞,以及單詞之間的句法和語義關系。最為經典的例子:Queen=King-Man+Woman

一文帶您了解向量資料庫:大模型場景下知識管理新方式

圖:詞向量示意圖

向量資料庫作用是什麼

  向量資料庫的主要作用是存儲和處理向量資料,并提供高效的向量檢索功能。最核心是相似度搜尋,通過計算一個向量與其他所有向量之間的距離來找到最相似的向量(最相似的知識或内容)。這是基本索引(flat indexes)的樸素原理,在大型向量資料庫中,這可能需要很長時間。

  為了提高搜尋性能,可以嘗試僅計算一部分向量的距離。這種方法稱為近似最近鄰(approximate nearest neighbors:ANN),它提高了速度,但犧牲了結果的品質。一些常用的ANN索引包括局部敏感哈希(Locally Sensitive Hashing:LSH)、分層可導航小世界(Hierarchical Navigable Small Worlds:HNSW)或倒排檔案索引(Inverted File Index:IVF)等。

一文帶您了解向量資料庫:大模型場景下知識管理新方式

圖:向量資料庫結構

  以上結構圖,核心包括兩個關鍵部分:Embedding 和 vector database ,Embedding過程是将非結構化的資料編碼為向量,這些非結構化的資料包括:文本、圖檔等等,Embedding 的核心Embedding Model。過程包括:

  • 使用嵌入模型(Embedding Model)來為想要索引的内容建立向量。這些内容包括文本、圖檔、視訊等等。
  • 向量被插入到向量資料庫中,包括原始内容。
  • 當應用程式發出查詢時,使用相同的嵌入模型為查詢建立向量,并使用這些向量在資料庫中查詢相似的向量。如前所述,這些相似的向量與用來建立它們的原始内容相關聯。

  在chatGPT火爆的春天裡,各種向量資料庫如雨後春筍般冒出來,參見:https://github.com/topics/vector-database ;為更好了解向量資料庫,筆者試用了兩個開源的向量資料庫:Chroma 和 milvus。

Chroma :the open-source embedding database.

github:https://github.com/chroma-core/chroma

  Chroma是一個開源的嵌入向量資料庫,專門用于存儲和檢索向量嵌入。它提供高效的存儲和檢索功能,支援相似度搜尋和大規模向量資料處理。Chroma的架構設計靈活,具備可擴充性和高性能,能夠處理不斷增長的資料量和查詢負載。開發人員可以根據自己的需求自定義和擴充Chroma的功能,利用向量嵌入實作先進的語義搜尋和分析能力。

一文帶您了解向量資料庫:大模型場景下知識管理新方式

圖:Chroma應用互動流程

import chromadb
# setup Chroma in-memory, for easy prototyping. Can add persistence easily!
client = chromadb.Client()
# Create collection. get_collection, get_or_create_collection, delete_collection also available!
collection = client.create_collection("all-my-documents")
# Add docs to the collection. Can also update and delete. Row-based API coming soon!
collection.add(
    documents=["This is document1", "This is document2"], # we handle tokenization, embedding, and indexing automatically. You can skip that and add your own embeddings as well
    metadatas=[{"source": "notion"}, {"source": "google-docs"}], # filter on these!
    ids=["doc1", "doc2"], # unique for each doc
)
# Query/search 2 most similar results. You can also .get by id
results = collection.query(
    query_texts=["This is a query document"],
    n_results=2,
    # where={"metadata_field": "is_equal_to_this"}, # optional filter
    # where_document={"$contains":"search_string"}  # optional filter
)
           

Chroma支援的嵌入模型:

  • all-MiniLM-L6-v2
from chromadb.utils import embedding_functions
default_ef = embedding_functions.DefaultEmbeddingFunction()
           
  • Sentence Transformers
sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(model_name="all-MiniLM-L6-v2")
           
  • OpenAI
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
                api_key="YOUR_API_KEY",
                model_name="text-embedding-ada-002"
            )
           
  • Instructor models
cohere_ef  = embedding_functions.CohereEmbeddingFunction(
        api_key="YOUR_API_KEY", 
        model_name="multilingual-22-12")
multilingual_texts  = [ 'Hello from Cohere!','您好,來自 Cohere!',]
cohere_ef(texts=multilingual_texts)
ef = embedding_functions.InstructorEmbeddingFunction(
model_name="hkunlp/instructor-xl", device="cuda")
           
  • Google PaLM API models
palm_embedding = embedding_functions.GooglePalmEmbeddingFunction(
    api_key=api_key, model=model_name)
           

milvus:github 星星最多的開源向量資料庫

  Milvus是github 星星最多的開源向量資料庫,專門用于快速存儲、檢索和分析大規模向量資料。它提供高性能和可擴充的架構,支援多種向量索引算法和查詢模式。Milvus可廣泛應用于推薦系統、圖像搜尋、自然語言處理和機器學習等領域,幫助使用者快速發現和分析相似的向量資料。

github:https://github.com/milvus-io/milvus

  同時提供一個雲化的服務(Zilliz CLoud),為了更簡潔說明和體驗向量資料,筆者直接開通的服務嘗試向量資料庫,免費100刀的試用額度,https://cloud.zilliz.com/ 。

milvus(Zilliz CLoud)

  注冊忽略,直接建立資料庫和collection,可以自己上傳資料(需要自己Embedding 向量 )也可以使用它樣例資料建立collection,然後data preview 和搜尋查詢;後面部分python API 調用服務執行搜尋等任務示例。

一文帶您了解向量資料庫:大模型場景下知識管理新方式

圖:開始探索Zilliz CLoud

一文帶您了解向量資料庫:大模型場景下知識管理新方式

圖:選擇建立collection的方式

一文帶您了解向量資料庫:大模型場景下知識管理新方式

圖:檢視Schema

一文帶您了解向量資料庫:大模型場景下知識管理新方式

圖:向量搜尋

Python pymilvus

  • 連接配接遠端的Milvus向量資料
import pandas as pd
from pymilvus import     connections,utility,FieldSchema,CollectionSchema,DataType,Collection
conn=connections.connect("default", host="in01-70ff1fe5d9bc5a0.aws-us-west-2.vectordb.zillizcloud.com", port="19537",secure = True,
                    user='db_admin', password=snbGetValue("milvus_pw"))
has = utility.has_collection("medium_articles")
print(f"Does collection medium_articles exist in Milvus: {has}")
           
  • 獲得collection
collection = Collection("medium_articles")      # Get an existing collection.
collection.load()
           
  • collection 的中繼資料
一文帶您了解向量資料庫:大模型場景下知識管理新方式
  • Milvus查詢query
一文帶您了解向量資料庫:大模型場景下知識管理新方式
  • Milvus 向量(vector)搜尋
一文帶您了解向量資料庫:大模型場景下知識管理新方式
一文帶您了解向量資料庫:大模型場景下知識管理新方式

圖:以上代碼的Graph視圖

繼續閱讀