Xata는 PostgreSQL 기반의 서버리스 데이터 플랫폼입니다. 데이터베이스와 상호작용하기 위한 Python SDK와 데이터 관리를 위한 UI를 제공합니다. Xata는 네이티브 vector type을 가지고 있으며, 이는 모든 테이블에 추가할 수 있고 유사도 검색을 지원합니다. LangChain은 vector를 Xata에 직접 삽입하고, 주어진 vector의 최근접 이웃을 쿼리하므로, 모든 LangChain Embeddings 통합을 Xata와 함께 사용할 수 있습니다.
이 노트북은 Xata를 VectorStore로 사용하는 방법을 안내합니다.

Setup

vector store로 사용할 데이터베이스 생성하기

Xata UI에서 새 데이터베이스를 생성합니다. 원하는 이름을 지정할 수 있지만, 이 노트북에서는 langchain을 사용합니다. 테이블을 생성합니다. 역시 원하는 이름을 지정할 수 있지만, 여기서는 vectors를 사용합니다. UI를 통해 다음 컬럼들을 추가합니다:
  • content - “Text” type. Document.pageContent 값을 저장하는 데 사용됩니다.
  • embedding - “Vector” type. 사용할 모델의 dimension을 사용합니다. 이 노트북에서는 1536 dimension을 가진 OpenAI embeddings를 사용합니다.
  • source - “Text” type. 이 예제에서 metadata 컬럼으로 사용됩니다.
  • metadata로 사용하려는 다른 컬럼들. 이들은 Document.metadata 객체로부터 채워집니다. 예를 들어, Document.metadata 객체에 title 속성이 있다면, 테이블에 title 컬럼을 생성하면 자동으로 채워집니다.
먼저 의존성을 설치해봅시다:
pip install -qU  xata langchain-openai langchain-community tiktoken langchain
OpenAI key를 환경에 로드해봅시다. 키가 없다면 OpenAI 계정을 생성하고 이 페이지에서 키를 생성할 수 있습니다.
import getpass
import os

if "OPENAI_API_KEY" not in os.environ:
    os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
마찬가지로, Xata를 위한 환경 변수를 가져와야 합니다. 계정 설정을 방문하여 새 API key를 생성할 수 있습니다. database URL을 찾으려면, 생성한 데이터베이스의 Settings 페이지로 이동하세요. database URL은 다음과 같은 형태여야 합니다: https://demo-uni3q8.eu-west-1.xata.sh/db/langchain.
api_key = getpass.getpass("Xata API key: ")
db_url = input("Xata database URL (copy it from your DB settings):")
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores.xata import XataVectorStore
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

Xata vector store 생성하기

테스트 데이터셋을 import 해봅시다:
loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()
이제 Xata 테이블을 기반으로 실제 vector store를 생성합니다.
vector_store = XataVectorStore.from_documents(
    docs, embeddings, api_key=api_key, db_url=db_url, table_name="vectors"
)
위 명령을 실행한 후, Xata UI로 이동하면 embeddings와 함께 로드된 문서들을 볼 수 있습니다. 이미 vector 콘텐츠를 포함하고 있는 기존 Xata 테이블을 사용하려면, XataVectorStore constructor를 초기화하세요:
vector_store = XataVectorStore(
    api_key=api_key, db_url=db_url, embedding=embeddings, table_name="vectors"
)
query = "What did the president say about Ketanji Brown Jackson"
found_docs = vector_store.similarity_search(query)
print(found_docs)

score를 포함한 Similarity Search (vector distance)

query = "What did the president say about Ketanji Brown Jackson"
result = vector_store.similarity_search_with_score(query)
for doc, score in result:
    print(f"document={doc}, score={score}")

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