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 |
✅ |
설정 (Setup)
Weaviate 벡터 스토어를 사용하려면 Weaviate 인스턴스를 설정하고, 배포에 연결하기 위해 @langchain/weaviate, @langchain/core, weaviate-client를 설치하세요.
이 가이드는 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"}]
하이브리드 검색 (Hybrid search)
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()를 지원해요.