paint-brush
Cơ sở dữ liệu Vector - Khái niệm cơ bản về Tìm kiếm Vector và Gói Langchain trong Pythontừ tác giả@shyamganesh
18,204 lượt đọc
18,204 lượt đọc

Cơ sở dữ liệu Vector - Khái niệm cơ bản về Tìm kiếm Vector và Gói Langchain trong Python

từ tác giả Shyam Ganesh S7m2023/09/30
Read on Terminal Reader

dài quá đọc không nổi

Trong bài viết này, tôi sẽ hướng dẫn bạn những kiến thức cơ bản về cơ sở dữ liệu vectơ, tìm kiếm vectơ và gói Langchain trong python để lưu trữ và truy vấn các vectơ tương tự. Để bắt đầu hành trình học tập của mình, chúng ta sẽ bắt đầu với một khái niệm chính có tên là “Nhúng”. Nhúng là một cách để thể hiện dữ liệu vào máy theo định dạng dễ hiểu của riêng nó.
featured image - Cơ sở dữ liệu Vector - Khái niệm cơ bản về Tìm kiếm Vector và Gói Langchain trong Python
Shyam Ganesh S HackerNoon profile picture

Trong bài đăng trên blog này, tôi sẽ hướng dẫn bạn các nguyên tắc cơ bản của cơ sở dữ liệu vectơ, tìm kiếm vectơ và gói Langchain trong Python, tạo điều kiện thuận lợi cho việc lưu trữ và truy xuất các vectơ có thể so sánh.


Để bắt đầu cuộc hành trình của mình, chúng ta sẽ bắt đầu với một khái niệm quan trọng được gọi là "Nhúng".

Nhúng là gì?

Trong bài viết này, chúng ta sẽ khám phá khái niệm nhúng - một khía cạnh cơ bản của học máy cho phép chúng ta biểu diễn dữ liệu văn bản theo định dạng mà máy có thể dễ dàng hiểu được.


Về cơ bản, các phần nhúng đóng vai trò là biểu diễn vectơ của văn bản, chuyển đổi mạng lưới từ, câu và đoạn văn phức tạp thành định dạng số mà máy có thể xử lý.


Một vấn đề cấp bách nảy sinh: liệu con người có thể giải mã được những phần nhúng này không? Câu trả lời là không. Phần nhúng về cơ bản là các chuỗi số gói gọn thông tin văn bản.


Do đó, việc hiểu và làm việc với vectơ nhúng có thể là một nhiệm vụ khó khăn đối với con người, trong khi máy móc có thể xử lý nó một cách dễ dàng.


Tồn tại vô số kỹ thuật để tạo phần nhúng từ văn bản. Các phương pháp đáng chú ý bao gồm TF-IDF, Word2Vec, Glove và BERT, cùng với các phương pháp khác. Trong lĩnh vực học máy hiện đại, việc nhúng câu đã trở nên phổ biến hơn việc nhúng từ.


Những phần nhúng câu này, thể hiện bản chất của văn bản, có thể được lấy từ các mô hình biến đổi câu được đào tạo trước như "all-MiniLM-L6-V2" và "all-mpnet-base-v2".


Các mô hình này tạo ra các phần nhúng có kích thước cố định, thường là 384 hoặc 768 kích thước, cho một văn bản nhất định.


Bây giờ chúng ta đã khám phá các nguyên tắc cơ bản về nhúng và các kỹ thuật khác nhau để tạo ra chúng, hãy chuyển trọng tâm sang thách thức lưu trữ các vectơ nhúng có chiều cao này trong kho lưu trữ vectơ.

Cửa hàng véc tơ

Kho lưu trữ dữ liệu vectơ là một cơ sở dữ liệu chuyên biệt được thiết kế để lưu trữ các biểu diễn nhúng chiều cao của các loại dữ liệu đa dạng, bao gồm âm thanh, video, hình ảnh, văn bản, v.v.


Một trong những chức năng cốt lõi của nó là khả năng tìm kiếm hiệu quả các vectơ trong kho gần giống với vectơ truy vấn nhất định.



Các cửa hàng vectơ hợp lý hóa quy trình lưu trữ các phần nhúng và tiến hành tìm kiếm sự tương đồng giữa các vectơ này, đơn giản hóa việc quản lý và truy xuất các biểu diễn dữ liệu chiều cao.


Trong lĩnh vực nhúng vectơ, tìm kiếm tương tự liên quan đến việc định lượng mức độ gần gũi hoặc liên quan giữa hai hoặc nhiều nhúng nhúng. Thông thường, điều này được thực hiện bằng cách tính toán độ tương tự bằng cách sử dụng các số liệu khoảng cách khác nhau. Một số thước đo khoảng cách thường được sử dụng và công nhận rộng rãi bao gồm khoảng cách Euclide, khoảng cách Manhattan và khoảng cách cosin, cùng với các thước đo khác. Các số liệu này giúp chúng tôi đánh giá mức độ tương tự hoặc khác nhau giữa các vectơ, tạo điều kiện thuận lợi cho việc tìm kiếm điểm tương đồng hiệu quả trong dữ liệu.


Ví dụ: khi xác định độ tương tự hoặc độ gần giữa hai điểm trên biểu đồ, khoảng cách Euclide thường được sử dụng. Khoảng cách này có thể được tính bằng công thức sau:


Khoảng cách Euclide = [(x2 - x1)^2 + (y2 - y1)^2]^0,5



Khoảng cách giữa 2 điểm trong 2D


Ở đây, (x1, y1) đại diện cho tọa độ của điểm đầu tiên và (x2, y2) đại diện cho tọa độ của điểm thứ hai trên biểu đồ. Kết quả của phép tính này cung cấp thước đo về khoảng cách không gian giữa hai điểm, cho biết sự giống nhau hoặc khác nhau về vị trí của chúng trong biểu đồ.


Tương tự, trong tìm kiếm tương tự, các phần nhúng được mô tả trong không gian nhiều chiều, với mỗi bản ghi đóng vai trò là một điểm dữ liệu.


Dòng mã bên dưới minh họa cách truy xuất 5 phần nhúng tương tự hàng đầu cho một dữ liệu đầu vào nhất định:

 distance, n = vector_store.search(input_embedding, k=5)


Mã này sẽ trả về danh sách 5 nội dung nhúng hàng đầu gần giống với dữ liệu đầu vào, khiến nó trở thành một công cụ có giá trị cho nhiều ứng dụng khác nhau như hệ thống đề xuất, truy xuất nội dung, v.v.


Đầu ra của hàm vector_store.search() bao gồm các phần nhúng tương tự top-k cùng với khoảng cách tương ứng của chúng với input_embedding. Tham số "k" là giá trị có thể định cấu hình để xác định số lượng phần nhúng gần nhất cần truy xuất trong tìm kiếm tương tự. Bạn có thể đặt "k" để kiểm soát số lượng kết quả mong muốn mà thao tác tìm kiếm trả về.


Bây giờ chúng ta đã thiết lập được hiểu biết cơ bản về các cửa hàng vector, hãy tiếp tục tìm hiểu sâu hơn về gói LangChain và FAISS. Những công cụ này sẽ nâng cao hơn nữa khả năng làm việc của chúng tôi với các phần nhúng có chiều cao và thực hiện các tìm kiếm tương tự hiệu quả.

LangChain trong Python

Nói một cách đơn giản, LangChain là một framework được thiết kế để xây dựng các ứng dụng khai thác khả năng của Mô hình ngôn ngữ lớn (LLM). Để biết thêm thông tin chi tiết và tài nguyên, bạn có thể tham khảo tài liệu chính thức của LangChain.


LangChain trong trăn


Ngược lại, FAISS, viết tắt của "Tìm kiếm tương tự AI của Facebook", là một thư viện Python cung cấp cho các nhà phát triển một phương tiện nhanh chóng và hiệu quả để tìm kiếm các phần nhúng tương tự, khác với các phương pháp tiếp cận dựa trên hàm băm thông thường.


Thư viện này được nhóm AI của Facebook phát triển và cung cấp các khả năng mạnh mẽ cho các tác vụ tìm kiếm tương tự trong không gian nhiều chiều.


FAISS là một thư viện mã nguồn mở có thể được lưu trữ trên máy chủ của riêng bạn.


Trong quá trình khám phá LangChain và FAISS, giờ đây chúng tôi sẽ hướng tới triển khai FAISS trong khuôn khổ LangChain. Dưới đây là một số API chính từ quá trình tích hợp FAISS của LangChain mà chúng tôi sẽ tập trung vào trong bài viết này:


  1. add_documents() : Chức năng này cho phép chúng ta kết hợp các tài liệu bổ sung vào kho vector.


  2. add_embeddings() : Nó cho phép bổ sung thêm nhiều phần nhúng vào kho lưu trữ vectơ.


  3. from_documents() : API này trả về VectorStore dựa trên các tài liệu được cung cấp.


  4. from_embeddings() : Hàm này cung cấp chỉ mục FAISS được tạo từ các phần nhúng đã cho.


  5. Load_local() : Sử dụng công cụ này để tải chỉ mục FAISS từ đĩa.


  6. save_local() : Nó cho phép bạn lưu chỉ mục FAISS vào đĩa.


  7. similarity_search() : Hàm này truy xuất các tài liệu giống nhất với một truy vấn nhất định.


  8. similarity_search_by_vector() : Nó truy xuất các tài liệu gần giống nhất với nội dung nhúng nhất định.


Các API này tạo thành nền tảng để kết hợp các khả năng của LangChain với FAISS, cho phép bạn làm việc với các phần nhúng và thực hiện tìm kiếm tương tự hiệu quả trong ứng dụng của mình.


Lọc meta là một kỹ thuật có giá trị được sử dụng để tinh chỉnh kết quả của truy vấn tìm kiếm trong LangChain FAISS. Thông thường có hai loại lọc meta: Lọc trước và lọc sau. Trong khuôn khổ của chúng tôi, chúng tôi đặc biệt hỗ trợ tính năng lọc sau cho các truy vấn tìm kiếm.


Điều quan trọng cần lưu ý là khái niệm lọc meta cho kết quả tìm kiếm là một tính năng có sẵn trong phiên bản LangChain của FAISS và không có trong bản triển khai FAISS ban đầu. Khả năng lọc sau này nâng cao độ chính xác và mức độ liên quan của kết quả tìm kiếm, mang lại kết quả phù hợp hơn cho người dùng.


Được trang bị kiến thức về API LangChain FAISS, hãy cùng đi sâu vào cách triển khai LangChain FAISS bằng Python. Việc triển khai này sẽ cho phép bạn làm việc với các phần nhúng, thực hiện tìm kiếm tương tự và áp dụng các kỹ thuật lọc sau để tinh chỉnh kết quả tìm kiếm của bạn trong khung LangChain.


Hãy thoải mái khám phá và tận dụng những khả năng này để tạo ra các ứng dụng khai thác sức mạnh của Mô hình ngôn ngữ lớn và tìm kiếm tương tự nâng cao với FAISS.

Bản demo Python của LangChain FAISS

Tập dữ liệu

Trong hướng dẫn hướng dẫn này, chúng tôi đã chọn Bộ dữ liệu Stanford làm tập dữ liệu cơ sở và thêm một số cột để hiển thị công việc lọc meta trong LangChain FAISS.


Chúng tôi sẽ bắt đầu với việc cài đặt và nhập các gói cần thiết

 !pip install langchain[all] !pip3 install Langchain[FAISS] !pip install faiss-cpu # WARNING: langchain 0.0.74 does not provide the extra 'faiss'
 from langchain import FAISS import pandas as pd import numpy as np import os import time import pickle


Bây giờ, chúng tôi sẽ nhập tập dữ liệu:

 passage_data = pd.read_csv("/Users/shyam/Python_Programs/Text Similarity Codes/Standford_Edited.csv") passage_data.drop(columns=["Unnamed: 0"],axis=1, inplace=True) passage_data 

Tổng quan về tập dữ liệu


Có tập dữ liệu, chúng ta cần khởi tạo hàm nhúng để chuyển đổi dữ liệu văn bản thành vectơ. Chúng tôi đã sử dụng “sentence-transformers/all-MiniLM-L6-V2” để tạo ra các phần nhúng trong 384 chiều,

 from langchain.embeddings import SentenceTransformerEmbeddings embedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")


Chúng tôi sẽ thiết lập thông tin siêu dữ liệu. Trong siêu dữ liệu, chúng tôi đã thêm ID tài liệu và ngôn ngữ tài liệu cho mỗi lần nhúng (nội dung),

 start=time.time() metadatas = [] for index, row in passage_data.iterrows(): doc_meta = { "id": row['Id'], "language": row['Language'] } metadatas.append(doc_meta)


Thế là xong… Bây giờ chúng tôi sẽ xây dựng chỉ số FAISS của mình,

 faiss = FAISS.from_texts(passage_data['Content'].tolist(), embedding_function, metadatas) print("Time Taken --> ", time.time()-start)


Bây giờ, chúng tôi sẽ cố gắng lưu chỉ mục FAISS vào đĩa và tải lại:

 faiss.save_local("/Users/shyam/Python_Programs/LangChain_FAISS", "Standford") loaded_faiss = faiss.load_local("/Users/shyam/Python_Programs/LangChain_FAISS",embedding_function, "Standford")


Chúng ta đã hoàn tất việc xây dựng chỉ mục, lưu trữ và tải FAISS. Đó là thời gian suy luận. Chúng tôi sẽ cố gắng tìm kiếm một số truy vấn và kiểm tra chỉ mục FAISS.


Đầu tiên, chúng ta sẽ lấy năm tài liệu tương tự hàng đầu có liên quan đến “chủ nghĩa vô thần”.

 start=time.time() loaded_faiss.similarity_search_with_score("What is atheism?",5) 

Kết quả của "chủ nghĩa vô thần"


Vâng, kết quả rất thuyết phục. Tuy nhiên, chúng ta sẽ khám phá thêm…


Lần này, chúng tôi sẽ thử một truy vấn ngôn ngữ khác với một số tính năng lọc meta. Chúng tôi sẽ hỏi một truy vấn bằng tiếng Nga nêu rõ tiêu chí lọc phải là {lang: 'ru_RU'}.

 #Что такое атеизм? - Russian loaded_faiss.similarity_search_with_score("Что такое атеизм?",5, {"language":"ru_RU"}, 10)


Ở đây, chúng tôi đã đề cập đến việc lấy mười tài liệu giống nhau nhất từ kho lưu trữ vectơ, sau đó áp dụng điều kiện lọc để có được năm tài liệu hàng đầu cho truy vấn của chúng tôi.

Đầu ra của truy vấn sau lọc


Khi kết thúc bài viết này, tôi tin rằng bạn đã có được sự hiểu biết vững chắc về kho lưu trữ vectơ và tìm kiếm vectơ. Chúng tôi cũng đã cung cấp bản trình diễn LangChain FAISS để minh họa chức năng của nó.


Tôi đặc biệt khuyến khích bạn khám phá các cửa hàng vectơ khác như ChromaDb, Qdrant, Milvus, v.v.


Mỗi cửa hàng vector đều có những ưu điểm và nhược điểm riêng, vì vậy hãy lựa chọn dựa trên các yêu cầu cụ thể trong trường hợp sử dụng của bạn.


Chúc các bạn có một chuyến đi học thú vị và hiệu quả!