首頁  >  文章  >  科技週邊  >  利用Azure語意搜尋與OpenAI,打造認知搜尋系統

利用Azure語意搜尋與OpenAI,打造認知搜尋系統

DDD
DDD轉載
2023-10-12 10:18:04765瀏覽

在當今的數位時代,擁有強大、可擴展且高效的系統不僅僅是一種競爭優勢,更是一種競爭優勢。這是必要的。無論您是努力優化用戶輸入處理旨在簡化文件搜索,多種服務和平台的結合都是獲得無與倫比性能的關鍵。在本文中,我們將探索一種將 Azure 認知服務的強大功能與 OpenAI 的功能結合的整體方法。透過深入研究意圖識別、文件過濾、特定領域的演算法和文字摘要,您將學習創建一個不僅可以理解用戶意圖而且可以有效處理和呈現資訊的系統。

我們將建立這個:

利用Azure語意搜尋與OpenAI,打造認知搜尋系統

設定環境

在我們深入之前,讓我們確保已經安裝了必要的軟體包並設定了環境變數:

!pip show azure-search-documents
%pip install azure-search-documents --pre
%pip show azure-search-documents
!pip install python-dotenv
!pip install openai
import os
import requests
import json
import openai
openai.api_key = os.getenv("AZURE_OPENAI_KEY")
openai.api_base = os.getenv("AZURE_OPENAI_ENDPOINT")
openai.api_type = 'azure'
openai.api_version = '2023-05-15'
# Look in Azure OpenAI Studio > Deployments
deployment_name = 'gpt-35-turbo'

在這裡,我們使用必要的API 金鑰、端點和類型來設定OpenAI 環境。

設定 Azure 搜尋

要使用Azure語義搜索,我們需要匯入必要的模組並設定環境。

import os
from azure.core.credentials import AzureKeyCredential
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents import SearchClient
from azure.search.documents.indexes.models import (
    ComplexField,
    CorsOptions,
    SearchIndex,
    ScoringProfile,
    SearchFieldDataType,
    SimpleField,
    SearchableField
)

匯入模組後,我們現在可以設定Azure 搜尋服務端點和API 金鑰:

# 从环境中设置服务端点和 API 密钥
service_name = "xxxxx"
admin_key ="xxxxx"
# 如果您共享密钥 - 请确保您的 index_name 是唯一的!
index_name = "hotels-quickstart"
# 创建 SDK 客户
endpoint = "https://{}.search.windows.net/".format(service_name)
admin_client = SearchIndexClient(endpoint=endpoint,
                      index_name=index_name,
                      credential=AzureKeyCredential(admin_key))

search_client = SearchClient(endpoint=endpoint,
                      index_name=index_name,
                      credential=AzureKeyCredential(admin_key))

(注意:在共享任何程式碼之前,請務必掩蓋或隱藏您的金鑰。 )

為Azure 語意搜尋準備索引

在將資料新增至Azure 搜尋之前,我們需要定義一個描述資料結構的索引:

# 删除索引(如果存在)
try:
    result = admin_client.delete_index(index_name)
    print ('Index', index_name, 'Deleted')
except Exception as ex:
    print (ex)

此程式碼片段確保如果索引已存在,則將其刪除。這在重新運行程式碼或更改索引時很有用。

現在,讓我們指定索引的架構:

# 指定索引模式
name = index_name 
fields = [ 
        SimpleField(name= "HotelId" , type=SearchFieldDataType.String, key= True ), 
        SearchableField(name= "HotelName" , type=SearchFieldDataType.String, sortable= True ), 
        SearchableField (名称= “描述”,类型=SearchFieldDataType.String,analyzer_name= “en.lucene”),
        SearchableField(名称= “Description_fr”,类型=SearchFieldDataType.String,analyzer_name= “fr.lucene”),
        SearchableField(名称= “类别”、 type=SearchFieldDataType.String、facetable= True、filterable= True、sortable= True )、
        SearchableField(name= "Tags"、collection= True、type=SearchFieldDataType.String、facetable= True、filterable= True )、
        SimpleField(name = “ParkingInincluded”,类型=SearchFieldDataType.Boolean,facetable= True,filterable= True,sortable= True),
        SimpleField(name= “LastRenovationDate”,type=SearchFieldDataType.DateTime关闭设置,facetable= True,filterable=True、sortable= True )、
        SimpleField(name= "Rating"、 type=SearchFieldDataType.Double、facetable= True、filterable= True、sortable= True )、
        ComplexField(name= "地址"、 fields=[ 
            SearchableField(name= " StreetAddress"、 type=SearchFieldDataType.String)、
            SearchableField(name= "City"、 type=SearchFieldDataType.String、facetable= True、 filterable= True、 sortable= True )、
            SearchableField(name= "StateProvince"、 type=SearchFieldDataType.String、facetable= True、filterable= True、sortable= True )、
            SearchableField(name= "邮政编码"、 type=SearchFieldDataType.String、facetable= True、filterable= True、sortable= True )、
            SearchableField(name = “国家”,类型= SearchFieldDataType.String,facetable = True,filterable = True,sortable = True),
        ])
    ] 
cors_options = CorsOptions(allowed_origins = [ “*” ],max_age_in_seconds = 60)
Scoring_profiles = [] 
suggester = [{ 'name' : 'sg' , 'source_fields' : [ '标签' , '地址/城市' , '地址/国家' ]}]

接下來,您必須在Azure 上建立此索引:

index = SearchIndex(
    name=name,
    fields=fields,
    scoring_profiles=scoring_profiles,
    suggesters = suggester,
    cors_options=cors_options)
try:
    result = admin_client.create_index(index)
    print ('Index', result.name, 'created')
except Exception as ex:
    print (ex)

建立索引後,我們需要用文件填充它。需要指出的是,它可以是任何類型的文件!我只是在此處手動添加將保留在 blob 存儲中的文檔:

文档 = [ 
    { 
    "@search.action": "上传", "@search.action" : "上传" , 
    "HotelId" : "1" , 
    "HotelName" : "秘密点汽车旅馆" , 
    "Description" : "酒店地理位置优越,位于纽约市中心的城市主要商业干道上。几分钟即可到达时代广场和城市的历史中心,以及使纽约成为美国最具吸引力的城市之一的其他名胜古迹和国际大都市。” ,
    “Description_fr”:“L'hôtel est idéalement situé sur la prime artère Commerciale de la ville en plein cœur de New York.A insi que d'autres lieux d'intérêt qui font纽约的城市充满魅力和美国的国际化。” , 
    "Category" : "精品店" , 
    "Tags" : [ "游泳池" , "空调" , "礼宾服务" ], 
    "ParkingInincluded" : "false" , 
    "LastRenovationDate" : "1970-01-18T00:00:00Z ”,
    "Rating" : 3.60 , 
    "Address" : {    
        “StreetAddress”:“677 第五大道”,
        “City”:“纽约”,
        “StateProvince”:“纽约” ,
        “PostalCode”:“10022”,
        “Country”:“美国”
         } 
    },
    { 
    “@search. action" : "上传" , 
    "HotelId" : "2" , 
    "HotelName" : "双圆顶汽车旅馆" , 
    "Description" :“该酒店坐落在一座十九世纪的广场上,该广场已按照最高建筑标准进行扩建和翻新,打造出一座现代化、实用的一流酒店,艺术和独特的历史元素与最现代的舒适设施共存。” , 
    "Description_fr" : "L'hôtel 位于十九世纪的地方,是一座现代化酒店的高级规范建筑,在艺术和历史独特方面具有一流的功能和一流的设计舒适与现代共存。” , 
    "Category" : "精品店" , 
    "Tags" : [ "泳池" ,], 
    "ParkingInincluded" : "false" , 
    "LastRenovationDate" : "1979-02-18T00:00:00Z" , 
    "Rating" : 3.60 , 
    "Address" : { 
        "StreetAddress" : "140 大学城中心" , 
        "City”:“萨拉索塔”,
        “StateProvince”:“佛罗里达州”,
        “PostalCode”:“34243”,
        “Country”:“美国”
         } 
    },
    { 
    "@search.action" : "上传" , 
    "HotelId" :"3" , 
    "HotelName" : "三重景观酒店" , 
    "Description" : "该酒店在 William Dough 的管理下以其卓越的美食脱颖而出,他为酒店的所有餐厅服务提供建议并监督。" , 
    "Description_fr" : "L'hôtel 位于十九世纪的地方,是一座现代化酒店的高级规范建筑,在艺术和历史独特方面具有一流的功能和一流的设计舒适与现代共存。” , 
    "Category" : "度假村中心" ,
    "Tags" : [ "酒吧" , "欧陆式早餐" ], 
    "ParkingInincluded" : "true" , 
    "LastRenovationDate" : "2015-09-20T00:00:00Z" , 
    "Rating" : 4.80 , 
    "Address" : { 
        "StreetAddress" : “3393 Peachtree Rd”、
        “City”:“亚特兰大”、
        “StateProvince”:“GA”、
        “PostalCode”:“30326”、
        “Country”:“美国”
         } 
    }
]

現在將這些文檔推送到語義搜尋索引。

try:
    result = search_client.upload_documents(documents=documents)
    print("Upload of new document succeeded: {}".format(result[0].succeeded))
except Exception as ex:
    print (ex.message)

與OpenAI 整合

讓我們建立與OpenAI 的連線:

question="What is the address of ChatGpt Hotel?"

然後,新增Azure OpenAI 連線:

###
import os
import requests
import json
import openai
os.environ["AZURE_OPENAI_KEY"] = "xxxx"
os.environ["AZURE_OPENAI_ENDPOINT"] = "xxxx"
openai.api_key = os.getenv("AZURE_OPENAI_KEY")
openai.api_base = os.getenv("AZURE_OPENAI_ENDPOINT")
openai.api_type = 'azure'
openai.api_version = '2023-05-15'
# 在 Azure OpenAI Studio > 部署中查找
deployment_name = 'gpt-35-turbo'
###
# 定义一个函数,根据系统消息和消息创建提示
def create_prompt(system_message, messages):
    prompt = system_message
    message_template = "\n<|im_start|>{}\n{}\n<|im_end|>"
    for message in messages:
        prompt += message_template.format(message[&#39;sender&#39;], message[&#39;text&#39;])
    prompt += "\n<|im_start|>assistant\n"
    return prompt
# 定义系统消息
system_message_template = "<|im_start|>system\n{}\n<|im_end|>"
system_message = system_message_template.format("")
print(system_message)

此時,您可以使用語意搜尋和Azure OpenAI。我們來查詢語意搜尋:

import json
results =  search_client.search(search_text=question, include_total_count=True, select=&#39;HotelId,HotelName,Tags,Address&#39;)=  search_client.search(search_text=question, include_total_count=True, select=&#39;HotelId,HotelName,Tags,Address&#39;)
json_results=""
print (&#39;Total Documents Matching Query:&#39;, results.get_count())
for result in results:
    #print("{}: {}: {}".format(result["HotelId"], result["HotelName"], result["Tags"],results["Address"]))
    json_results+=str(result)
print(json_results)

有了搜尋結果,我們現在可以利用 Azure OpenAI 來解釋或進一步處理結果。

# 创建消息列表来跟踪对话
messages = [{"sender": "user", "text": "Hello, take into account the following information "+json_results},
            {"sender": "user", "text": question},
            ]
response = openai.Completion.create(
  engine=deployment_name,
  prompt= create_prompt(system_message, messages),
  temperature=0.7,
  max_tokens=800,
  top_p=0.95,
  frequency_penalty=0,
  presence_penalty=0,
    stop=["<|im_end|>"])
print(response)

此程式碼向 OpenAI 模型提示搜尋結果和我們的原始問題,使其能夠根據資料處理並提供有意義的資訊。

結論

在本文中,我們了解如何將 Azure 語意搜尋的強大功能與 OpenAI 的功能結合。透過整合這兩個強大的工具,我們可以在我們的應用程式中為用戶提供豐富的智慧搜尋結果。

以上是利用Azure語意搜尋與OpenAI,打造認知搜尋系統的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:Dr. Ernesto Lee。如有侵權,請聯絡admin@php.cn刪除