簡體   English   中英

用於數據豐富的 AWS Kendra PreHook Lambda

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM