在人工智能和大数据的时代,将先进的搜索技术与强大的嵌入式模型相结合,已成为开发高效智能应用的关键。本教程将向您展示如何使用Azure Cognitive Search作为OpenAI嵌入技术的向量数据库,帮助您在云中构建一个丰富的搜索体验。
开始之前:必要条件和准备工作
环境准备
在开始实践之前,确保您已经具备以下条件:
- Azure Cognitive Search服务:注册并配置您的Azure Cognitive Search服务。
- OpenAI密钥或Azure OpenAI凭据:获取并配置您的OpenAI API密钥。
- 安装必要的库:通过pip安装如
wget
和azure-search-documents
等必要的Python库。
导入所需库
import openai
import json
import wget
import pandas as pd
import zipfile
from azure.core.credentials import AzureKeyCredential
from azure.search.documents import SearchClient
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.models import Vector
from azure.search.documents import SearchIndexingBufferedSender
from azure.search.documents.indexes.models import (
SearchIndex,
SearchField,
SearchFieldDataType,
SimpleField,
SearchableField,
SemanticConfiguration,
PrioritizedFields,
SemanticField,
VectorSearch,
HnswVectorSearchAlgorithmConfiguration
)
配置OpenAI和Azure Cognitive Search
设置OpenAI
openai.api_type = "azure"
openai.api_base = "YOUR_AZURE_OPENAI_ENDPOINT"
openai.api_version = "2023-05-15"
openai.api_key = "YOUR_AZURE_OPENAI_KEY"
model: str = "text-embedding-ada-002"
设置Azure Cognitive Search
search_service_endpoint: str = "YOUR_AZURE_SEARCH_ENDPOINT"
search_service_api_key: str = "YOUR_AZURE_SEARCH_ADMIN_KEY"
index_name: str = "azure-cognitive-search-vector-demo"
credential = AzureKeyCredential(search_service_api_key)
加载和准备数据
下载数据
使用wget
下载并解压包含嵌入向量的Wikipedia文章数据。
embeddings_url = "https://cdn.openai.com/API/examples/data/vector_database_wikipedia_articles_embedded.zip"
wget.download(embeddings_url)
with zipfile.ZipFile("vector_database_wikipedia_articles_embedded.zip", "r") as zip_ref:
zip_ref.extractall("../../data")
数据预处理
将下载的数据加载到Pandas DataFrame中,并准备用于上传到Azure Search。
article_df = pd.read_csv('../../data/vector_database_wikipedia_articles_embedded.csv')
article_df["title_vector"] = article_df.title_vector.apply(json.loads)
article_df["content_vector"] = article_df.content_vector.apply(json.loads)
article_df['vector_id'] = article_df['vector_id'].apply(str)
创建和配置搜索索引
定义索引结构
在Azure Search中创建一个新索引,定义包括文本字段和向量字段。
index_client = SearchIndexClient(
endpoint=search_service_endpoint, credential=credential)
fields = [
SimpleField(name="id", type=SearchFieldDataType.String),
# ... 其他字段定义
]
index = SearchIndex(name=index_name, fields=fields, vector_search=vector_search)
result = index_client.create_or_update_index(index)
print(f'{result.name} created')
上传文档和嵌入向量
将数据上传至Azure Search
使用SearchIndexingBufferedSender
将文档和嵌入向量上传至Azure Search。
documents = article_df.to_dict(orient='records')
with SearchIndexingBufferedSender(search_service_endpoint, index_name, credential) as batch_client:
batch_client.upload_documents(documents=documents)
print(f"Uploaded {len(documents)} documents in total")
实现向量相似度搜索
搜索函数
定义一个函数,根据用户的查询生成嵌入,并在Azure Search中执行向量搜索。
def generate_embeddings(text):
response = openai.Embedding.create(input=text, engine=model)
return response['data'][0]['embedding']
query = "modern art in Europe"
search_client = SearchClient(search_service_endpoint, index_name, credential)
vector = Vector(value=generate_embeddings(query), k=3, fields="content_vector")
results = search_client.search(search_text=None, vectors=[vector])
for result in results:
print(f"Title: {result['title']}\nURL: {result['url']}")
结语
通过本教程的学习,您已经掌握了如何使用Azure Cognitive Search结合OpenAI嵌入技术构建高效的向量数据库。这种方法不仅有利于提升搜索质量,还能为您的应用带来更加丰富和深入的搜索体验。