WeaviateStore 통합

WeaviateStore 통합

LangChain JavaScript로 WeaviateStore와 통합해요.

Weaviate는 객체와 벡터를 모두 저장하는 오픈소스 벡터 데이터베이스로, 벡터 검색을 구조화된 필터링과 결합할 수 있게 해줘요. LangChain은 Weaviate의 공식 TypeScript 클라이언트인 weaviate-client 패키지를 통해 Weaviate에 연결해요.

이 가이드는 Weaviate 벡터 스토어 시작을 위한 빠른 개요를 제공해요. 모든 WeaviateStore 기능과 구성에 대한 자세한 문서는 API reference를 참고하세요.

개요 (Overview)

통합 세부 정보 (Integration details)

클래스 패키지 PY 지원 Downloads Version
WeaviateStore @langchain/weaviate NPM - Downloads NPM - Version

설정 (Setup)

Weaviate 벡터 스토어를 사용하려면 Weaviate 인스턴스를 설정하고, 배포에 연결하기 위해 @langchain/weaviate, @langchain/core, weaviate-client를 설치하세요.

이 가이드는 OpenAI 임베딩을 예시로 사용해요. 대신 다른 지원 임베딩 모델을 사용할 수도 있어요.

```bash npm npm install @langchain/weaviate @langchain/core weaviate-client @langchain/openai ```
yarn add @langchain/weaviate @langchain/core weaviate-client @langchain/openai
pnpm add @langchain/weaviate @langchain/core weaviate-client @langchain/openai

Weaviate를 로컬이나 서버에서 실행하세요. 자세한 내용은 Weaviate 문서를 참고하세요.

자격 증명 (Credentials)

다음 환경 변수를 설정하세요:

// If running locally, include port e.g. "localhost:8080"
process.env.WEAVIATE_URL = "YOUR_WEAVIATE_URL";
// Optional, for cloud deployments
process.env.WEAVIATE_API_KEY = "YOUR_API_KEY";

이 가이드에 OpenAI 임베딩을 사용한다면 OpenAI 키도 설정하세요:

process.env.OPENAI_API_KEY = "YOUR_API_KEY";

모델 호출의 자동 추적을 받으려면 아래 주석을 해제해 LangSmith API 키를 설정할 수도 있어요:

// process.env.LANGSMITH_TRACING="true"
// process.env.LANGSMITH_API_KEY="your-api-key"

인스턴스화 (Instantiation)

weaviate 클라이언트 연결 (Connect a weaviate client)

대부분의 경우 연결 헬퍼 함수 중 하나를 사용해 Weaviate 인스턴스에 연결해야 해요:

  • connectToWeaviateCloud
  • connectToLocal
  • connectToCustom
import { WeaviateStore } from "@langchain/weaviate";
import { OpenAIEmbeddings } from "@langchain/openai";
import weaviate, {
  dataType,
  Filters,
  generativeParameters,
  vectorizer,
} from "weaviate-client";

const embeddings = new OpenAIEmbeddings({
  model: "text-embedding-3-small",
});

const weaviateClient = await weaviate.connectToWeaviateCloud(
  process.env.WEAVIATE_URL!,
  {
    authCredentials: new weaviate.ApiKey(process.env.WEAVIATE_API_KEY || ""),
    headers: {
      "X-OpenAI-Api-Key": process.env.OPENAI_API_KEY || "",
      "X-Cohere-Api-Key": process.env.COHERE_API_KEY || "",
    },
  },
);

vectorStore 초기화 (Initiate the vectorStore)

컬렉션을 만들려면 최소한 컬렉션 이름을 지정하세요. 속성을 지정하지 않으면 auto-schema가 생성해요.

let vectorStore = new WeaviateStore(embeddings, {
  client: weaviateClient,
  indexName: "Langchainjs_test",
});

Weaviate의 named vectors, vectorizers, reranker, generative-models 등을 사용하려면 벡터 스토어를 만들 때 schema 속성을 사용하세요. schema의 컬렉션 이름과 기타 속성은 벡터 스토어 생성 시 우선 적용돼요.

vectorStore = new WeaviateStore(embeddings, {
  client: weaviateClient,
  schema: {
    name: "Langchainjs_test",
    description: "A simple dataset",
    properties: [
      {
        name: "title",
        dataType: dataType.TEXT,
      },
      {
        name: "foo",
        dataType: dataType.TEXT,
      },
    ],
    vectorizers: [
      vectorizer.text2VecOpenAI({
        name: "title",
        sourceProperties: ["title"], // (Optional) Set the source property(ies)
        // vectorIndexConfig: configure.vectorIndex.hnsw()   // (Optional) Set the vector index configuration
      }),
    ],
    generative: weaviate.configure.generative.openAI(),
    reranker: weaviate.configure.reranker.cohere(),
  },
});

벡터 스토어 관리 (Manage vector store)

벡터 스토어에 항목 추가 (Add items to vector store)

참고: 인덱싱된 문서에 id를 연결하려면 UUID여야 해요.

import type { Document } from "@langchain/core/documents";

const document1: Document = {
  pageContent: "The powerhouse of the cell is the mitochondria",
  metadata: { source: "https://example.com" }
};

const document2: Document = {
  pageContent: "Buildings are made out of brick",
  metadata: { source: "https://example.com" }
};

const document3: Document = {
  pageContent: "Mitochondria are made out of lipids",
  metadata: { source: "https://example.com" }
};

const document4: Document = {
  pageContent: "The 2024 Olympics are in Paris",
  metadata: { source: "https://example.com" }
}

const documents = [document1, document2, document3, document4];
const uuids = [crypto.randomUUID(), crypto.randomUUID(), crypto.randomUUID(), crypto.randomUUID()];

await vectorStore.addDocuments(documents, { ids: uuids });
[
  '610f9b92-9bee-473f-a4db-8f2ca6e3442d',
  '995160fa-441e-41a0-b476-cf3785518a0d',
  '0cdbe6d4-0df8-4f99-9b67-184009fee9a2',
  '18a8211c-0649-467b-a7c5-50ebb4b9ca9d'
]

벡터 스토어에서 항목 삭제 (Delete items from vector store)

ID로 또는 filter 파라미터를 전달해 삭제할 수 있어요:

await vectorStore.delete({ ids: [uuids[3]] });

벡터 스토어 쿼리 (Query vector store)

Weaviate v3에서 클라이언트는 collections와 상호작용해 데이터베이스의 객체를 다루는 것이 기본 방식이에요. collection 객체는 코드베이스 전체에서 재사용할 수 있어요.

직접 쿼리 (Query directly)

간단한 유사도 검색은 다음과 같이 수행할 수 있어요. Filter 헬퍼 클래스는 조건이 있는 필터를 더 쉽게 사용하게 해줘요. v3 클라이언트는 Filter 사용을 간소화해 코드를 더 깔끔하고 간결하게 만들어요.

Weaviate 필터 문법에 대한 자세한 내용은 이 페이지를 참고하세요.

const collection = weaviateClient.collections.use("Langchainjs_test");

const filter = Filters.and(collection.filter.byProperty("source").equal("https://example.com"))

const similaritySearchResults = await vectorStore.similaritySearch("biology", 2, filter);

for (const doc of similaritySearchResults) {
  console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);
}
* The powerhouse of the cell is the mitochondria [{"source":"https://example.com"}]
* Mitochondria are made out of lipids [{"source":"https://example.com"}]

유사도 검색을 실행하고 대응하는 점수를 받으려면 다음을 실행할 수 있어요:

const similaritySearchWithScoreResults = await vectorStore.similaritySearchWithScore("biology", 2, filter)

for (const [doc, score] of similaritySearchWithScoreResults) {
  console.log(`* [SIM=${score.toFixed(3)}] ${doc.pageContent} [${JSON.stringify(doc.metadata)}]`);
}
* [SIM=0.835] The powerhouse of the cell is the mitochondria [{"source":"https://example.com"}]
* [SIM=0.852] Mitochondria are made out of lipids [{"source":"https://example.com"}]

Weaviate에서 Hybrid search는 벡터 검색 결과와 키워드(BM25F) 검색 결과를 두 결과 집합을 융합해 결합해요. 키워드와 벡터 구성 요소의 상대적 가중치를 바꾸려면 쿼리에 alpha 값을 설정하세요.

하이브리드 검색 옵션의 전체 목록은 docs 를 확인하세요.

const results = await vectorStore.hybridSearch("biology",
  {
    limit: 1,
    alpha: 0.25,
    targetVector: ["title"],
    rerank: {
      property: "title",
      query: "greeting",
    },
});

검색 증강 생성(RAG) (Retrieval augmented generation)

검색 증강 생성(RAG)은 정보 검색을 생성형 AI 모델과 결합해요.

Weaviate에서 RAG 쿼리는 두 부분으로 구성돼요: 검색 쿼리와 모델용 프롬프트. Weaviate가 먼저 검색을 수행한 뒤, 검색 결과와 사용자 프롬프트를 모두 생성형 AI 모델에 전달해 생성된 응답을 반환해요.

  • @param query 검색할 쿼리
  • @param options 하이브리드 검색 수행을 위한 사용 가능한 옵션
  • @param generate 생성 옵션. 전체 목록은 docs 확인
const results = await vectorStore.generate("hello world",
    {
        singlePrompt: {
            prompt: "Translate this into German: {title}",
        },
        config: generativeParameters.openAI({
            model: "gpt-3.5-turbo",
        }),
    },
    {
        limit: 2,
        targetVector: ["title"],
    }
);

리트리버로 변환해 쿼리 (Query by turning into retriever)

벡터 스토어를 리트리버로 변환해 체인에서 더 쉽게 사용할 수도 있어요.

const retriever = vectorStore.asRetriever({
  // Optional filter
  filter: filter,
  k: 2,
});
await retriever.invoke("biology");

검색 증강 생성(RAG) 사용법 (Usage for retrieval-augmented generation)

이 벡터 스토어를 검색 증강 생성(RAG)에 사용하는 방법에 대한 가이드는 다음 섹션을 참고하세요:


API reference

모든 WeaviateStore 기능과 구성에 대한 자세한 문서는 API reference를 참고하세요.

출처: 문서

본문

WeaviateStore는 객체와 벡터를 모두 저장하는 오픈소스 벡터 DB Weaviate용 통합이에요. @langchain/weaviate 패키지에서 weaviate.connectToWeaviateCloud 등으로 클라이언트를 만들고 schema(named vectors·vectorizers·reranker·generative 포함)로 인스턴스화해요. 문서 추가(UUID id)·삭제, similaritySearch·similaritySearchWithScore·hybridSearch·generate(RAG)·asRetriever()를 지원해요.

더 알아보기 (Learn more)