以编程方式使用文档

概述

A 向量存储 存储 嵌入 数据并执行相似性搜索。

flowchart LR

    subgraph "📥 Indexing phase (store)"
        A[📄 Documents] --> B[🔢 Embedding model]
        B --> C[🔘 Embedding vectors]
        C --> D[(Vector store)]
    end

    subgraph "📤 Query phase (retrieval)"
        E[❓ Query text] --> F[🔢 Embedding model]
        F --> G[🔘 Query vector]
        G --> H[🔍 Similarity search]
        H --> D
        D --> I[📄 Top-k results]
    end

    classDef process fill:#E5F4FF,stroke:#006DDD,stroke-width:2px,color:#030710
    class A,B,C,D,E,F,G,H,I process

接口

LangChain 为向量存储提供了统一接口,允许你:

  • - addDocuments - 向存储添加文档。
  • - delete - 按 ID 删除存储的文档。
  • - similaritySearch - 查询语义相似的文档。

这种抽象让你可以在不更改应用逻辑的情况下切换不同的实现。

初始化

LangChain 中的大多数向量存储在初始化时接受嵌入模型作为参数。

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

添加文档

你可以使用以下方式向向量存储添加文档: addDocuments function.

const document = new Document({
  pageContent: "Hello world",
});
await vectorStore.addDocuments([document]);

删除文档

你可以使用以下方式从向量存储中删除文档: delete function.

await vectorStore.delete({
  filter: {
    pageContent: "Hello world",
  },
});

相似性搜索

使用以下方法发出语义查询: similaritySearch,返回最接近的嵌入文档:

const results = await vectorStore.similaritySearch("Hello world", 10);

许多向量存储支持以下参数:

  • * k — 返回结果数量
  • * filter — 基于元数据的条件过滤

相似性度量与索引

嵌入相似性可以使用以下方式计算:

  • * **余弦相似度**
  • * **欧氏距离**
  • * **点积**

高效搜索通常采用 HNSW(层次可导航小世界)等索引方法,具体取决于向量存储。

元数据过滤

按元数据(如来源、日期)过滤可以细化搜索结果:

vectorStore.similaritySearch("query", 2, { source: "tweets" });
对元数据过滤的支持因实现不同而异。 请查看所选向量存储的文档以获取详细信息。

热门集成

选择嵌入模型:

OpenAI

安装依赖:

npm install @langchain/openai @langchain/core
yarn add @langchain/openai @langchain/core
pnpm add @langchain/openai @langchain/core

添加环境变量:

OPENAI_API_KEY=your-api-key

实例化模型:

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

Azure

安装依赖

npm install @langchain/openai @langchain/core
yarn add @langchain/openai @langchain/core
pnpm add @langchain/openai @langchain/core

添加环境变量:

AZURE_OPENAI_API_INSTANCE_NAME=
AZURE_OPENAI_API_KEY=
AZURE_OPENAI_API_VERSION="2024-02-01"

实例化模型:

const embeddings = new AzureOpenAIEmbeddings({
  azureOpenAIApiEmbeddingsDeploymentName: "text-embedding-ada-002"
});

AWS

安装依赖:

npm i @langchain/aws
yarn add @langchain/aws
pnpm add @langchain/aws

添加环境变量:

BEDROCK_AWS_REGION=your-region

实例化模型:

const embeddings = new BedrockEmbeddings({
  model: "amazon.titan-embed-text-v1"
});

Google Gemini

安装依赖:

npm i @langchain/google-genai
yarn add @langchain/google-genai
pnpm add @langchain/google-genai

添加环境变量:

GOOGLE_API_KEY=your-api-key

实例化模型:

const embeddings = new GoogleGenerativeAIEmbeddings({
  model: "text-embedding-004"
});

Google Vertex

安装依赖:

npm i @langchain/google-vertexai
yarn add @langchain/google-vertexai
pnpm add @langchain/google-vertexai

添加环境变量:

GOOGLE_APPLICATION_CREDENTIALS=credentials.json

实例化模型:

const embeddings = new VertexAIEmbeddings({
  model: "gemini-embedding-001"
});

MistralAI

安装依赖项:

npm install @langchain/mistralai @langchain/core
yarn add @langchain/mistralai @langchain/core
pnpm add @langchain/mistralai @langchain/core

添加环境变量:

MISTRAL_API_KEY=your-api-key

实例化模型:

const embeddings = new MistralAIEmbeddings({
  model: "mistral-embed"
});

Cohere

安装依赖项:

npm i @langchain/cohere
yarn add @langchain/cohere
pnpm add @langchain/cohere

添加环境变量:

COHERE_API_KEY=your-api-key

实例化模型:

const embeddings = new CohereEmbeddings({
  model: "embed-english-v3.0"
});

Ollama

安装依赖项:

npm install @langchain/ollama @langchain/core
yarn add @langchain/ollama @langchain/core
pnpm add @langchain/ollama @langchain/core

实例化模型:

const embeddings = new OllamaEmbeddings({
  model: "llama2",
  baseUrl: "http://localhost:11434", // Default value
});

选择向量存储:

Memory

npm i langchain
yarn add langchain
pnpm add langchain
const vectorStore = new MemoryVectorStore(embeddings);

MongoDB

Manual embedding

    npm install @langchain/mongodb mongodb @langchain/core
    
    yarn add @langchain/mongodb mongodb @langchain/core
    
    pnpm add @langchain/mongodb mongodb @langchain/core
    
    const client = new MongoClient(process.env.MONGODB_ATLAS_URI!);
    const collection = client
      .db(process.env.MONGODB_ATLAS_DB_NAME)
      .collection(process.env.MONGODB_ATLAS_COLLECTION_NAME);

    const vectorStore = new MongoDBAtlasVectorSearch(embeddings, {
      collection,
      indexName: "vector_index",
      textKey: "text",
      embeddingKey: "embedding",
    });
    

Automated embedding

    npm install @langchain/mongodb mongodb @langchain/core
    
    yarn add @langchain/mongodb mongodb @langchain/core
    
    pnpm add @langchain/mongodb mongodb @langchain/core
    
    const client = new MongoClient(process.env.MONGODB_ATLAS_URI!);
    const collection = client
      .db(process.env.MONGODB_ATLAS_DB_NAME)
      .collection(process.env.MONGODB_ATLAS_COLLECTION_NAME);

    const vectorStore = new MongoDBAtlasVectorSearch({ collection });
    

Pinecone

npm install @langchain/pinecone @langchain/core @pinecone-database/pinecone
yarn add @langchain/pinecone @langchain/core @pinecone-database/pinecone
pnpm add @langchain/pinecone @langchain/core @pinecone-database/pinecone
const pinecone = new PineconeClient();
const vectorStore = new PineconeStore(embeddings, {
  pineconeIndex,
  maxConcurrency: 5,
});

Redis

npm install @langchain/redis @langchain/core redis
yarn add @langchain/redis @langchain/core redis
pnpm add @langchain/redis @langchain/core redis
const vectorStore = new RedisVectorStore(embeddings, {
  redisClient: client,
  indexName: "langchainjs-testing",
});

Qdrant

npm install @langchain/qdrant @langchain/core
yarn add @langchain/qdrant @langchain/core
pnpm add @langchain/qdrant @langchain/core
const vectorStore = await QdrantVectorStore.fromExistingCollection(embeddings, {
  url: process.env.QDRANT_URL,
  collectionName: "langchainjs-testing",
});

Oracle AI Database

npm i @oracle/langchain-oracledb @langchain/core
yarn add @oracle/langchain-oracledb @langchain/core
pnpm add @oracle/langchain-oracledb @langchain/core
const connection = await oracledb.getConnection({
  user: process.env.ORACLE_USER,
  password: process.env.ORACLE_PASSWORD,
  connectionString: process.env.ORACLE_DSN,
});

const embeddings = new OracleEmbeddings(connection, {
  provider: "database",
  model: process.env.DEMO_ONNX_MODEL ?? "DEMO_MODEL",
});

const vectorStore = new OracleVS(embeddings, {
  client: connection,
  tableName: "DEMO_VECTORS",
  query: "Find support tickets mentioning service outages.",
  distanceStrategy: "DOT",
});
await vectorStore.initialize();

Weaviate

        npm install @langchain/weaviate @langchain/core weaviate-client
        
        yarn add @langchain/weaviate @langchain/core weaviate-client
        
        pnpm add @langchain/weaviate @langchain/core weaviate-client
        
    const vectorStore = new WeaviateStore(embeddings, {
        client: weaviateClient,
        indexName: "Langchainjs_test",
    });
    

LangChain.js 与多种向量存储集成。您可以在下面查看完整列表:

所有向量存储

Azure DocumentDB

Azure Cosmos DB for NoSQL

Cloudflare Vectorize

Google Cloud SQL for PostgreSQL

内存中

Milvus

MongoDB Atlas

Oracle AI Database

Pinecone

Qdrant

Redis

Weaviate

Neo4j 向量索引

PGVector

Turbopuffer

YDB