🚀 Coba Zilliz Cloud, Milvus yang sepenuhnya terkelola, secara gratis—rasakan performa 10x lebih cepat! Coba Sekarang>>

milvus-logo
LFAI
Beranda
  • Integrasi
  • Home
  • Docs
  • Integrasi

  • Orkestrasi

  • LangChain

  • Penggunaan Dasar

Menggunakan Milvus sebagai Penyimpan Vektor LangChain

Buku catatan ini menunjukkan cara menggunakan fungsionalitas yang terkait dengan Milvus sebagai penyimpan vektor LangChain.

Penyiapan

Anda harus menginstal langchain-milvus dengan pip install -qU langchain-milvus untuk menggunakan integrasi ini.

$ pip install -qU  langchain_milvus

Versi terbaru dari pymilvus dilengkapi dengan basis data vektor lokal Milvus Lite, yang bagus untuk pembuatan prototipe. Jika Anda memiliki data berskala besar seperti lebih dari satu juta dokumen, kami sarankan untuk menyiapkan server Milvus yang lebih berkinerja tinggi di docker atau kubernetes.

Inisialisasi

from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
from langchain_milvus import Milvus

# The easiest way is to use Milvus Lite where everything is stored in a local file.
# If you have a Milvus server you can use the server URI such as "http://localhost:19530".
URI = "./milvus_example.db"

vector_store = Milvus(
    embedding_function=embeddings,
    connection_args={"uri": URI},
)

Mengelompokkan data dengan Koleksi Milvus

Anda dapat menyimpan dokumen yang berbeda yang tidak terkait dalam koleksi yang berbeda dalam instance Milvus yang sama untuk mempertahankan konteksnya

Berikut ini cara membuat koleksi penyimpanan vektor baru dari dokumen:

from langchain_core.documents import Document

vector_store_saved = Milvus.from_documents(
    [Document(page_content="foo!")],
    embeddings,
    collection_name="langchain_example",
    connection_args={"uri": URI},
)

Dan berikut ini adalah cara Anda mengambil koleksi yang tersimpan

vector_store_loaded = Milvus(
    embeddings,
    connection_args={"uri": URI},
    collection_name="langchain_example",
)

Mengelola penyimpanan vektor

Setelah Anda membuat penyimpanan vektor, kita dapat berinteraksi dengannya dengan menambahkan dan menghapus item yang berbeda.

Menambahkan item ke penyimpanan vektor

Kita dapat menambahkan item ke penyimpanan vektor dengan menggunakan fungsi add_documents.

from uuid import uuid4

from langchain_core.documents import Document

document_1 = Document(
    page_content="I had chocalate chip pancakes and scrambled eggs for breakfast this morning.",
    metadata={"source": "tweet"},
)

document_2 = Document(
    page_content="The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.",
    metadata={"source": "news"},
)

document_3 = Document(
    page_content="Building an exciting new project with LangChain - come check it out!",
    metadata={"source": "tweet"},
)

document_4 = Document(
    page_content="Robbers broke into the city bank and stole $1 million in cash.",
    metadata={"source": "news"},
)

document_5 = Document(
    page_content="Wow! That was an amazing movie. I can't wait to see it again.",
    metadata={"source": "tweet"},
)

document_6 = Document(
    page_content="Is the new iPhone worth the price? Read this review to find out.",
    metadata={"source": "website"},
)

document_7 = Document(
    page_content="The top 10 soccer players in the world right now.",
    metadata={"source": "website"},
)

document_8 = Document(
    page_content="LangGraph is the best framework for building stateful, agentic applications!",
    metadata={"source": "tweet"},
)

document_9 = Document(
    page_content="The stock market is down 500 points today due to fears of a recession.",
    metadata={"source": "news"},
)

document_10 = Document(
    page_content="I have a bad feeling I am going to get deleted :(",
    metadata={"source": "tweet"},
)

documents = [
    document_1,
    document_2,
    document_3,
    document_4,
    document_5,
    document_6,
    document_7,
    document_8,
    document_9,
    document_10,
]
uuids = [str(uuid4()) for _ in range(len(documents))]

vector_store.add_documents(documents=documents, ids=uuids)
['b0248595-2a41-4f6b-9c25-3a24c1278bb3',
 'fa642726-5329-4495-a072-187e948dd71f',
 '9905001c-a4a3-455e-ab94-72d0ed11b476',
 'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5',
 '7508f7ff-c0c9-49ea-8189-634f8a0244d8',
 '2e179609-3ff7-4c6a-9e05-08978903fe26',
 'fab1f2ac-43e1-45f9-b81b-fc5d334c6508',
 '1206d237-ee3a-484f-baf2-b5ac38eeb314',
 'd43cbf9a-a772-4c40-993b-9439065fec01',
 '25e667bb-6f09-4574-a368-661069301906']

Menghapus item dari penyimpanan vektor

vector_store.delete(ids=[uuids[-1]])
(insert count: 0, delete count: 1, upsert count: 0, timestamp: 0, success count: 0, err count: 0, cost: 0)

Menanyakan penyimpanan vektor

Setelah penyimpanan vektor anda dibuat dan dokumen-dokumen yang relevan telah ditambahkan, kemungkinan besar anda ingin menanyakannya selama menjalankan rantai atau agen anda.

Menanyakan secara langsung

Melakukan pencarian kemiripan sederhana dengan pemfilteran pada metadata dapat dilakukan sebagai berikut:

results = vector_store.similarity_search(
    "LangChain provides abstractions to make working with LLMs easy",
    k=2,
    expr='source == "tweet"',
)
for res in results:
    print(f"* {res.page_content} [{res.metadata}]")
* Building an exciting new project with LangChain - come check it out! [{'pk': '9905001c-a4a3-455e-ab94-72d0ed11b476', 'source': 'tweet'}]
* LangGraph is the best framework for building stateful, agentic applications! [{'pk': '1206d237-ee3a-484f-baf2-b5ac38eeb314', 'source': 'tweet'}]

Pencarian kemiripan dengan skor

Anda juga dapat mencari dengan skor:

results = vector_store.similarity_search_with_score(
    "Will it be hot tomorrow?", k=1, expr='source == "news"'
)
for res, score in results:
    print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")
* [SIM=21192.628906] bar [{'pk': '2', 'source': 'https://example.com'}]

Untuk daftar lengkap semua opsi pencarian yang tersedia saat menggunakan penyimpanan vektor Milvus, Anda dapat mengunjungi referensi API.

Kueri dengan mengubah menjadi retriever

Anda juga dapat mengubah penyimpanan vektor menjadi retriever untuk penggunaan yang lebih mudah di dalam rantai Anda.

retriever = vector_store.as_retriever(search_type="mmr", search_kwargs={"k": 1})
retriever.invoke("Stealing from the bank is a crime", filter={"source": "news"})
[Document(metadata={'pk': 'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5', 'source': 'news'}, page_content='Robbers broke into the city bank and stole $1 million in cash.')]

Penggunaan untuk Pengambilan-Pembangkitan yang Ditambah

Untuk panduan tentang cara menggunakan penyimpanan vektor ini untuk pembuatan retrieval-augmented (RAG), lihat panduan RAG ini.

Pengambilan Per-Pengguna

Ketika membuat aplikasi pengambilan, Anda sering kali harus membuatnya dengan mempertimbangkan banyak pengguna. Ini berarti Anda mungkin menyimpan data tidak hanya untuk satu pengguna, tetapi untuk banyak pengguna yang berbeda, dan mereka seharusnya tidak dapat melihat data satu sama lain.

Milvus merekomendasikan penggunaan partition_key untuk mengimplementasikan multi-tenancy, berikut ini contohnya.

Fitur Partition key saat ini tidak tersedia di Milvus Lite, jika Anda ingin menggunakannya, Anda harus memulai server Milvus dari docker atau kubernetes.

from langchain_core.documents import Document

docs = [
    Document(page_content="i worked at kensho", metadata={"namespace": "harrison"}),
    Document(page_content="i worked at facebook", metadata={"namespace": "ankush"}),
]
vectorstore = Milvus.from_documents(
    docs,
    embeddings,
    connection_args={"uri": URI},
    drop_old=True,
    partition_key_field="namespace",  # Use the "namespace" field as the partition key
)

Untuk melakukan pencarian menggunakan kunci partisi, Anda harus menyertakan salah satu dari yang berikut ini dalam ekspresi boolean permintaan pencarian:

search_kwargs={"expr": '<partition_key> == "xxxx"'}

search_kwargs={"expr": '<partition_key> == in ["xxx", "xxx"]'}

Ganti <partition_key> dengan nama bidang yang ditunjuk sebagai kunci partisi.

Milvus mengubah partisi berdasarkan kunci partisi yang ditentukan, memfilter entitas berdasarkan kunci partisi, dan mencari di antara entitas yang difilter.

# This will only get documents for Ankush
vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "ankush"'}).invoke(
    "where did i work?"
)
[Document(page_content='i worked at facebook', metadata={'namespace': 'ankush'})]
# This will only get documents for Harrison
vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "harrison"'}).invoke(
    "where did i work?"
)
[Document(page_content='i worked at kensho', metadata={'namespace': 'harrison'})]

Referensi API

Untuk dokumentasi rinci dari semua fitur dan konfigurasi __ModuleName__VectorStore, kunjungi referensi API: https://python.langchain.com/api_reference/milvus/vectorstores/langchain_milvus.vectorstores.milvus.Milvus.html

Coba Milvus yang Dikelola secara Gratis

Zilliz Cloud bebas masalah, didukung oleh Milvus dan 10x lebih cepat.

Mulai
Umpan balik

Apakah halaman ini bermanfaat?