提高 AI 助手响应准确性的方法:利用知识库和重排序模型优化 Amazon Bedrock 机器学习

更新时间: 2026-01-27 14:18:38 浏览:29

利用知识库提升 Amazon Bedrock 上 AI 助手的响应准确性

关键要点

AI 聊天机器人和虚拟助手越来越受欢迎,主要受益于大型语言模型LLMs的突破。利用检索增强生成RAG和重新排序模型这两种技术能够显著提升聊天机器人响应的准确性。本文探讨如何通过 Amazon Bedrock 的知识库来实施这两种方法,以及相关流程和效果评估。

AI 聊天机器人和虚拟助手因大型语言模型LLMs的突破而变得愈发流行。这些模型通过大量的数据集进行训练,结构设计中融合了记忆组件,使其能够理解和理解文本上下文。

聊天助手最常见的应用场景包括:提升客户体验、增强员工的生产力与创造力、优化业务流程,比如客服支持、故障排除以及基于知识库的内部和外部搜索。

尽管具备这些能力,但聊天机器人的一个主要挑战是生成高质量和准确的响应。解决这一挑战的一种方式是使用检索增强生成RAG。RAG 是优化 LLM 输出的一种过程,它在生成响应之前引用权威知识库。在 RAG 的基础上,重新排序模型旨在通过对来自检索器的结果集进行重新排序来提升搜索的相关性。本文将解释如何使用 RAG 和重新排序这两种技术来提升聊天机器人的响应质量,特别是利用 Amazon Bedrock 的知识库。

解决方案概述

RAG 是一种结合了知识库检索和生成模型的文本生成技术。它的工作原理是先从数据库中检索相关响应,然后再将这些响应作为上下文输入给生成模型,以产生最终输出。使用 RAG 方法构建聊天机器人有很多优点。例如,在生成响应之前,从数据库中检索响应可以提供更相关和连贯的答复,从而改善对话流。相比纯生成模型,RAG 在面对更多数据时扩展性更佳,且在知识库添加新数据时无需对模型进行微调。此外,检索组件能够通过从数据库中提取相关背景信息来引入外部知识,从而提供基于事实、深入且知识丰富的响应。

为了找到答案,RAG 采用文档中的向量检索方法。使用向量检索的优势在于其速度和可扩展性。在 RAG 方法中,通过将知识库中的文本转换为嵌入并存储在数据库中来实现。嵌入是文档的压缩版本,由一组数值数组表示。存储完嵌入后,向量检索会查询向量数据库,根据与文档相关的向量查找相似度。 通常情况下,向量检索会根据用户问题返回最相关的前 k 个文档。然而,由于向量数据库中的相似度算法是基于向量,而不是文档,因此向量检索并不总是在前 k 个结果中返回最相关的信息。如果 LLM 没有得到最相关的上下文,这将直接影响响应的准确性。

重新排序是一种进一步提高响应的技术,通过从多个候选响应中选择最佳选项来实现。以下架构图展示了重新排序解决方案的工作原理。

在这个示例中,我们创建了一个问答解决方案,我们使用 F Scott Fitzgerald 于 1925 年创作的《了不起的盖茨比》这本书。该书可以通过 Project Gutenberg 免费获取。我们利用 Amazon Bedrock 的知识库来实施全流程的 RAG 工作流,并将嵌入上传到 Amazon OpenSearch Serverless 向量搜索集合。接着,我们使用标准 RAG 及二阶段 RAG涉及重新排序 API来retrieve 答案,并比较这两种方法的结果。

完整代码示例可以在这个 GitHub 仓库 中找到。

以下部分将逐步介绍高层次的步骤:1 准备数据集。2 使用 Amazon Bedrock LLM 生成文档问题。3 创建包含该书的知识库。4 使用知识库的 retrieve API 获取答案。5 使用 RAGAS 框架评估响应。6 再次通过运行二阶段 RAG 模式,使用知识库的 retrieve API,然后在上下文上应用重新排序。7 使用 RAGAS 框架评估二阶段 RAG 响应。8 比较这两种方法的结果和表现。

为了提升效率,我们提供了用于生成一组问题和答案的样本代码,存放在此 notebook中。这些问答对将用于 RAG 评估过程。我们强烈建议由人工验证每一个问题和答案的准确性。

接下来的部分将用代码块帮助解释主要步骤。

前提条件

要将 GitHub 仓库克隆到本地,打开终端窗口并运行以下命令:

bashgit clone https//githubcom/awssamples/amazonbedrocksamples/tree/main/rag/knowledgebases/featuresexamples/03advancedconcepts/reranking

准备数据集

从 Project Gutenberg 网站 下载书籍。在本次文章中,我们从该书创建 10 个大型文档并将其上传至 Amazon Simple Storage Service (Amazon S3):

pythontargeturl = https//wwwgutenbergorg/ebooks/64317txtutf8 # 了不起的盖茨比data = urllibrequesturlopen(targeturl)mytexts = []for line in data mytextsappend(linedecode())

docsize = 700 # 文档的大小以确定批次数量batches = mathceil(len(mytexts) / docsize)

sagemakersession = sagemakerSession()defaultbucket = sagemakersessiondefaultbucket()s3prefix = bedrock/knowledgebase/datasource

start = 0s3 = boto3client(s3)for batch in range(batches) batchtextarr = mytexts[startstart docsize] batchtext = join(batchtextarr) s3putobject( Body=batchtext Bucket=defaultbucket Key=f{s3prefix}/{start}txt ) start = docsize

为 Bedrock 创建知识库

如果你是首次使用 Amazon Bedrock 的知识库,可以查看这篇文章 Amazon Bedrock 的知识库现在支持 Amazon Aurora PostgreSQL 和 Cohere 嵌入模型,文中描述了 Amazon Bedrock 知识库如何管理全流程的 RAG 工作流。

在这一阶段,你需要使用 Boto3 客户端创建一个知识库。你可以使用 Amazon Titan Text 嵌入 v2 将文档转换为嵌入embeddingModelArn,并指定之前创建的 S3 存储桶作为数据源dataSourceConfiguration:

飞兔云加速器官网

pythonbedrockagent = boto3client(bedrockagent)response = bedrockagentcreateknowledgebase( name=knowledgebasename description=Knowledge Base for Bedrock roleArn=rolearn knowledgeBaseConfiguration={ type VECTOR vectorKnowledgeBaseConfiguration { embeddingModelArn embeddingmodelarn } } storageConfiguration={ type OPENSEARCHSERVERLESS opensearchServerlessConfiguration { collectionArn collectionarn vectorIndexName indexname fieldMapping { vectorField bedrockknowledgebasedefaultvector textField AMAZONBEDROCKTEXTCHUNK metadataField AMAZONBEDROCKMETADATA } } })knowledgebaseid = response[knowledgeBase][knowledgeBaseId]knowledgebasename = response[knowledgeBase][name]

response = bedrockagentcreatedatasource( knowledgeBaseId=knowledgebaseid name=f{knowledgebasename}ds dataSourceConfiguration={ type S3 s3Configuration { bucketArn farnawss3{bucket} inclusionPrefixes [ f{s3prefix}/ ] } } vectorIngestionConfiguration={ chunkingConfiguration { chunkingStrategy FIXEDSIZE fixedSizeChunkingConfiguration { maxTokens 300 overlapPercentage 10 } } })datasourceid = response[dataSource][dataSourceId]

response = bedrockagentstartingestionjob( knowledgeBaseId=knowledgebaseid dataSourceId=datasourceid)

从文档中生成问题

我们使用 Amazon Bedrock 上的 Anthropic Claude 生成 10 个问题及其对应的答案。这些问答数据为我们后续实施的 RAG 评估奠定基础。本步骤中生成的答案我们视为真实数据。代码示例如下:

pythonprompttemplate = 问题性质应当多样,涉及文档的不同部分。问题不应含有选项,且不应以 Q1/Q2 开头。应限制问题内容于所提供的上下文信息内。{{document}}逐步思考并注意问题的数量。您的响应应遵循如下格式:问题:问题答案:答案systemprompt = 你是一位教授。你的任务是基于给定的文档用 XML 标签包装设置 1 个即将进行的测验/考试的问题。

prompt = prompttemplatereplace({{document}} documents)temperature = 09topk = 250messages = [{role user content [{text prompt}]}]

基本推理参数

inferenceconfig = {temperature temperature maxTokens 512 topP 10}

额外的推理参数

additionalmodelfields = {topk topk}

发送消息

response = bedrockruntimeconverse( modelId=modelid messages=messages system=[{text systemprompt}] inferenceConfig=inferenceconfig additionalModelRequestFields=additionalmodelfields)print(response[output][message][content][0][text])result = response[output][message][content][0][text]qpos = [(astart() aend()) for a in list(refinditer(问题: result))]apos = [(astart() aend()) for a in list(refinditer(答案: result))]

使用知识库 API 检索答案

我们使用生成的问题,并通过 retrieve 和 converse API 从知识库中检索答案:

pythoncontexts = []answers = []

for question in questions response = agentruntimeretrieve( knowledgeBaseId=knowledgebaseid retrievalQuery={ text question } retrievalConfiguration={ vectorSearchConfiguration { numberOfResults topk } } )

retrievalresults = response[retrievalResults]localcontexts = []for result in retrievalresults    localcontextsappend(result[content][text])contextsappend(localcontexts)combineddocs = njoin(localcontexts)prompt = llmprompttemplatereplace({{documents}} combineddocs)prompt = promptreplace({{query}} question)temperature = 09topk = 250messages = [{role user content [{text prompt}]}]inferenceconfig = {temperature temperature maxTokens 512 topP 10}additionalmodelfields = {topk topk}response = bedrockruntimeconverse(    modelId=modelid    messages=messages    inferenceConfig=inferenceconfig    additionalModelRequestFields=additionalmodelfields)answersappend(response[output][message][content][0][text])

使用 RAGAS 框架评估 RAG 响应

我们现在评估基于 RAG 的效果,使用名为 RAGAS 的框架。该框架提供了一系列指标来评估不同的维度。在我们的示例中,我们基于以下维度进行响应评估:

答案相关性 该指标关注评估生成答案与给定提示的相关性。对不完整或包含冗余信息的答案会给予较低的分数。此指标通过问题和答案计算,数值范围在 01 之间,更高的分数意味着更好的相关性。答案相似度 这衡量生成答案与真实答案之间的语义相似性。此评估基于真实答案和生成的答案,分数范围为 01,较高分数表示生成的答案与真实答案更一致。上下文相关性 此指标衡量检索到的上下文的相关性,基于问题和上下文来计算。数值范围为 01,较高值表示相关性更好。答案正确性 评估答案的正确性,即生成的答案与真实答案比较的准确性。此评估依赖于真实答案和生成答案,极值范围为 01。较高分数表示生成的答案越接近真实答案。

标准 RAG 方法的 RAGAS 评估总结报告如下:

答案相关性:09006225160334027

答案相似度:07400904157096762

答案正确性:032703043056663855

上下文相关性:0024797687553157175

二阶段 RAG:检索和重新排序

通过使用 retrieveandgenerate API 得到结果后,接下来我们可以探讨通过集成重新排序模型扩展标准 RAG 方法的二阶段检索。 在 RAG 的上下文中,重新排序模型用于在检索器检索到初始上下文集之后。重新排序模型对每项结果进行评估,并根据上下文与用户查询的相似性进行重新排序。我们的示例中使用了一种强大的重新排序模型 bgererankerlarge。该模型在 Hugging Face Hub 中可用,并且商业使用时也是免费的。在以下代码中,我们利用知识库的 retrieve API,以便获得上下文并通过部署在 Amazon SageMaker 端点的重新排序模型进行重新排序。我们提供在 SageMaker 部署重新排序模型的示例代码,详见 GitHub 仓库。以下是演示二阶段检索流程的代码片段:

pythondef generatetwostagecontextanswers(bedrockruntime agentruntime modelid knowledgebaseid retrievaltopk rerankingmodel questions reranktopk=3) contexts = [] answers = [] predictor = Predictor(endpointname=rerankingmodel serializer=JSONSerializer() deserializer=JSONDeserializer()) for question in questions retrievalresults = twostageretrieval(agentruntime knowledgebaseid question retrievaltopk predictor reranktopk) localcontexts = [] documents = [] for result in retrievalresults localcontextsappend(result)

    contextsappend(localcontexts)    combineddocs = njoin(localcontexts)    prompt = llmprompttemplatereplace({{documents}} combineddocs)    prompt = promptreplace({{query}} question)    temperature = 09    topk = 250    messages = [{role user content [{text prompt}]}]    inferenceconfig = {temperature temperature maxTokens 512 topP 10}    additionalmodelfields = {topk topk}    response = bedrockruntimeconverse(        modelId=modelid        messages=messages        inferenceConfig=inferenceconfig        additionalModelRequestFields=additionalmodelfields    )    answersappend(response[output][message][content][0][text])return contexts answers

使用 RAGAS 框架评估二阶段 RAG 响应

我们评估由二阶段检索过程生成的答案。以下是基于 RAGAS 评估的总结报告:

提高 AI 助手响应准确性的方法:利用知识库和重排序模型优化 Amazon Bedrock 机器学习

答案相关性:0841581671275458

答案相似度:07961827348349313

答案正确