[英]AWS Kendra PreHook Lambdas for Data Enrichment
我正在使用 Kendra 和 Salesforce 進行 POC。該連接器允許我連接到我的 Salesforce Org 和索引知識文章。 我已經能夠設置它,並且它目前正在按預期工作。
我想引入一些自定義字段和數據點,以幫助進一步豐富數據。 其中之一是附加答案/正文,其中將包含搜索的關鍵信息。
我的數據源中的這個字段是包含 HTML 的富文本,通常大於 2048 個字符,這個限制似乎強加在 Kendra 中的字符串數據字段中。
我遇到了兩個內置的掛鈎,用於豐富前后數據。 我的想法是,我可以使用 pre hook 剝離 HTML 標簽並在該字段存儲在索引中之前截斷該字段。
掛鈎參考: https://docs.aws.amazon.com/kendra/latest/dg/API_CustomDocumentEnrichmentConfiguration.html
當前設置:
我在索引中添加了一個名為sf_answer_preview
的新字段。 然后我將數據源中的這個字段映射到 Salesforce 組織中的富文本字段。
如果我按原樣運行它,它將為 1,000 篇文章中的大約 200 篇編制索引,並給出一個錯誤,指出其余文章超過該字段中的 2048 個字符限制,這就是我嘗試設置豐富內容的原因。
我在我的數據源上設置了上述豐富內容。 我指定了一個 lambda 在預提取中使用,並且沒有額外的過濾,所以在每篇文章上運行它。 我不是 100% 確定 S3 存儲桶的用途,因為我使用的是數據源,但它似乎是必需的,所以我也添加了它。
對於我的 lambda,我創建了以下內容:
exports.handler = async (event) => {
// Debug
console.log(JSON.stringify(event))
// Vars
const s3Bucket = event.s3Bucket;
const s3ObjectKey = event.s3ObjectKey;
const meta = event.metadata;
// Answer
const answer = meta.attributes.find(o => o.name === 'sf_answer_preview');
// Remove HTML Tags
const removeTags = (str) => {
if ((str===null) || (str===''))
return false;
else
str = str.toString();
return str.replace( /(<([^>]+)>)/ig, '');
}
// Truncate
const truncate = (input) => input.length > 2000 ? `${input.substring(0, 2000)}...` : input;
let result = truncate(removeTags(answer.value.stringValue));
// Response
const response = {
"version" : "v0",
"s3ObjectKey": s3ObjectKey,
"metadataUpdates": [
{"name":"sf_answer_preview", "value":{"stringValue":result}}
]
}
// Debug
console.log(response)
// Response
return response
};
根據此處描述的 lambda 的合同,它看起來非常簡單。 我訪問該事件,在數據中找到名為sf_answer_preview
的字段(來自 Salesforce 的富文本字段),然后我將該值刪除並截斷為 2,000 個字符。
對於響應,我告訴它將該字段更新為新的格式化答案,以使其符合字段限制。
我在lambda中記錄數據時,預提取事件詳情如下:
{
"s3Bucket": "kendrasfdev",
"s3ObjectKey": "pre-extraction/********/22736e62-c65e-4334-af60-8c925ef62034/https://*********.my.salesforce.com/ka1d0000000wkgVAAQ",
"metadata": {
"attributes": [
{
"name": "_document_title",
"value": {
"stringValue": "What majors are under the Exploratory track of Health and Life Sciences?"
}
},
{
"name": "sf_answer_preview",
"value": {
"stringValue": "A complete list of majors affiliated with the Exploratory Health and Life Sciences track is available <a href=\"https://cls.asu.edu/exploratory-health-and-life-sciences\" target=\"_blank\">online</a>. This track allows you to explore a variety of majors related to the health and life science professions. For more information, please visit the <a href=\"https://cls.asu.edu/exploratory\" target=\"_blank\">Exploratory program</a> description. "
}
},
{
"name": "_data_source_sync_job_execution_id",
"value": {
"stringValue": "0fbfb959-7206-4151-a2b7-fce761a46241"
}
},
]
}
}
問題:
運行時,我仍然收到內容超出字符限制的相同字段限制錯誤。 當我在原始數據上運行 lambda 時,它會按預期剝離和截斷它。 我在想 lambda 中的響應出於某種原因沒有將字段值正確設置為新內容,並且仍然嘗試直接使用 Salesforce 中的數據,從而引發錯誤。
之前有沒有人為 Kendra 設置過 lambda,可能知道我做錯了什么? 這似乎很常見,能夠在 PII 信息被編入索引之前執行諸如剝離 PII 信息之類的操作,因此我必須在某個地方稍微偏離我的設置。
有什么想法嗎?
由於您仍在將富文本作為文檔的元數據文件傳遞,因此字符限制仍然適用,因此文檔將在 API 調用的驗證步驟失敗,並且不會到達豐富步驟。 解決方法是以某種方式將 append 這些富文本字段添加到文檔正文中,以便您的 lambda 可以在那里訪問它。 但是,如果這些字段是從您的數據源為您的文檔自動生成的,那可能並不容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.