Files
wehub-resource-sync a0c8464e58
Build Package / build (ubuntu-latest) (push) Failing after 1s
CodeQL / Analyze (python) (push) Failing after 1s
Core Typecheck / core-typecheck (push) Failing after 1s
Linting / lint (push) Failing after 1s
llama-dev tests / test-llama-dev (push) Failing after 1s
Publish Sub-Package to PyPI if Needed / publish_subpackage_if_needed (push) Has been skipped
Sync Docs to Developer Hub / sync-docs (push) Failing after 0s
Build Package / build (windows-latest) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:26:52 +08:00

355 lines
9.6 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TiDB Vector Store\n",
"\n",
"> [TiDB Cloud](https://www.pingcap.com/tidb-serverless/), is a comprehensive Database-as-a-Service (DBaaS) solution, that provides dedicated and serverless options. TiDB Serverless is now integrating a built-in vector search into the MySQL landscape. With this enhancement, you can seamlessly develop AI applications using TiDB Serverless without the need for a new database or additional technical stacks. Create a free TiDB Serverless cluster and start using the vector search feature at https://pingcap.com/ai.\n",
"\n",
"This notebook provides a detailed guide on utilizing the tidb vector search in LlamaIndex."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setting up environments"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%pip install llama-index-vector-stores-tidbvector\n",
"%pip install llama-index"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import textwrap\n",
"\n",
"from llama_index.core import SimpleDirectoryReader, StorageContext\n",
"from llama_index.core import VectorStoreIndex\n",
"from llama_index.vector_stores.tidbvector import TiDBVectorStore"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Configuring your OpenAI Key"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import getpass\n",
"import os\n",
"\n",
"os.environ[\"OPENAI_API_KEY\"] = getpass.getpass(\"Input your OpenAI API key:\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Configure TiDB connection setting that you will need. To connect to your TiDB Cloud Cluster, follow these steps:\n",
"\n",
"- Go to your TiDB Cloud cluster Console and navigate to the `Connect` page.\n",
"- Select the option to connect using `SQLAlchemy` with `PyMySQL`, and copy the provided connection URL (without password).\n",
"- Paste the connection URL into your code, replacing the `tidb_connection_string_template` variable.\n",
"- Type your password."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# replace with your tidb connect string from tidb cloud console\n",
"tidb_connection_string_template = \"mysql+pymysql://<USER>:<PASSWORD>@<HOST>:4000/<DB>?ssl_ca=/etc/ssl/cert.pem&ssl_verify_cert=true&ssl_verify_identity=true\"\n",
"# type your tidb password\n",
"tidb_password = getpass.getpass(\"Input your TiDB password:\")\n",
"tidb_connection_url = tidb_connection_string_template.replace(\n",
" \"<PASSWORD>\", tidb_password\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Prepare data that used to show case"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"!mkdir -p 'data/paul_graham/'\n",
"!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Document ID: 86e12675-2e9a-4097-847c-8b981dd41806\n"
]
}
],
"source": [
"documents = SimpleDirectoryReader(\"./data/paul_graham\").load_data()\n",
"print(\"Document ID:\", documents[0].doc_id)\n",
"for index, document in enumerate(documents):\n",
" document.metadata = {\"book\": \"paul_graham\"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Create TiDB Vectore Store\n",
"\n",
"The code snippet below creates a table named `VECTOR_TABLE_NAME` in TiDB, optimized for vector searching. Upon successful execution of this code, you will be able to view and access the `VECTOR_TABLE_NAME` table directly within your TiDB database environment"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"VECTOR_TABLE_NAME = \"paul_graham_test\"\n",
"tidbvec = TiDBVectorStore(\n",
" connection_string=tidb_connection_url,\n",
" table_name=VECTOR_TABLE_NAME,\n",
" distance_strategy=\"cosine\",\n",
" vector_dimension=1536,\n",
" drop_existing_table=False,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a query engine based on tidb vectore store"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"storage_context = StorageContext.from_defaults(vector_store=tidbvec)\n",
"index = VectorStoreIndex.from_documents(\n",
" documents, storage_context=storage_context, show_progress=True\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note: If you encounter errors during this process due to the MySQL protocols packet size limitation, such as when trying to insert a large number of vectors (e.g., 2000 rows) , you can mitigate this issue by splitting the insertion into smaller batches. For example, you can set the `insert_batch_size` parameter to a smaller value (e.g., 1000) to avoid exceeding the packet size limit, ensuring smooth insertion of your data into the TiDB vector store:\n",
"\n",
"```python\n",
"storage_context = StorageContext.from_defaults(vector_store=tidbvec)\n",
"index = VectorStoreIndex.from_documents(\n",
" documents, storage_context=storage_context, insert_batch_size=1000, show_progress=True\n",
")\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Semantic similarity search\n",
"\n",
"This section focus on vector search basics and refining results using metadata filters. Please note that tidb vector only supports Deafult VectorStoreQueryMode."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The author wrote a book.\n"
]
}
],
"source": [
"query_engine = index.as_query_engine()\n",
"response = query_engine.query(\"What did the author do?\")\n",
"print(textwrap.fill(str(response), 100))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Filter with metadata\n",
"\n",
"perform searches using metadata filters to retrieve a specific number of nearest-neighbor results that align with the applied filters."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Empty Response\n"
]
}
],
"source": [
"from llama_index.core.vector_stores.types import (\n",
" MetadataFilter,\n",
" MetadataFilters,\n",
")\n",
"\n",
"query_engine = index.as_query_engine(\n",
" filters=MetadataFilters(\n",
" filters=[\n",
" MetadataFilter(key=\"book\", value=\"paul_graham\", operator=\"!=\"),\n",
" ]\n",
" ),\n",
" similarity_top_k=2,\n",
")\n",
"response = query_engine.query(\"What did the author learn?\")\n",
"print(textwrap.fill(str(response), 100))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Query again"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The author learned valuable lessons from his experiences.\n"
]
}
],
"source": [
"from llama_index.core.vector_stores.types import (\n",
" MetadataFilter,\n",
" MetadataFilters,\n",
")\n",
"\n",
"query_engine = index.as_query_engine(\n",
" filters=MetadataFilters(\n",
" filters=[\n",
" MetadataFilter(key=\"book\", value=\"paul_graham\", operator=\"==\"),\n",
" ]\n",
" ),\n",
" similarity_top_k=2,\n",
")\n",
"response = query_engine.query(\"What did the author learn?\")\n",
"print(textwrap.fill(str(response), 100))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Delete documents"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"tidbvec.delete(documents[0].doc_id)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Check whether the documents had been deleted"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Empty Response\n"
]
}
],
"source": [
"query_engine = index.as_query_engine()\n",
"response = query_engine.query(\"What did the author learn?\")\n",
"print(textwrap.fill(str(response), 100))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "llama_index",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}