我找到了这个文档关于使用 AI-Search 和 OpenAI 与自己的数据聊天。
它对我的数据工作得很好,但是除了内容和分数之外我没有得到任何额外的上下文:
{"content":"<MY CONTENT>", "id":null,"title":null,"filepath":null,"url":null,"metadata":{"chunking":"orignal document size=2000. Scores=3.6962261Org Highlight count=31."},"chunk_id":"0"}
我认为 AI-Search 中的附加字段需要在代码中的某个位置指定,但我不知道在哪里,也找不到任何示例。
在 Azure OpenAI Chat Playground 中,您可以选择 AI 搜索索引中的字段。然后它也正确显示在示例聊天应用程序中。
如何使用上面引用的代码示例在我的代码中实现相同的目标?
根据提供的信息,生成的索引似乎需要正确的格式。 您可以查看此示例笔记本作为参考,以使用 URL 和其他详细信息创建索引。
生成包含所有必需详细信息的索引后,您将能够使用 azure openai 端点获得相关结果。
我自己找到了解决方案。因此,您不需要为 AI-Search 索引字段使用“默认”名称。您可以根据需要命名索引字段。但是,您需要将字段名称映射到预期的默认值。这是一个工作示例:
def ask_llm_citation(USER_INPUT:str, AZURE_OPENAI_SYSTEM_MESSAGE: str, NR_DOCUMENTS: int, STRICTNESS: int):
def parse_multi_columns(columns: str) -> list:
if "|" in columns:
return columns.split("|")
else:
return columns.split(",")
endpoint = config["OPENAI_API_BASE"]
api_key = config["OPENAI_API_KEY"]
# set the deployment name for the model we want to use
deployment = config["OPENAI_API_GPT_DEPLOYMENT_NAME"]
client = openai.AzureOpenAI(
base_url=f"{endpoint}/openai/deployments/{deployment}/extensions",
api_key=api_key,
api_version="2023-09-01-preview"
)
response = client.chat.completions.create(
messages=[{"role": "user", "content": USER_INPUT}],
model=deployment,
extra_body={
"dataSources": [
{
"type": "AzureCognitiveSearch",
"parameters": {
"endpoint": ai_search["AZURE_COGNITIVE_SEARCH_ENDPOINT"],
"key": ai_search["AZURE_COGNITIVE_SEARCH_KEY"],
"indexName": ai_search["AZURE_COGNITIVE_SEARCH_INDEX_NAME"],
"fieldsMapping": {
"contentFields": parse_multi_columns("content"),
"urlField": "url_name",
"filepathField": "file_name",
"vectorFields": parse_multi_columns("content_vector")
},
"embeddingDeploymentName": config["OPENAI_API_DEPLOYMENT_NAME"],
"query_type":"vectorSimpleHybrid",
"inScope": True,
"roleInformation": AZURE_OPENAI_SYSTEM_MESSAGE,
"topNDocuments": NR_DOCUMENTS,
"strictness": STRICTNESS
}
}
]
},
stream=True,
)
for chunk in response:
delta = chunk.choices[0].delta
yield delta
注意: ContentFields 和 VectorFields 需要是列表而不是字符串,因为这里可以有多个字段。这就是为什么我们需要将其转换为列表。