У меня есть следующий набор навыков aisearch, который берет документ из хранилища BLOB-объектов Azure и разбивает его на фрагменты, которые позже индексируются для поиска AI.
{
"@odata.context": "https://ahaisearch.search.windows.net/$metadata#skillsets/$entity",
"@odata.etag": "...",
"name": "ai-product-skillset",
"description": null,
"skills": [
{
"@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
"name": "ai-product-skillset",
"description": null,
"context": "/document/content",
"uri": "https://test.openai.azure.com/openai/preprocessing-jobs?api-version=2023-03-31-preview",
"httpMethod": "POST",
"timeout": "PT1M",
"batchSize": 10,
"degreeOfParallelism": 10,
"authResourceId": null,
"inputs": [
{
"name": "document_id",
"source": "/document/document_id"
},
{
"name": "filename",
"source": "/document/filename"
},
{
"name": "fieldname",
"source": "='content'"
},
{
"name": "text",
"source": "/document/content"
},
{
"name": "url",
"source": "/document/url"
}
],
"outputs": [
{
"name": "recordId",
"targetName": "recordId"
}
],
"httpHeaders": {
"ingestion-request-id": "...",
"original-request-id": "ai-product",
"original-internal-id": "...",
"num-tokens": "1024",
"api-key": "...",
"connection-string": "DefaultEndpointsProtocol=https;AccountName=...;AccountKey=...;EndpointSuffix=core.windows.net",
"container-name": "ai-product-chunks"
},
"authIdentity": null
}
],
"cognitiveServices": null,
"knowledgeStore": null,
"indexProjections": null,
"encryptionKey": null
}
Я хочу добавить поле метаданных к результату, чтобы фрагменты файла результата создавались с такими метаданными, как originalFile : file_name.pdf. Возможно ли это сделать в наборе навыков или требуется дополнительный уровень?


Задания предварительной обработки OpenAI https://test.openai.azure.com/openai/preprocessing-jobs?api-version=2023-03-31-preview выполняют только фрагментацию и возвращают только те фрагменты, в которых у вас не будет подробностей метаданных.
Итак, вы можете использовать собственный веб-API, который принимает содержимое документа, метаданные и т. д. и возвращает фрагмент и метаданные.
Ниже приведен пример кода приложения функции Azure, который вам нужно написать.
import azure.functions as func
import logging
import requests
app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@app.route(route = "http_trigger")
def http_trigger(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
#get the content and metadata from request.
req_body = req.get_json()
values = req_body.get('values')
res=[]
for i in values:
tmp=i
t = {
'chunk': #Do chunking on i['data']['content'],
'originalFile':i['data']['metadata_filename']
}
tmp['data'] = t
res.append(tmp)
if res:
return func.HttpResponse(json.dumps({"values": res}), mimetype = "application/json")
и выполнять сопоставления в индексаторе.
Обратитесь к этому решению стека о том, как сопоставить поля.
Здесь для каждого recordId вы получите несколько фрагментов. Чтобы получить отдельный фрагмент с именем файла, вы создаете вторичный индекс и выполняете индексные проекции.
В этом случае вы возвращаете только чанк и метаданные, которые не нужны recordId.
Узнайте больше о индексной проекции здесь.
Рад, что вы узнали об этом подходе, и надеюсь, что мое решение также помогло вам.
Спасибо! Это похоже на то, что у меня получилось)