印度语言的RAG与Cohere多语言嵌入及Anthropic Claude 3在亚马逊Bedrock上的应用
by Rony Roy于2024年7月1日发表于亚马逊Bedrock、亚马逊机器学习、亚马逊SageMaker Studio、生成性人工智能、中级(200) 永久链接 评论 分享
关键要点
印度语言的内容创建面临的挑战主要在于传统方法无法有效处理非结构化数据。使用Cohere多语言嵌入及Anthropic Claude 3模型,可以实现多语言检索增强生成(RAG)的应用。本文使用Flores数据集展示了如何在多种印度语言中进行有效的生成任务。在媒体和娱乐行业,企业需要为多语言受众提供各种内容,以满足各类受众的需求。这些企业积累了大量的数据,其中大部分为非结构化文本和图像。传统上,分析这些非结构化数据并生成新内容的方法依赖于关键词或同义词匹配,但这些方法并不能充分捕获文档的语义上下文,因此对于用户的搜索、内容创建等多种任务的效果有限。
文本嵌入利用机器学习(ML)技术来捕捉非结构化数据的本质。这些嵌入是通过将自然语言文本映射为其数值表示而生成的,从而在过程中编码了自然语言文档中的上下文信息。生成文本嵌入是许多由大语言模型(LLMs)提供支持的自然语言处理(NLP)应用的第一步,例如检索增强生成(RAG)、文本生成、实体提取等多种业务流程。
尽管大型语言模型(LLMs)的流行程度和能力正在上升,但与LLMs进行对话时最常使用的语言往往是英语。尽管在将开源模型适配为能理解和响应印度语言方面取得了进展,但这些努力仍未能达到大型、最先进LLMs在英语语言能力方面的水平,这使得在基于印度语言的RAG应用中采用此类模型变得困难。
在本文中,我们展示了一个可以利用Cohere Embed Multilingual模型和Anthropic Claude 3在亚马逊Bedrock上进行多种印度语言搜索和查询的RAG应用。本文聚焦于印度语言,但您可以将该方法用于LLM支持的其他语言。
解决方案概述
我们使用Flores数据集 [1],这是一个用于英语与低资源语言间机器翻译的基准数据集,同时也作为平行语料库,即将文本翻译成一种或多种语言的文本集合。
借助Flores数据集,我们可以展示嵌入以及随后从检索器中获取的文档,都是与用多种语言提出的相同问题相关的。然而,由于数据集的稀缺性每种语言约有1000行,涵盖200多种语言,因此可以对数据集提出的问题的性质和数量是有限的。
下载数据后,将其加载到pandas数据框中进行处理。此演示将限制在孟加拉语、卡纳达语、马拉雅拉姆语、泰米尔语、特伦甘纳语、印地语、马拉地语和英语。如果您希望将此方法用于其他语言,请确保这些语言均由所用的嵌入模型和用于RAG设置的LLM支持。
使用如下代码加载数据:
pythonimport pandas as pd

dfben = pdreadcsv(/data/Flores/dev/devbenBeng sep=t)dfkan = pdreadcsv(/data/Flores/dev/devkanKnda sep=t)dfmal = pdreadcsv(/data/Flores/dev/devmalMlym sep=t)dftam = pdreadcsv(/data/Flores/dev/devtamTaml sep=t)dftel = pdreadcsv(/data/Flores/dev/devtelTelu sep=t)dfhin = pdreadcsv(/data/Flores/dev/devhinDeva sep=t)dfmar = pdreadcsv(/data/Flores/dev/devmarDeva sep=t)dfeng = pdreadcsv(/data/Flores/dev/devengLatn sep=t)
如果需要,可以选择更多/更少的语言
dfallLangs = pdconcat([dfben dfkan dfmal dftam dftel dfhin dfmar dfeng] axis=1)dfallLangscolumns = [孟加拉语 卡纳达语 马拉雅拉姆语 泰米尔语 特伦甘纳语 印地语 马拉地语 英语]
dfallLangsshape #(9968)
df = dfallLangsstackeddf = dfstack()resetindex() # 为了方便处理
选择所需列,并进行重命名
stackeddf = stackeddfiloc[ [1 2]]stackeddfcolumns = [语言 文本]
Cohere多语言嵌入模型
Cohere是一个领先的企业人工智能(AI)平台,构建世界级的LLMs和基于LLM的解决方案,使计算机能够搜索、捕捉意义并进行文本对话。它们提供易用性和强安全隐私控制。
一元机场免费Cohere Embed Multilingual模型生成超过100种语言的文档向量表示,现已在亚马逊Bedrock上可用。通过亚马逊Bedrock,您可以通过API调用访问嵌入模型,这消除了管理基础设施的需要,并确保敏感信息得到安全管理和保护。
多语言嵌入模型通过将相似意义的文本分组到语义向量空间的相近位置来实现。开发人员可以处理多种语言的文本,而无需在不同模型之间切换。这提高了处理的高效性,并提升了多语言应用程序的性能。
文本嵌入将非结构化数据转换为结构化形式。这使得您可以客观地对比、剖析并从所有这些文档中获取见解。Cohere的新嵌入模型包含一个新的必需输入参数inputtype,每次API调用时都必须设置为以下四个值之一,这些值对应于文本嵌入的最常见用例:
inputtype=searchdocument 用于您希望存储在向量数据库中的文本文档inputtype=searchquery 用于检索您向量数据库中最相关的文档inputtype=classification 如果将嵌入用作分类系统的输入,请使用此参数inputtype=clustering 如果将嵌入用于文本聚类,请使用此参数使用这些输入类型可以为特定任务提供最高的质量。如果您希望将嵌入用于多种用例,建议使用inputtype=searchdocument。
前提条件
要在此数据集上使用Claude 3 Sonnet LLM和Cohere多语言嵌入模型,请确保您在AWS帐户中可以访问亚马逊Bedrock下的模型访问部分,然后安装以下软件包。以下代码已通过亚马逊SageMaker数据科学30镜像进行测试,并支持mlt3medium实例。
python! aptget update ! aptget install buildessential y # 用于下面的hnswlib包! pip install hnswlib
创建搜索索引
满足所有前提条件后,现在可以将多语言语料库转换为嵌入并存储在hnswlib中。hnswlib是一个只需要头文件的C分层可导航小世界(HNSW)实现,并带有Python绑定、插入和更新。HNSWLib是一个内存向量存储,可以保存到文件中,对于我们正在处理的小数据集来说,这应该是足够的。使用以下代码:
pythonimport hnswlibimport osimport jsonimport botocoreimport boto3
boto3bedrock = boto3client(bedrock)bedrockruntime = boto3client(bedrockruntime)
创建搜索索引
index = hnswlibIndex(space=ip dim=1024)indexinitindex(maxelements=10000 efconstruction=512 M=64)
alltext = stackeddf[text]tolist()alltextlang = stackeddf[language]tolist()
嵌入和索引文档
要嵌入和存储小型多语言数据集,请使用Cohere embedmultilingualv30模型,通过亚马逊Bedrock运行时API创建具有1024维的嵌入:
pythonmodelId=cohereembedmultilingualv3contentType= application/jsonaccept = /
dfchunksize = 80chunkembeddings = []for i in range(0 len(alltext) dfchunksize) chunk = alltext[iidfchunksize] body=jsondumps( {texts chunk inputtype searchdocument} # 搜索文档 ) response = bedrockruntimeinvokemodel(body=body modelId=modelId accept=accept contentType=contentType) responsebody = jsonloads(responseget(body)read()) indexadditems(responsebody[embeddings])
验证嵌入是否有效
为了测试该解决方案,编写一个函数以接受查询作为输入,嵌入它,并找到与之最相关的前N个文档:
python
检索与查询最接近的N个文档
def retrieval(query numdocstoreturn=10) modelId=cohereembedmultilingualv3 contentType= application/json accept = / body=jsondumps( {texts [query] inputtype searchquery} # 搜索查询 ) response = bedrockruntimeinvokemodel(body=body modelId=modelId accept=accept contentType=contentType) responsebody = jsonloads(responseget(body)read()) docids = indexknnquery(responsebody[embeddings] k=numdocstoreturn)[0][0] print(f查询 {query} n) retrieveddocs = []
for docid in docids # 添加结果 retrieveddocsappend(alltext[docid]) # 原始方言语言文档 # 打印结果 print(f原始Flores文本 {alltext[docid]}) print( 30)print(结果结束 nn)return retrieveddocs您可以使用多个语言如印地语进行几次查询,看看RAG栈的表现:
pythonqueries = [ ]
翻译:告诉我关于印度河流域文明的信息
for query in queries retrieval(query)
索引将返回与搜索查询相应的文档,涵盖不同语言:
plaintext查询
原始Flores文本
原始Flores文本
原始Flores文本 1920
原始Flores文本
原始Flores文本
原始Flores文本 的一段考古遗址,其中包括现代巴基斯坦的大部分和北部印度以及东北阿富汗的一些区域。
现在,您可以使用从索引中检索到的文档作为上下文,在亚马逊Bedrock上调用Anthropic Claude 3 Sonnet模型。在生产环境中,对于远大于Flores数据集的数据集,可以通过使用Cohere的Rerank模型使搜索结果更加相关。
使用系统提示说明您希望LLM如何处理查询:
python
检索与查询相关的文档
def contextretrieval(query numdocstoreturn=10)
modelId=cohereembedmultilingualv3contentType= application/jsonaccept = /body=jsondumps( {texts [query] inputtype searchquery} # 搜索查询) response = bedrockruntimeinvokemodel(body=body modelId=modelId accept=accept contentType=contentType)responsebody = jsonloads(responseget(body)read())docids = indexknnquery(responsebody[embeddings] k=numdocstoreturn)[0][0] retrieveddocs = []for docid in docids retrieveddocsappend(alltext[docid])return join(retrieveddocs)def queryragbedrock(query modelid = anthropicclaude3sonnet20240229v10)
systemprompt = 你是一个乐于助人的多语言助手。识别用户查询的语言,并用相同的语言回复用户的查询。例如如果用户的查询是英语,则你的回答将是英语,如果用户的查询是马拉雅拉姆语,则你的回答将是马拉雅拉姆语,如果用户的查询是泰米尔语,则你的回答将是泰米尔语依此类推如果你无法识别语言:说你无法识别语言。你只会使用在ltcontextgt lt/contextgt标签中提供的数据,以回答用户的查询,若没有数据提供在ltcontextgt lt/contextgt标签中,回应说没有足够的信息来回答问题。限制你的响应在400个单词以内,不要使用项目符号。maxtokens = 1000messages = [{role user content f 查询 {query} ltcontextgt {contextretrieval(query)} lt/contextgt }]body=jsondumps( { anthropicversion bedrock20230531 maxtokens maxtokens system systemprompt messages messages } )response = bedrockruntimeinvokemodel(body=body modelId=modelid
发表评论