我很难理解使用 Azure OpenAI、AI Search 作为源和 Python SDK 来实现 RAG 的每种方法的优缺点。两者都工作得很好,但选项 B 看起来更干净。为什么我们要自己费心去执行选项 A 中的所有步骤呢?我是不是错过了什么?
我只能考虑一些需要获取 AI 搜索块进行评估 (RAGAS) 的用例,而选项 B 可能无法做到这一点。
A) 自行查询AI搜索
openai_client = AzureOpenAI(
api_version="2024-06-01",
azure_endpoint=AZURE_OPENAI_ACCOUNT,
azure_ad_token_provider=token_provider
)
search_client = SearchClient(
endpoint=AZURE_SEARCH_SERVICE,
index_name="hotels-sample-index",
credential=credential
)
GROUNDED_PROMPT="""
You are a friendly assistant that recommends hotels based on activities and amenities.
Query: {query}
Sources:\n{sources}
"""
query="Can you recommend a few hotels with complimentary breakfast?"
search_results = search_client.search(
search_text=query,
top=5,
select="Description,HotelName,Tags"
)
sources_formatted = "\n".join([f'{document["HotelName"]}:{document["Description"]}:{document["Tags"]}' for document in search_results])
response = openai_client.chat.completions.create(
messages=[
{
"role": "user",
"content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
}
],
model=AZURE_DEPLOYMENT_MODEL
)
B) 让 Azure OpenAI 查询 AI Search 本身
endpoint = os.environ.get("AZURE_OPENAI_ENDPOINT")
api_key = os.environ.get("AZURE_OPENAI_API_KEY")
deployment = os.environ.get("AZURE_OPENAI_DEPLOYMENT_ID")
client = openai.AzureOpenAI(
azure_endpoint=endpoint,
api_key=api_key,
api_version="2024-02-01",
)
completion = client.chat.completions.create(
model=deployment,
messages=[
{
"role": "user",
"content": "What are my available health plans?",
},
],
extra_body={
"data_sources":[
{
"type": "azure_search",
"parameters": {
"endpoint": os.environ["AZURE_AI_SEARCH_ENDPOINT"],
"index_name": os.environ["AZURE_AI_SEARCH_INDEX"],
"authentication": {
"type": "api_key",
"key": os.environ["AZURE_AI_SEARCH_API_KEY"],
}
}
}
],
}
)
您可以使用 Azure OpenAI 和 AI 搜索执行多种方法,从您的选项 A 和 B 来看,它属于:
A,检索然后读取:简单的检索然后读取实现,直接使用 AI Search 和 OpenAI API。它首先从搜索中检索热门文档,然后用它们构建提示,然后使用 OpenAI 生成带有该提示的补全(答案)。在此处阅读更多信息:https://github.com/Azure-Samples/azure-search-openai-demo/blob/main/app/backend/approaches/retrievethenread.py
B,聊天读取检索读取:一种多步骤方法,首先使用 OpenAI 将用户的问题转化为搜索查询,然后使用 Azure AI Search 检索相关文档,然后发送对话历史记录、原始用户问题和搜索结果发送至 OpenAI 以生成响应。
Function Calling
,例如此示例实现https://github.com/Azure-Samples/azure-search-openai-demo/blob/main/app/backend/approaches/chatreadretrieveread .py。您可以根据您的业务进一步利用多步骤,不仅包括 data_source,还包括您的 python 函数 https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/函数调用什么更好?
A 简单明了。如果您搜索某个项目并且 AI Search 没有返回任何信息,则 OpenAI 不会采取进一步的操作,并且对话会提前结束。这种情况经常发生,因为并非每个用户都会在第一个查询中询问信息,或者可能不知道如何表达他们的问题。
B 有助于扩展对话上下文,并允许 OpenAI 决定运行哪个功能,使交互感觉更加人性化。这绝对取决于您的业务需求以更可定制的方式分支对话场景。例如,当用户询问“今天天气怎么样?”时,需要有两个参数:“位置”和“单位”(摄氏度或华氏度)。如果没有提供足够的参数,OpenAI 将提示用户类似“请让我知道您的位置和单位”之类的内容。它会不断询问是否缺少任何一个参数,并在获得所有必要信息后运行该函数。