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

设置

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

关于混合搜索

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

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

下面是一个示例,它将文件中的文档索引到 Azure AI 搜索中,运行混合搜索查询,最后使用链根据检索到的文档用自然语言回答问题。
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 搜索向量存储
const store = await AzureAISearchVectorStore.fromDocuments(
  documents,
  new OpenAIEmbeddings(),
  {
    search: {
      type: AzureAISearchQueryType.SimilarityHybrid,
    },
  }
);

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

// 执行相似性搜索
const resultDocuments = await store.similaritySearch(
  "总统对凯坦吉·布朗·杰克逊说了什么?"
);

console.log("相似性搜索结果:");
console.log(resultDocuments[0].pageContent);
/*
  今晚。我呼吁参议院:通过《自由投票法案》。通过《约翰·刘易斯投票权法案》。并且,趁此机会,通过《披露法案》,以便美国人能够知道谁在资助我们的选举。

  今晚,我想向一位毕生致力于服务这个国家的人致敬:斯蒂芬·布雷耶大法官——一位陆军退伍军人、宪法学者,以及即将退休的美国最高法院大法官。布雷耶大法官,感谢您的服务。

  总统最严肃的宪法职责之一是提名某人在美国最高法院任职。

  我在四天前就这样做了,当时我提名了巡回上诉法院法官凯坦吉·布朗·杰克逊。他是我们国家顶尖的法律头脑之一,将继续布雷耶大法官卓越的遗产。
*/

// 将存储用作链的一部分
const model = new ChatOpenAI({ model: "gpt-3.5-turbo-1106" });
const questionAnsweringPrompt = ChatPromptTemplate.fromMessages([
  [
    "system",
    "根据以下上下文回答用户的问题:\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: "总统在价格方面的首要任务是什么?",
});

console.log("链响应:");
console.log(response.answer);
/*
  总统的首要任务是控制价格。
*/

相关内容