ร้านขายเวกเตอร์

  • ไปที่ การทำงานร่วมกัน เพื่อเรียนรู้เกี่ยวกับเครื่องมือเก็บเวกเตอร์บุคคลภาพของการสนับสนุนโดยอย่างเป็นทางการของ LangChain

สิ่งที่ทั่วไปที่สุดสำหรับการเก็บรักษาและค้นหาข้อมูลที่ไม่มีโครงสร้างคือการคำนวณเวกเตอร์ลักษณะของข้อมูล และจากนั้นค้นหาเวกเตอร์ที่คล้ายคลึงขึ้นมาบนการค้นหา เมื่อค้นหา ฐานข้อมูลเวกเตอร์รับผิดชอบในการให้เครื่องมือเก็บข้อมูลสำหรับการค้นหาเวกเตอร์

การเริ่มต้นกับ LangChain Vector Store

คู่มือนี้นำเสนอความสามารถพื้นฐานที่เกี่ยวข้องกับ Vector Stores ส่วนประกอบสำคัญในการทำงานกับการจัดเก็บเวกเตอร์คือ embedding model (ที่รับผิดชอบในการคำนวณเวกเตอร์ลักษณะ) ดังนั้น เราขอแนะนำให้เรียนรู้วิธีการคำนวณเวกเตอร์ของข้อความกับ text embedding model ก่อนการศึกษาบทนี้

มีหลาย Engine เก็บเวกเตอร์ที่ยอดเยี่ยม ด้านล่างนี้เราจะแนะนำการใช้งานของ 3 Engine ที่เป็นเวอร์ชันฟรีและโอเพ่นซอร์สในกรอบงาน LangChain

Chroma

บทนี้ใช้ฐานข้อมูลเวกเตอร์ชื่อ chroma ซึ่งทำงานแบบท้องถิ่นเป็น Python library

pip install chromadb

ที่นี่เราใช้ OpenAI embedding model เพื่อคำนวณเวกเตอร์ ดังนั้น เราต้องได้รับ OpenAI API key

import os
import getpass
os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:')
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.vectorstores import Chroma

raw_documents = TextLoader('../../../state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
db = Chroma.from_documents(documents, OpenAIEmbeddings())

FAISS

บทนี้ใช้ฐานข้อมูลเวกเตอร์ชื่อ FAISS ซึ่งใช้ไลบรารี Facebook AI Similarity Search (FAISS)

pip install faiss-cpu

ที่นี่เราใช้ OpenAI embedding model เพื่อคำนวณเวกเตอร์ ดังนั้น เราต้องได้รับ OpenAI API key

import os
import getpass

os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:')
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.vectorstores import FAISS

raw_documents = TextLoader('../../../state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
db = FAISS.from_documents(documents, OpenAIEmbeddings())

Lance

ในบทนี้ เราจะแนะนำว่ากรอบงาน LangChain ใช้องค์การเวกเตอร์ชื่อ LanceDB

pip install lancedb

ที่นี่เราใช้ OpenAI embedding model เพื่อคำนวณเวกเตอร์ ดังนั้น เราต้องได้รับ OpenAI API key

import os
import getpass

os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Key:')
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.vectorstores import LanceDB

import lancedb

db = lancedb.connect("/tmp/lancedb")
table = db.create_table(
    "my_table",
    data=[
        {
            "vector": embeddings.embed_query("Hello World"),
            "text": "Hello World",
            "id": "1",
        }
    ],
    mode="overwrite",
)

raw_documents = TextLoader('../../../state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
db = LanceDB.from_documents(documents, OpenAIEmbeddings(), connection=table)

การค้นหาความคล้ายคลึง

query = "What did the President say to Ketanji Brown Jackson?"
docs = db.similarity_search(query)
print(docs[0].page_content)

ค้นหาความคล้ายคลึงแบบเวกเตอร์

ใช้ similarity_search_by_vector เพื่อทำการค้นหาความคล้ายคลึงโดยใช้เวกเตอร์ที่กำหนดไว้ ฟังก์ชันนี้รับเวกเตอร์ซึ่งเป็นการฝังเอาท์เป็นพารามิเตอร์แทนที่จะใช้สตริง

embedding_vector = OpenAIEmbeddings().embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector)
print(docs[0].page_content)

การดำเนินงานแบบไม่สัมพันธ์

การเก็บรักษาเวกเตอร์มักทำงานเป็นบริการอิสระและต้องการการดำเนินงานของไอโอ ดังนั้น ให้ใช้การเรียกใช้แบบไม่สัมพันธ์เมื่อเชื่อมต่อกับอินเตอร์เฟซเก็บเวกเตอร์ สิ่งนี้สามารถเพิ่มประสิทธิภาพได้เนื่องจากไม่ต้องเสียเวลารอคำตอบจากบริการภายนอก

Langchain รองรับการดำเนินงานแบบไม่สัมพันธ์สำหรับการเก็บเวกเตอร์ ทุกระบบสามารถเรียกใช้เมทอดแบบไม่สัมพันธ์ของตนเองด้วยคำนำหน้า a ที่หมายถึง async

Qdrant คือระบบเก็บเวกเตอร์ที่รองรับการดำเนินงานแบบไม่สัมพันธ์ทุกอย่าง ต่อไปคือตัวอย่างการใช้ Qdrant

pip install qdrant-client
from langchain_community.vectorstores import Qdrant

การสร้างการจัดเก็บเวกเตอร์แบบไม่สัมพันธ์

db = await Qdrant.afrom_documents(documents, embeddings, "http://localhost:6333")

ค้นหาความคล้ายคลึง

query = "What did the President say to Ketanji Brown Jackson?"
docs = await db.asimilarity_search(query)
print(docs[0].page_content)

การค้นหาโดยใช้เวกเตอร์

embedding_vector = embeddings.embed_query(query)
docs = await db.asimilarity_search_by_vector(embedding_vector)

การค้นหาด้วย Maximal Marginal Relevance (MMR)

Maximal Marginal Relevance ปรับปรุงความคล้ายคลึงกับคิดสำคัญที่สุดและความหลากหลายระหว่างเอกสารที่เลือกไว้ ระบบนี้ยังรองรับ API แบบไม่สัมพันธ์

query = "What did the President say to Ketanji Brown Jackson?"
found_docs = await qdrant.amax_marginal_relevance_search(query, k=2, fetch_k=10)
for i, doc in enumerate(found_docs):
    print(f"{i + 1}.", doc.page_content, "\n")