AlloyDB는 고성능, 원활한 통합 및 인상적인 확장성을 제공하는 완전 관리형 관계형 데이터베이스 서비스입니다. AlloyDB는 PostgreSQL과 100% 호환됩니다. AlloyDB의 LangChain 통합을 활용하여 AI 기반 경험을 구축하도록 데이터베이스 애플리케이션을 확장하세요.
이 노트북은 AlloyDBVectorStore 클래스를 사용하여 AlloyDB for PostgreSQL에 vector embedding을 저장하는 방법을 다룹니다. GitHub에서 패키지에 대해 자세히 알아보세요. Open In Colab

시작하기 전에

이 노트북을 실행하려면 다음을 수행해야 합니다:

🦜🔗 라이브러리 설치

통합 라이브러리인 langchain-google-alloydb-pg와 embedding 서비스용 라이브러리인 langchain-google-vertexai를 설치합니다.
pip install -qU  langchain-google-alloydb-pg langchain-google-vertexai
Colab 전용: 다음 셀의 주석을 해제하여 커널을 재시작하거나 버튼을 사용하여 커널을 재시작하세요. Vertex AI Workbench의 경우 상단의 버튼을 사용하여 터미널을 재시작할 수 있습니다.
# # Automatically restart kernel after installs so that your environment can access the new packages
# import IPython

# app = IPython.Application.instance()
# app.kernel.do_shutdown(True)

🔐 인증

Google Cloud Project에 액세스하기 위해 이 노트북에 로그인한 IAM 사용자로 Google Cloud에 인증합니다.
  • Colab을 사용하여 이 노트북을 실행하는 경우 아래 셀을 사용하고 계속 진행하세요.
  • Vertex AI Workbench를 사용하는 경우 여기에서 설정 지침을 확인하세요.
from google.colab import auth

auth.authenticate_user()

☁ Google Cloud Project 설정

이 노트북 내에서 Google Cloud 리소스를 활용할 수 있도록 Google Cloud 프로젝트를 설정합니다. 프로젝트 ID를 모르는 경우 다음을 시도해보세요:
  • gcloud config list를 실행합니다.
  • gcloud projects list를 실행합니다.
  • 지원 페이지를 참조하세요: 프로젝트 ID 찾기.
# @markdown Please fill in the value below with your Google Cloud project ID and then run the cell.

PROJECT_ID = "my-project-id"  # @param {type:"string"}

# Set the project id
!gcloud config set project {PROJECT_ID}

기본 사용법

AlloyDB 데이터베이스 값 설정

AlloyDB Instances 페이지에서 데이터베이스 값을 찾으세요.
# @title Set Your Values Here { display-mode: "form" }
REGION = "us-central1"  # @param {type: "string"}
CLUSTER = "my-cluster"  # @param {type: "string"}
INSTANCE = "my-primary"  # @param {type: "string"}
DATABASE = "my-database"  # @param {type: "string"}
TABLE_NAME = "vector_store"  # @param {type: "string"}

AlloyDBEngine Connection Pool

AlloyDB를 vector store로 설정하기 위한 요구 사항 및 인수 중 하나는 AlloyDBEngine 객체입니다. AlloyDBEngine은 AlloyDB 데이터베이스에 대한 connection pool을 구성하여 애플리케이션에서 성공적인 연결을 가능하게 하고 업계 모범 사례를 따릅니다. AlloyDBEngine.from_instance()를 사용하여 AlloyDBEngine을 생성하려면 다음 5가지만 제공하면 됩니다:
  1. project_id : AlloyDB 인스턴스가 위치한 Google Cloud Project의 Project ID.
  2. region : AlloyDB 인스턴스가 위치한 Region.
  3. cluster: AlloyDB 클러스터의 이름.
  4. instance : AlloyDB 인스턴스의 이름.
  5. database : AlloyDB 인스턴스에서 연결할 데이터베이스의 이름.
기본적으로 IAM 데이터베이스 인증이 데이터베이스 인증 방법으로 사용됩니다. 이 라이브러리는 환경에서 가져온 Application Default Credentials (ADC)에 속한 IAM principal을 사용합니다. 선택적으로, 사용자 이름과 비밀번호를 사용하여 AlloyDB 데이터베이스에 액세스하는 기본 제공 데이터베이스 인증도 사용할 수 있습니다. AlloyDBEngine.from_instance()에 선택적 userpassword 인수를 제공하기만 하면 됩니다:
  • user : 기본 제공 데이터베이스 인증 및 로그인에 사용할 데이터베이스 사용자
  • password : 기본 제공 데이터베이스 인증 및 로그인에 사용할 데이터베이스 비밀번호.
참고: 이 튜토리얼은 async 인터페이스를 보여줍니다. 모든 async 메서드에는 해당하는 sync 메서드가 있습니다.
from langchain_google_alloydb_pg import AlloyDBEngine

engine = await AlloyDBEngine.afrom_instance(
    project_id=PROJECT_ID,
    region=REGION,
    cluster=CLUSTER,
    instance=INSTANCE,
    database=DATABASE,
)

테이블 초기화

AlloyDBVectorStore 클래스는 데이터베이스 테이블이 필요합니다. AlloyDBEngine 엔진에는 적절한 스키마로 테이블을 생성하는 데 사용할 수 있는 헬퍼 메서드 init_vectorstore_table()이 있습니다.
await engine.ainit_vectorstore_table(
    table_name=TABLE_NAME,
    vector_size=768,  # Vector size for VertexAI model(textembedding-gecko@latest)
)

embedding 클래스 인스턴스 생성

모든 LangChain embeddings 모델을 사용할 수 있습니다. VertexAIEmbeddings를 사용하려면 Vertex AI API를 활성화해야 할 수 있습니다. 프로덕션 환경에서는 embedding 모델의 버전을 설정하는 것이 좋습니다. Text embeddings 모델에 대해 자세히 알아보세요.
# enable Vertex AI API
!gcloud services enable aiplatform.googleapis.com
from langchain_google_vertexai import VertexAIEmbeddings

embedding = VertexAIEmbeddings(
    model_name="textembedding-gecko@latest", project=PROJECT_ID
)

기본 AlloyDBVectorStore 초기화

from langchain_google_alloydb_pg import AlloyDBVectorStore

store = await AlloyDBVectorStore.create(
    engine=engine,
    table_name=TABLE_NAME,
    embedding_service=embedding,
)

텍스트 추가

import uuid

all_texts = ["Apples and oranges", "Cars and airplanes", "Pineapple", "Train", "Banana"]
metadatas = [{"len": len(t)} for t in all_texts]
ids = [str(uuid.uuid4()) for _ in all_texts]

await store.aadd_texts(all_texts, metadatas=metadatas, ids=ids)

텍스트 삭제

await store.adelete([ids[1]])

문서 검색

query = "I'd like a fruit."
docs = await store.asimilarity_search(query)
print(docs)

vector로 문서 검색

query_vector = embedding.embed_query(query)
docs = await store.asimilarity_search_by_vector(query_vector, k=2)
print(docs)

Index 추가

vector index를 적용하여 vector 검색 쿼리 속도를 높입니다. vector indexes에 대해 자세히 알아보세요.
from langchain_google_alloydb_pg.indexes import IVFFlatIndex

index = IVFFlatIndex()
await store.aapply_vector_index(index)

재인덱싱

await store.areindex()  # Re-index using default index name

index 제거

await store.adrop_vector_index()  # Delete index using default name

사용자 정의 Vector Store 생성

Vector Store는 관계형 데이터를 활용하여 유사도 검색을 필터링할 수 있습니다. 사용자 정의 metadata 컬럼이 있는 테이블을 생성합니다.
from langchain_google_alloydb_pg import Column

# Set table name
TABLE_NAME = "vectorstore_custom"

await engine.ainit_vectorstore_table(
    table_name=TABLE_NAME,
    vector_size=768,  # VertexAI model: textembedding-gecko@latest
    metadata_columns=[Column("len", "INTEGER")],
)


# Initialize AlloyDBVectorStore
custom_store = await AlloyDBVectorStore.create(
    engine=engine,
    table_name=TABLE_NAME,
    embedding_service=embedding,
    metadata_columns=["len"],
    # Connect to a existing VectorStore by customizing the table schema:
    # id_column="uuid",
    # content_column="documents",
    # embedding_column="vectors",
)

metadata 필터로 문서 검색

import uuid

# Add texts to the Vector Store
all_texts = ["Apples and oranges", "Cars and airplanes", "Pineapple", "Train", "Banana"]
metadatas = [{"len": len(t)} for t in all_texts]
ids = [str(uuid.uuid4()) for _ in all_texts]
await store.aadd_texts(all_texts, metadatas=metadatas, ids=ids)

# Use filter on search
docs = await custom_store.asimilarity_search_by_vector(query_vector, filter="len >= 6")

print(docs)

Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.
I