调用 OpenAI 完成端点时如何从 AI-Search 文档获取正确的上下文

问题描述 投票:0回答:2

我找到了这个文档关于使用 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 搜索索引中的字段。然后它也正确显示在示例聊天应用程序中。

如何使用上面引用的代码示例在我的代码中实现相同的目标?

python azure-cognitive-services openai-api azure-openai
2个回答
0
投票

根据提供的信息,生成的索引似乎需要正确的格式。 您可以查看此示例笔记本作为参考,以使用 URL 和其他详细信息创建索引。

enter image description here

生成包含所有必需详细信息的索引后,您将能够使用 azure openai 端点获得相关结果。

enter image description here


0
投票

我自己找到了解决方案。因此,您不需要为 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

注意: ContentFieldsVectorFields 需要是列表而不是字符串,因为这里可以有多个字段。这就是为什么我们需要将其转换为列表。

© www.soinside.com 2019 - 2024. All rights reserved.