All Products
Search
Document Center

AnalyticDB:quick start for building rag applications using openapi

Last Updated:Mar 30, 2026

This guide walks you through building a retrieval-augmented generation (RAG) application with AnalyticDB for PostgreSQL (ADBPG) using its OpenAPI and Python SDK. By the end, you will have a working pipeline that ingests documents, retrieves relevant chunks by vector or full-text search, and returns grounded answers through LangChain.

How it works

AnalyticDB for PostgreSQL uses its self-developed FastANN vector engine to power RAG workflows. Its OpenAPI encapsulates the full AI service stack:

  • Document processing: load, split, embed, and handle multi-modal content

  • Search: vector search, full-text index, and reranking

  • Multi-tenant management: isolate data by namespace

The RAG architecture connects an information retrieval system to a large language model (LLM), grounding model responses in your own documents.

RAG architecture diagram

Workflow overview

This guide covers the following steps in order:

Step Task Description
1 Create an instance Provision an ADBPG instance with the vector engine enabled
2 Create an initial account Set up a privileged database account
3 Set up the development environment Install the Python SDK and configure environment variables
4 Prepare the database environment Initialize the vector database, create a namespace, and create a document collection
5 Manage documents Upload documents and monitor processing jobs
6 Retrieve content Query the knowledge base by vector search or full-text index
7 Integrate LangChain Connect the retrieval layer to an LLM for question answering

Prerequisites

Before you begin, ensure that you have:

The first time you use AnalyticDB for PostgreSQL, you must authorize the creation of a service-linked role. Log on to the AnalyticDB for PostgreSQL console, click Create Instance in the upper-right corner, and click OK in the Create Service Linked Role dialog.

Billing

Creating an instance incurs charges for compute and storage resources. For pricing details, see Pricing.

Free trial: Alibaba Cloud offers a free trial for Storage-elastic Mode instances to new users. Visit Alibaba Cloud Free Trial to apply. If you are not eligible, follow the steps below to create a pay-as-you-go instance.

Step 1: Create an instance

  1. Log on to the AnalyticDB for PostgreSQL console.

  2. In the upper-right corner, click Create Instance to open the purchase page.

  3. Configure the following parameters. Keep the default values for other parameters. For full parameter descriptions, see Create an instance.

Parameter Description Example
Product type Select Pay-as-you-go for short-term use (billed hourly). Select Subscription for long-term use (pay upfront at a discount). Pay-as-you-go
Region and zone The geographic location of the instance. Must match the region of any ECS instances you want to connect to over the internal network. Cannot be changed after creation. China (Hangzhou): Zone J
Instance resource type Elastic Storage Mode: supports independent disk scale-out. Serverless Pro: specify only compute resources without reserving storage. Elastic Storage Mode
Database engine version Select 7.0 Standard Edition for the richest feature set. 6.0 Standard Edition is also supported. 7.0 Standard Edition
Instance edition High-performance (Basic Edition): suitable for most business analytics. High-availability Edition: recommended for core business services. High-performance (Basic Edition)
Vector engine optimization Select Enable to activate the FastANN vector engine required for RAG workloads. Enable
Virtual Private Cloud Select the VPC ID. To connect to an ECS instance over the internal network, select the same VPC. vpc-xxxx
vSwitch Select a vSwitch in the VPC. If none are available in the current zone, switch zones or create a new vSwitch. vsw-xxxx
  1. Click Buy Now, confirm the order, and click Activate Now.

  2. After payment, click Management Console to view the instance list.

Instance initialization takes a few minutes. Wait for the instance status to change to Running before proceeding.

Step 2: Create an initial account

Important

AnalyticDB for PostgreSQL has two user types:

  • Privileged user: the initial account with the RDS_SUPERUSER role, which grants full operational permissions on the database.

  • Regular user: no permissions by default. A privileged user must explicitly grant permissions. See Create and manage users.

  1. In the left navigation pane, click Account Management.

  2. Click Create Account. In the Create Account window, configure the following parameters and click OK.

Parameter Requirements
Account Lowercase letters, digits, and underscores (_). Must start with a lowercase letter and end with a lowercase letter or digit. Cannot start with gp. Length: 2–16 characters.
New password and Confirm password At least three of: uppercase letters, lowercase letters, digits, and special characters (! @ # $ % ^ & * ( ) _ + - =). Length: 8–32 characters.
Important

Change your password regularly and avoid reusing old passwords.

Step 3: Set up the development environment

Check the Python environment

This guide uses Python 3. Run the following commands to verify that Python 3.9 or later and pip are installed.

python -V
pip --version

If Python is not installed or the version doesn't meet the requirements, install Python.

Install the SDK

Install the alibabacloud_gpdb20160503 and alibabacloud_tea_openapi packages:

pip install --upgrade alibabacloud_gpdb20160503 alibabacloud_tea_openapi

Configure environment variables

Store your credentials and instance details as environment variables to avoid hardcoding sensitive information.

Linux and macOS

  1. Open ~/.bashrc (or ~/.bash_profile on macOS):

    vim ~/.bashrc
  2. Add the following lines. Get your AccessKey ID and Secret from the RAM User List page. Get the instance ID and region from the AnalyticDB for PostgreSQL console.

    export ALIBABA_CLOUD_ACCESS_KEY_ID="<your-access-key-id>"
    export ALIBABA_CLOUD_ACCESS_KEY_SECRET="<your-access-key-secret>"
    export ADBPG_INSTANCE_ID="<your-instance-id>"        # e.g., gp-bp166cyrtr4p*****
    export ADBPG_INSTANCE_REGION="<your-region-id>"      # e.g., cn-hangzhou
  3. Save and exit (press Esc, then type :wq), then apply the changes:

    source ~/.bashrc

    On macOS, run source ~/.bash_profile.

Windows

Run the following commands in CMD to set environment variables for the current session:

set ALIBABA_CLOUD_ACCESS_KEY_ID=<your-access-key-id>
set ALIBABA_CLOUD_ACCESS_KEY_SECRET=<your-access-key-secret>
set ADBPG_INSTANCE_ID=<your-instance-id>
set ADBPG_INSTANCE_REGION=<your-region-id>

Step 4: Prepare the database environment

This step initializes the vector database, creates a namespace, and creates a document collection to store chunked text and vector data.

What this step does:

  1. Build a client — authenticates with the ADBPG API

  2. Initialize the vector database — creates the knowledgebase database, grants read/write permissions, and sets up Chinese tokenizer and full-text index features (run once per instance)

  3. Create a namespace — a logical tenant boundary for document libraries

  4. Create a document collection — stores chunked text and vector data

Before running, replace account and account_password with your actual database account and password.

from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_gpdb20160503.client import Client
from alibabacloud_gpdb20160503 import models as gpdb_20160503_models
import os

# Read credentials and instance info from environment variables
ALIBABA_CLOUD_ACCESS_KEY_ID = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
ALIBABA_CLOUD_ACCESS_KEY_SECRET = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
ADBPG_INSTANCE_ID = os.environ['ADBPG_INSTANCE_ID']
ADBPG_INSTANCE_REGION = os.environ['ADBPG_INSTANCE_REGION']


def get_client():
    """Build and return an AnalyticDB for PostgreSQL API client."""
    config = open_api_models.Config(
        access_key_id=ALIBABA_CLOUD_ACCESS_KEY_ID,
        access_key_secret=ALIBABA_CLOUD_ACCESS_KEY_SECRET
    )
    config.region_id = ADBPG_INSTANCE_REGION
    # Shared endpoint for major Chinese mainland regions and Singapore
    if ADBPG_INSTANCE_REGION in ("cn-beijing", "cn-hangzhou", "cn-shanghai", "cn-shenzhen", "cn-hongkong",
                                 "ap-southeast-1"):
        config.endpoint = "gpdb.aliyuncs.com"
    else:
        config.endpoint = f'gpdb.{ADBPG_INSTANCE_REGION}.aliyuncs.com'
    return Client(config)


def init_vector_database(account, account_password):
    """Initialize the vector database. Run once per instance."""
    request = gpdb_20160503_models.InitVectorDatabaseRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        manager_account=account,
        manager_account_password=account_password
    )
    response = get_client().init_vector_database(request)
    print(f"init_vector_database response code: {response.status_code}, body:{response.body}")


def create_namespace(account, account_password, namespace, namespace_password):
    """Create a namespace (tenant boundary) for document libraries."""
    request = gpdb_20160503_models.CreateNamespaceRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        manager_account=account,
        manager_account_password=account_password,
        namespace=namespace,
        namespace_password=namespace_password
    )
    response = get_client().create_namespace(request)
    print(f"create_namespace response code: {response.status_code}, body:{response.body}")


def create_document_collection(account,
                               account_password,
                               namespace,
                               collection,
                               metadata: str = None,
                               full_text_retrieval_fields: str = None,
                               parser: str = None,
                               embedding_model: str = None,
                               metrics: str = None,
                               hnsw_m: int = None,
                               pq_enable: int = None,
                               external_storage: int = None):
    """Create a document collection to store chunked text and vector data."""
    request = gpdb_20160503_models.CreateDocumentCollectionRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        manager_account=account,
        manager_account_password=account_password,
        namespace=namespace,
        collection=collection,
        metadata=metadata,
        full_text_retrieval_fields=full_text_retrieval_fields,
        parser=parser,
        embedding_model=embedding_model,
        metrics=metrics,
        hnsw_m=hnsw_m,
        pq_enable=pq_enable,
        external_storage=external_storage
    )
    response = get_client().create_document_collection(request)
    print(f"create_document_collection response code: {response.status_code}, body:{response.body}")


if __name__ == '__main__':
    account = "testacc"                      # Initial database account
    account_password = "Test1234"            # Password for the initial account
    namespace = "ns1"                        # Namespace name
    namespace_password = "ns1password"       # Namespace password (used for data read/write operations)
    collection = "dc1"                       # Document collection name
    metadata = '{"title":"text", "page":"int"}'
    full_text_retrieval_fields = "title"
    embedding_model = "m3e-small"            # See Embedding models for supported options

    init_vector_database(account, account_password)
    create_namespace(account, account_password, namespace, namespace_password)
    create_document_collection(account, account_password, namespace, collection,
                               metadata=metadata,
                               full_text_retrieval_fields=full_text_retrieval_fields,
                               embedding_model=embedding_model)

Parameters

Parameter Description
account The initial database account of the AnalyticDB for PostgreSQL instance.
account_password The password for the initial account.
namespace The name of the namespace to create.
namespace_password The namespace password, used for subsequent data read and write operations.
collection The name of the document collection to create.
metadata Custom map-structured metadata. The key is the field name and the value is the field type.
full_text_retrieval_fields Comma-separated fields for full-text indexing. Fields must be keys defined in metadata.
parser Tokenizer for the full-text index. Default: zh_cn.
embedding_model The embedding model. See Embedding models for supported options.
metrics The vector index similarity algorithm. See Vector index for supported values.
hnsw_m Maximum number of neighbors in the HNSW algorithm. Range: 1–1000.
pq_enable Whether to enable product quantization (PQ) dimensionality reduction. 0: disabled. 1: enabled.
external_storage Whether to use mmap to build the HNSW index. 0: segment-page storage (default). 1: mmap.
Note

Supported in version 6.0 only; not supported in version 7.0.

Verify the table schema

After the code runs successfully, verify the result by logging on to the database:

  1. Go to the AnalyticDB for PostgreSQL console and open the target instance.

  2. Click Log On to Database in the upper-right corner.

  3. On the Log on to Instance page, enter your database account and password, then click Log on.

A new database named knowledgebase appears in the instance. Within it, a schema named ns1 is created, and a table named dc1 is created under that schema. The table has the following fields:

Field Type Source Description
id text Fixed Primary key. The UUID of a single text chunk.
vector real[] Fixed Vector data array. Length matches the dimensions of the selected embedding model.
doc_name text Fixed Document name.
content text Fixed A single text chunk produced by the document loader and splitter.
loader_metadata json Fixed Metadata from the document loader.
to_tsvector TSVECTOR Fixed Full-text index data. Sources: the content field and any fields specified in full_text_retrieval_fields. In this example, both content and title are indexed.
title text Metadata User-defined.
page int Metadata User-defined.

Step 5: Manage documents

Upload a document

This example uploads a local document asynchronously. The upload job performs document loading, splitting, embedding, and storage.

import time
import io
from typing import Dict, List, Any
from alibabacloud_tea_util import models as util_models
from alibabacloud_gpdb20160503 import models as gpdb_20160503_models

def upload_document_async(
        namespace,
        namespace_password,
        collection,
        file_name,
        file_path,
        metadata: Dict[str, Any] = None,
        chunk_overlap: int = None,
        chunk_size: int = None,
        document_loader_name: str = None,
        text_splitter_name: str = None,
        dry_run: bool = None,
        zh_title_enhance: bool = None,
        separators: List[str] = None):
    with open(file_path, 'rb') as f:
        file_content_bytes = f.read()
    request = gpdb_20160503_models.UploadDocumentAsyncAdvanceRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        namespace=namespace,
        namespace_password=namespace_password,
        collection=collection,
        file_name=file_name,
        metadata=metadata,
        chunk_overlap=chunk_overlap,
        chunk_size=chunk_size,
        document_loader_name=document_loader_name,
        file_url_object=io.BytesIO(file_content_bytes),
        text_splitter_name=text_splitter_name,
        dry_run=dry_run,
        zh_title_enhance=zh_title_enhance,
        separators=separators,
    )
    response = get_client().upload_document_async_advance(request, util_models.RuntimeOptions())
    print(f"upload_document_async response code: {response.status_code}, body:{response.body}")
    return response.body.job_id


def wait_upload_document_job(namespace, namespace_password, collection, job_id):
    def job_ready():
        request = gpdb_20160503_models.GetUploadDocumentJobRequest(
            region_id=ADBPG_INSTANCE_REGION,
            dbinstance_id=ADBPG_INSTANCE_ID,
            namespace=namespace,
            namespace_password=namespace_password,
            collection=collection,
            job_id=job_id,
        )
        response = get_client().get_upload_document_job(request)
        print(f"get_upload_document_job response code: {response.status_code}, body:{response.body}")
        return response.body.job.completed
    while True:
        if job_ready():
            print("successfully load document")
            break
        time.sleep(2)


if __name__ == '__main__':
    job_id = upload_document_async("ns1", "Ns1password", "dc1",
                                   "test.pdf", "/root/test.pdf")
    wait_upload_document_job("ns1", "Ns1password", "dc1", job_id)

Parameters

Parameter Description
namespace The name of the namespace where the document collection resides.
namespace_password The namespace password.
collection The document collection name.
file_name The document name, including the file extension.
file_path The local document path. Maximum file size: 200 MB.
metadata Document metadata. Must match the metadata defined when creating the document collection.
chunk_overlap The amount of overlapping data between consecutive chunks. Cannot exceed chunk_size.
chunk_size The size of each chunk. Maximum: 2048.
document_loader_name The document loader. Auto-selected from the file extension if not specified. See Document loaders.
text_splitter_name The text splitter. See Document chunking.
dry_run true: parse and split only, skip vectorization and storage. false (default): parse, split, vectorize, and store.
zh_title_enhance true: enable Chinese title enhancement. false: disable.
separators Custom separators for chunking. Leave blank in most cases.

More document operations

List documents

def list_documents(namespace, namespace_password, collection):
    request = gpdb_20160503_models.ListDocumentsRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        namespace=namespace,
        namespace_password=namespace_password,
        collection=collection,
    )
    response = get_client().list_documents(request)
    print(f"list_documents response code: {response.status_code}, body:{response.body}")


if __name__ == '__main__':
    list_documents("ns1", "Ns1password", "dc1")

Get document details

def describe_document(namespace, namespace_password, collection, file_name):
    request = gpdb_20160503_models.DescribeDocumentRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        namespace=namespace,
        namespace_password=namespace_password,
        collection=collection,
        file_name=file_name
    )
    response = get_client().describe_document(request)
    print(f"describe_document response code: {response.status_code}, body:{response.body}")


if __name__ == '__main__':
    describe_document("ns1", "Ns1password", "dc1", "test.pdf")

The response includes the following fields:

Field Description
DocsCount The number of chunks the document is split into.
TextSplitter The text splitter used.
DocumentLoader The document loader used.
FileExt The file extension.
FileMd5 The MD5 hash of the document.
FileMtime The latest upload time.
FileSize The file size in bytes.
FileVersion The document version (integer). Increments each time the document is uploaded or updated.

Delete a document

def delete_document(namespace, namespace_password, collection, file_name):
    request = gpdb_20160503_models.DeleteDocumentRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        namespace=namespace,
        namespace_password=namespace_password,
        collection=collection,
        file_name=file_name
    )
    response = get_client().delete_document(request)
    print(f"delete_document response code: {response.status_code}, body:{response.body}")


if __name__ == '__main__':
    delete_document("ns1", "Ns1password", "dc1", "test.pdf")

Step 6: Retrieve content

The following example queries the document collection using plain text. ADBPG automatically converts the query to a vector and searches for similar chunks.

To compare retrieval modes, the example below shows both vector-only and hybrid retrieval side by side:

def query_content(namespace, namespace_password, collection, top_k,
                  content,
                  filter_str: str = None,
                  metrics: str = None,
                  use_full_text_retrieval: bool = None):
    request = gpdb_20160503_models.QueryContentRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        namespace=namespace,
        namespace_password=namespace_password,
        collection=collection,
        content=content,
        filter=filter_str,
        top_k=top_k,
        metrics=metrics,
        use_full_text_retrieval=use_full_text_retrieval,
    )
    response = get_client().query_content(request)
    print(f"query_content response code: {response.status_code}, body:{response.body}")


if __name__ == '__main__':
    # Vector search only (default)
    query_content('ns1', 'Ns1password', 'dc1', 10, 'What is ADBPG?')

    # Hybrid retrieval: vector search + full-text index
    query_content('ns1', 'Ns1password', 'dc1', 10, 'What is ADBPG?',
                  use_full_text_retrieval=True)

Parameters

Parameter Description
namespace The name of the namespace where the document collection resides.
namespace_password The namespace password.
collection The document collection name.
top_k The number of top results to return.
content The query text.
filter_str A filter expression to apply before retrieval.
metrics The vector distance algorithm. Leave blank to use the algorithm specified when the index was created.
use_full_text_retrieval true: enable full-text index alongside vector search. false (default): vector search only.

Response fields

Field Description
Id The UUID of the matched chunk.
FileName The source document name.
Content The matched text chunk.
LoaderMetadata Metadata generated during document upload.
Metadata User-defined metadata.
RetrievalSource The retrieval path that produced this result: 1 — vector search, 2 — full-text index, 3 — both.
Score The similarity score based on the distance algorithm.

Step 7: Integrate LangChain

LangChain is an open-source framework for building LLM-powered applications. This section shows how to wrap ADBPG's retrieval API as a LangChain retriever and build a question-answering chain.

Install dependencies

pip install --upgrade langchain openai tiktoken

Build a custom retriever

from langchain_core.retrievers import BaseRetriever
from langchain_core.callbacks import CallbackManagerForRetrieverRun
from langchain_core.documents import Document


class AdbpgRetriever(BaseRetriever):
    namespace: str = None
    namespace_password: str = None
    collection: str = None
    top_k: int = None
    use_full_text_retrieval: bool = None

    def query_content(self, content) -> List[gpdb_20160503_models.QueryContentResponseBodyMatchesMatchList]:
        request = gpdb_20160503_models.QueryContentRequest(
            region_id=ADBPG_INSTANCE_REGION,
            dbinstance_id=ADBPG_INSTANCE_ID,
            namespace=self.namespace,
            namespace_password=self.namespace_password,
            collection=self.collection,
            content=content,
            top_k=self.top_k,
            use_full_text_retrieval=self.use_full_text_retrieval,
        )
        response = get_client().query_content(request)
        return response.body.matches.match_list

    def _get_relevant_documents(
            self, query: str, *, run_manager: CallbackManagerForRetrieverRun
    ) -> List[Document]:
        match_list = self.query_content(query)
        return [Document(page_content=i.content) for i in match_list]

Build a Q&A chain

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain.schema import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

OPENAI_API_KEY = "YOUR_OPENAI_API_KEY"
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY

template = """Answer the question based only on the following context:

{context}

Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()


def format_docs(docs):
    return "\n\n".join([d.page_content for d in docs])


retriever = AdbpgRetriever(
    namespace='ns1',
    namespace_password='Ns1password',
    collection='dc1',
    top_k=10,
    use_full_text_retrieval=True
)
chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)

Run a query

chain.invoke("What is AnalyticDB PostgreSQL?")

# Response:
# AnalyticDB PostgreSQL is a cloud-native Online Analytical Processing (OLAP) service provided by Alibaba Cloud. Based on the open-source PostgreSQL database extension, it delivers a high-performance, high-capacity data warehouse solution.
# It combines PostgreSQL's flexibility and compatibility with high concurrency and high-speed query capabilities for data analytics and reporting.
#
# AnalyticDB PostgreSQL is particularly well-suited for processing large-scale datasets, supporting real-time analytics and decision support. It serves as a powerful tool for enterprises to perform data mining, business intelligence (BI), reporting, and data visualization.
# As a managed service, it simplifies data warehouse management and operations and maintenance (O&M), enabling users to focus on data analytics rather than underlying infrastructure.
# Key features include the following:
#
# High-performance analytics — Uses columnar storage and Massively Parallel Processing (MPP) architecture to quickly query and analyze large volumes of data.
# Easy scalability — Resources can be easily scaled horizontally and vertically based on data volume and query performance requirements.
# PostgreSQL compatibility — Supports PostgreSQL SQL language and most tools in the PostgreSQL ecosystem, making it easy for existing PostgreSQL users to migrate and adapt.
# Security and reliability — Provides features such as data backup, recovery, and encryption to ensure data security and reliability.
# Cloud-native integration — Tightly integrated with other Alibaba Cloud services such as data integration and data visualization tools.
# In summary, AnalyticDB PostgreSQL is a high-performance, scalable cloud data warehouse service that enables enterprises to perform complex data analytics and reporting in cloud environments.

Appendix

Full-text index

AnalyticDB for PostgreSQL supports full-text search in addition to vector similarity. Both can run together in a dual-path retrieval workflow to improve accuracy.

Define full-text index fields

Specify which fields serve as full-text index sources when creating the document collection. The content field is indexed by default. Specify additional custom metadata fields in full_text_retrieval_fields.

Tokenization

Set the parser parameter when creating the document collection. The default tokenizer is zh_cn (Chinese). For custom tokenization requirements, contact Alibaba Cloud technical support.

When a document is inserted, the tokenizer splits the specified full-text fields by delimiter and stores the result in to_tsvector for subsequent full-text queries.

Embedding models

AnalyticDB for PostgreSQL supports the following embedding models:

embedding_model Dimensions Description
m3e-small 512 From moka-ai/m3e-small. Supports Chinese only, not English.
m3e-base 768 From moka-ai/m3e-base. Supports Chinese and English.
text2vec 1024 From GanymedeNil/text2vec-large-chinese. Supports Chinese and English.
text-embedding-v1 1536 Alibaba Cloud Model Studio general text embedding. Supports Chinese and English.
text-embedding-v2 1536 Upgraded version of text-embedding-v1.
clip-vit-b-32 (multimodal) 512 Open-source multimodal model with image support.
Custom embedding models are not supported yet. For a full list of supported models, see Create a document collection.

Vector index

Parameter Description
metrics The similarity distance algorithm. l2: Euclidean distance, typically used for image similarity. ip: inverse inner product, used as a substitute for cosine similarity after vector normalization. cosine: cosine distance, typically used for text similarity.
hnsw_m The maximum number of neighbors in the HNSW algorithm. The API sets this automatically based on vector dimensions.
pq_enable Whether to enable product quantization (PQ) dimensionality reduction. 0: disabled. 1: enabled. PQ training requires at least 500,000 existing vectors; do not enable it before reaching this threshold.
external_storage Whether to use mmap to build the HNSW index. 0 (default): segment-page storage, supports shared_buffer caching, deletion, and updates. 1: mmap storage, does not support deletion or updates.
Note

Supported in version 6.0 only; not supported in version 7.0.

Document loaders

AnalyticDB for PostgreSQL automatically selects a loader based on the file extension. For document types with multiple supported loaders (such as PDF), specify one explicitly using document_loader_name.

Loader Supported formats
UnstructuredHTMLLoader .html
UnstructuredMarkdownLoader .md
PyMuPDFLoader .pdf
PyPDFLoader .pdf
RapidOCRPDFLoader .pdf
JSONLoader .json
CSVLoader .csv
RapidOCRLoader .png, .jpg, .jpeg, .bmp
UnstructuredFileLoader .eml, .msg, .rst, .txt, .xml, .docx, .epub, .odt, .pptx, .tsv

Document chunking

Chunking behavior is controlled by chunk_overlap, chunk_size, text_splitter_name, and separators. The following text splitters are supported:

Text splitter Description
ChineseRecursiveTextSplitter Inherits from RecursiveCharacterTextSplitter. Uses ["\n\n", "\n", "。|!|?", "\.\s|\!\s|\?\s", ";|;\s", ",|,\s"] as default delimiters with regex matching. Performs better than RecursiveCharacterTextSplitter for Chinese text.
SpacyTextSplitter Uses ["\n\n", "\n", " ", ""] as default separators. Supports chunking for C++, Go, Java, JavaScript, PHP, Proto, Python, RST, Ruby, Rust, Scala, Swift, Markdown, LaTeX, HTML, Solidity, and C#.
RecursiveCharacterTextSplitter Uses \n\n as the default delimiter. Uses the en_core_web_sm model from Spacy for splitting. Works well for English text.
MarkdownHeaderTextSplitter Splits Markdown files by header level: # (head1), ## (head2), ### (head3), #### (head4).

What's next