Skip to main content
Azure AI Search(前身为 Azure Search 和 Azure Cognitive Search)是一个分布式、RESTful 的搜索引擎,针对 Azure 上生产规模工作负载的速度和相关性进行了优化。它还支持使用 k-近邻 (kNN) 算法进行向量搜索,以及语义搜索 此向量存储集成支持全文搜索、向量搜索和混合搜索以获得最佳排名性能 请从此页面了解如何利用 Azure AI Search 的向量搜索功能。如果您没有 Azure 账户,可以创建一个免费账户来开始使用。

设置

您首先需要安装 @azure/search-documents SDK 和 @langchain/community 包:
npm
npm install -S @langchain/community @langchain/core @azure/search-documents
您还需要运行一个 Azure AI Search 实例。您可以按照此指南在 Azure 门户上免费部署一个版本。 一旦您的实例开始运行,请确保您拥有端点和管理员密钥(查询密钥只能用于搜索文档,不能用于索引、更新或删除)。端点是您实例的 URL,您可以在 Azure 门户中实例的“概述”部分下找到。管理员密钥可以在实例的“密钥”部分下找到。然后您需要设置以下环境变量:
.env vars
# Azure AI Search 连接设置
AZURE_AISEARCH_ENDPOINT=
AZURE_AISEARCH_KEY=

# 如果您使用 Azure OpenAI API,则需要设置这些变量
AZURE_OPENAI_API_KEY=
AZURE_OPENAI_API_INSTANCE_NAME=
AZURE_OPENAI_API_DEPLOYMENT_NAME=
AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME=
AZURE_OPENAI_API_VERSION=

# 或者您可以直接使用 OpenAI API
OPENAI_API_KEY=

关于混合搜索

混合搜索是一项功能,结合了全文搜索和向量搜索的优势,以提供最佳的排名性能。它在 Azure AI Search 向量存储中默认启用,但您可以在创建向量存储时通过设置 search.type 属性来选择不同的搜索查询类型。 您可以在官方文档中阅读更多关于混合搜索以及它如何改进搜索结果的信息。 在某些场景中,如检索增强生成 (RAG),您可能希望启用语义排名以及混合搜索,以提高搜索结果的相关性。您可以在创建向量存储时将 search.type 属性设置为 AzureAISearchQueryType.SemanticHybrid 来启用语义排名。 请注意,语义排名功能仅在 Basic 及更高定价层级中可用,并且受区域可用性限制。 您可以在此博客文章中阅读更多关于使用语义排名与混合搜索的性能信息。

示例:索引文档、向量搜索和 LLM 集成

以下示例从文件中索引文档到 Azure AI Search,运行混合搜索查询,并最终使用链根据检索到的文档以自然语言回答问题。
import {
  AzureAISearchVectorStore,
  AzureAISearchQueryType,
} from "@langchain/community/vectorstores/azure_aisearch";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { ChatOpenAI, OpenAIEmbeddings } from "@langchain/openai";
import { createStuffDocumentsChain } from "@langchain/classic/chains/combine_documents";
import { createRetrievalChain } from "@langchain/classic/chains/retrieval";
import { TextLoader } from "@langchain/classic/document_loaders/fs/text";
import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters";

// 从文件加载文档
const loader = new TextLoader("./state_of_the_union.txt");
const rawDocuments = await loader.load();
const splitter = new RecursiveCharacterTextSplitter({
  chunkSize: 1000,
  chunkOverlap: 0,
});
const documents = await splitter.splitDocuments(rawDocuments);

// 创建 Azure AI Search 向量存储
const store = await AzureAISearchVectorStore.fromDocuments(
  documents,
  new OpenAIEmbeddings(),
  {
    search: {
      type: AzureAISearchQueryType.SimilarityHybrid,
    },
  }
);

// 首次运行时,将创建索引。
// 您可能需要等待索引创建完成后才能执行搜索,
// 或者您可以事先手动创建索引。

// 执行相似性搜索
const resultDocuments = await store.similaritySearch(
  "What did the president say about Ketanji Brown Jackson?"
);

console.log("Similarity search results:");
console.log(resultDocuments[0].pageContent);
/*
  Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding our elections.

  Tonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service.

  One of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court.

  And I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence.
*/

// 将存储用作链的一部分
const model = new ChatOpenAI({ model: "gpt-3.5-turbo-1106" });
const questionAnsweringPrompt = ChatPromptTemplate.fromMessages([
  [
    "system",
    "Answer the user's questions based on the below context:\n\n{context}",
  ],
  ["human", "{input}"],
]);

const combineDocsChain = await createStuffDocumentsChain({
  llm: model,
  prompt: questionAnsweringPrompt,
});

const chain = await createRetrievalChain({
  retriever: store.asRetriever(),
  combineDocsChain,
});

const response = await chain.invoke({
  input: "What is the president's top priority regarding prices?",
});

console.log("Chain response:");
console.log(response.answer);
/*
  The president's top priority is getting prices under control.
*/

相关