亚马逊AWS官方博客

《基于智能搜索和大模型打造企业下一代知识库》之《Amazon Kendra 集成》

感谢大家阅读《基于智能搜索和大模型打造企业下一代知识库》系列博客,全系列分为 5 篇,将为大家系统性地介绍新技术例如大语言模型如何赋能传统知识库场景,助力行业客户降本增效。更新目录如下:

第一篇《典型实用场景及核心组件介绍》

第二篇《手把手快速部署指南》

第三篇《Langchain 集成及其在电商的应用》

第四篇《制造/金融/教育/医疗等行业实战场景》

第五篇《Amazon Kendra 集成》(本篇)

背景

本篇是该系列博客的最后一篇,将为大家介绍如何将 Amazon Kendra 接入大语言模型,从而实现智能搜索。

Amazon Kendra 是一项由机器学习(ML)提供支持的企业搜索服务。Kendra 内置数据源连接器,支持快速访问 Amazon S3、AmazonRDS、AmazonFSX 以及其他外部数据源,帮助用户自动提取文档并建立索引。Kendra 支持超过 30 多种多国语言,支持简体中文与繁体中文。

Amazon Kendra 与 Amazon OpenSearch 比较

Kendra 和 OpenSearch 都可以用作搜索引擎,在二者的选择上,我们建议可以从两个方面进行考虑:

  • 按搜索内容:如果搜索内容是以非结构化的、主要是人工生成的内容(例如客服网站、指导文档、专利、票据等各式文档)——并且需要更高的准确性、获得类似互联网搜索的基于自然语言的搜索体验,Kendra 可能是更佳的选择。反之,如果搜索内容为结构化的、主要由机器生成的内容(例如日志、目录和数据库搜索),OpenSearch Service 则更适合。
  • 按搜索需求:如果需要外部连接器、UI 和 OOTB 功能的完全托管搜索服务的客户,尤其是目前已经在使用其他商业文本搜索产品(例如 Coveo、Lucidworks、Sinequa、Attivio、Mindbreeze Inspire 和 Algolia)对客户,我们建议选择 Kendra。对于希望获得最大灵活性和能够访问功能的构建者,OpenSearch 更适合。

Amazon Kendra 适用场景

    • 目前 Kendra 可支持繁体中文与简体中文的语意搜索,还可以通过了解文章或 FAQ 语义内容撷取答案回复用户。此外 Kendra 还支持同义字检索,查询建议与拼字检查,但相关功能目前只支持英文,建议如果要使用全功能的部分,以英文搜索为主。针对出海用户的多语言搜索场景,使用 Kendra 可以加速建置流程。
    • Kendra 目前支持数十种不同的连接器(Connector),包含 S3,RDS 与外部的 Atlassian Confluence,Jira,Web Crawler 等,协助客户快速接入数据到 Kendra 进行搜索,减少用户在资料接入的负担。假设用户所在的搜索资料来源种类较多,建议可以考虑使用 Kendra 来加速搜索。
    • Kendra 支持自定义文件(Custom Document Enrichment),将文档引入 Kendra 时,您可以创建、修改或删除文档属性和内容。这意味着您可以根据需求操纵和获取数据。自定义文件扩充支持以下两种操作:
      • 1. 更改元数据的基本操作: 您可以使用基本逻辑来操作文档字段和内容。这包括删除字段中的值、使用条件修改字段中的值或创建字段。以下是使用基本逻辑删除名为 “Customer_ID” 的文档字段中所有客户标识号的示例。
应用基本操作之前的数据 应用基本操作后的数据
    • 2. 通过 Lambda 函数提取和更改元数据或内容:如果您想超越基本逻辑并应用高级数据操作,可以结合 Lambda 函数进行实现,同时借助 Lambda 还可以快速其他 AWS 服务。例如,使用光学字符识别(OCR),它解析图像中的文本,并将每张图像视为文本文档。或者使用 Amazon Transcribe 将视频內容转成文字后写入 Kendra。
  • 相较于单一文件搜索的 Query API,Kendra 还提供专为 RAG 使用案例设计的 Retrieve API。使用 Retrieve API,您可以检索最多 100 个语义相关的段落,每个段落最多 200 个标记词,按相关性排序。这些段落是可以从多个文档和同一文档的多个部分中语义提取的文本摘录。针对提供搜索资料给大语言模型进行解析出准确的结果,有更大的助益。
    不过 Kendra 在同义字设定,拼字矫正等功能的支持方面以英文检索为主,且与其他 AI 服务的搭配使用时需要考量语系的搭配。我们建议在出海场景,选定适当的语系和文件来源多样化的情况下,在写入索引器之前配置适当的文字处理工作,利用 Kendra 自动创建索引的能力可以达到最大程度的优化效果。

基于智能搜索的大语言模型增强解决方案指南

结合 LangChain 的各类功能接口和亚马逊云科技的基础服务,我们构建了亚马逊云科技基于智能搜索的大语言模型增强解决方案指南,架构图如下,在支持 OpenSearch 的同时,也同步支持 Kendra 服务(根据实际场景二选一即可)。

如前面几篇博客提到,生成式人工智能应用程序需要根据用户请求和所使用的特定 LLM 来设计提示(Prompt),才能获得最佳的结果。对话式人工智能应用程序还需要管理聊天历史记录和上下文。生成式人工智能应用程序开发人员可以使用 LangChain 等开源框架,该框架提供与所选 LLM 集成的模块,以及用于聊天记录管理和提示工程等活动的编排工具。AWS 提供了 Kendra Retriever 类,它实现了 LangChain 检索器接口,应用程序可以将其与其他 LangChain 接口结合使用,以从 Kendra 索引检索到最正确的数据。 针对 Kendra Retriever 的详细介紹,请参考此处

通过 LangChain KendraRetriever 检索 Kendra 内容用于知识库问答的伪代码如下:

retriever = AmazonKendraRetriever(index_id=kendra_index_id,top_k=top_k)
chain = ConversationalRetrievalChain.from_llm(
                    llm = llm,
                    chain_type=chain_type,
                    retriever=retriever,
                    condense_question_prompt = condense_question_prompt,
                    combine_docs_chain_kwargs = combine_docs_chain_kwargs,
                    return_source_documents = True,
                    return_generated_question = True
                )
result = chain({"question": query, "chat_history": history})
answer=result['answer']

通过指定 Kendra 的 index id,构建用于检索文本的 Retriever 接口,后续的问答流程均通过该接口检索相关文本。

如何在智能搜索解决方案中使用 Amazon Kendra

根据之前《手把手快速部署指南》,本次主要以针对在部署 Kendra 时所需要的步骤与部属的细节。

打开 deployment /cdk.json, 如果需要部署 Kendra,修改 search_engine_kendra 为 true,search_engine_opensearch 为 false。

    "notebook_deployment": true,
    "search_engine_opensearch":true,
    "search_engine_kendra":false,
    "execution_role_name": "custom-role-document-ai-upload-to-s3",
    "table_name": "FeedbackRecordsSEWCFAQ",
    "apigateway_name": "intelligent-search-file-management",
    "index": "smart_search_qa_test",
    "embedding_endpoint_name": "huggingface-inference-eb",
    "llm_embedding_name": "pytorch-inference-llm-v1",
    "language": "chinese"

针对 Kendra 的整合,不需要额外进行 embedded的处理,只需进行大语言模型部署,语意识别与搜索的的部分会由 Kendra 来进行处理,大模型的部属方式可参考《手把手快速部署指南》内的教学,相关部署脚本在 Jupyter Notebook LLM_Model/ 目录下,确保大模型能顺利运行。

针对需要搜索的资料,可以将资料直接上传至 Amazon Kendra 资料来源的 S3 储存桶,在 S3 资源页找到 cdk 所创建的 S3 储存桶。

上传完毕后,回到 Amazon Kendra index 进行资料同步。

确认资料是否能够在 Kendra 内部正常搜索。

通过 gradio 进行相关搜索,进行 Amazon Kendra 整合的相关验证。

结论

由大型语言模型提供的生成式人工智能正在改变人们从信息中获取和应用见解的方式 。然而对于企业客户,必须使用检索增强生成方法根据企业内容生成见解,确保回答资料的准确性。Kendra 提供开箱即用的高精度语义搜索结果的功能,借助其 Retrieve API(专为 RAG 设计)、全面的数据源连接器生态系统、对常见文件格式的支持以及安全性,您可以快速开始部署自己的智能搜索应用。

本篇作者

蔣宗恩

亚马逊云科技行业解决方案架构师,主要领域包含制造业,零售与 ESG。曾就职于台积电/微软,负责制造业公司混合云架构设计与运为管理。目前针对制造业影像处理,时序数据分析,ESG 等相关解决方案等在台湾业务的推广。

何波

亚马逊云科技行业解决方案架构师,曾就职于阿里六年,负责推荐算法,搜索算法和多模态匹配算法的开发工作,在电商行业各种场景的机器学习模型应用工作有丰富的经验。

徐鹏

亚马逊云科技汽车行业解决方案架构师,拥有十余年国际整车企业自动驾驶与电子电器的研发经验,曾担任高阶自动驾驶大数据测试与验证负责人,包括大数据采集、大数据仿真验证、大数据分析与机器学习等方案的设计与实现。目前专注于自动驾驶、车联网、软件定义汽车等业务。