使用一个生成型AI基础模型,利用自己的数据进行摘要和问答

使用生成型AI模型进行摘要和问答

大型语言模型(LLM)可以用于分析复杂文档并提供摘要和问题答案。在《在Amazon SageMaker JumpStart中对金融数据进行基础模型的领域自适应微调》一文中,描述了如何使用自己的数据集对LLM进行微调。一旦您拥有了一个可靠的LLM,您将希望将其暴露给业务用户以处理新文档,这些文档可能有数百页长。在本文中,我们演示了如何构建一个实时用户界面,让业务用户处理任意长度的PDF文档。文件处理完成后,您可以对文档进行摘要或提问内容相关的问题。本文中描述的示例解决方案可在GitHub上获得。

处理财务文件

财务报表,如季度盈利报告和股东年度报告,通常有数十页或数百页长。这些文件包含许多模板化的语言,如免责声明和法律语言。如果您想从这些文件中提取关键数据点,您需要时间和对模板化语言的一定熟悉,以便能够识别出有趣的事实。当然,您不能向LLM提问关于它从未见过的文档的问题。

用于摘要的LLM对传入模型的标记(字符)数量有限制,除了一些例外情况外,通常不超过几千个标记。这通常排除了对长文档进行摘要的能力。

我们的解决方案处理超过LLM最大标记序列长度的文档,并使该文档可用于LLM进行问题回答。

解决方案概述

我们的设计有三个重要组成部分:

  • 它有一个交互式的Web应用程序,供业务用户上传和处理PDF文档
  • 它使用langchain库将大型PDF拆分为更易处理的块
  • 它使用检索增强生成技术,让用户对LLM之前从未见过的新数据提问

如下图所示,我们使用用React JavaScript实现的前端应用程序,托管在Amazon Simple Storage Service(Amazon S3)存储桶中,由Amazon CloudFront提供支持。前端应用程序允许用户将PDF文档上传到Amazon S3。上传完成后,您可以触发由Amazon Textract提供支持的文本提取作业。在后处理过程中,AWS Lambda函数会向文本中插入特殊标记,指示页面边界。当作业完成后,您可以调用API对文本进行摘要或提问相关问题。

由于其中一些步骤可能需要一些时间,架构使用了分离的异步方法。例如,调用摘要文档的操作会触发一个Lambda函数,该函数会向Amazon Simple Queue Service(Amazon SQS)队列发布一条消息。另一个Lambda函数会接收该消息,并启动一个Amazon Elastic Container Service(Amazon ECS)AWS Fargate任务。Fargate任务调用Amazon SageMaker推理端点。我们在这里使用Fargate任务,因为摘要非常长的PDF可能需要比Lambda函数可用的时间和内存更多。当摘要完成后,前端应用程序可以从Amazon DynamoDB表中获取结果。

对于摘要,我们使用AI21的Summarize模型,它是通过Amazon SageMaker JumpStart提供的基础模型之一。尽管该模型可以处理长达10,000个单词(约40页)的文档,但我们使用langchain的文本拆分器确保每次对LLM的摘要调用不超过10,000个单词。对于文本生成,我们使用Cohere的VoAGI模型,并通过JumpStart使用GPT-J进行嵌入。

摘要处理

在处理较大的文档时,我们需要定义如何将文档拆分为较小的片段。当我们从Amazon Textract获取文本提取结果时,我们在较大的文本块(可配置的页数)以及单个页面和换行符之间插入标记。Langchain将根据这些标记进行拆分,并组装出不超过标记限制的较小文档。请参阅以下代码:

text_splitter = RecursiveCharacterTextSplitter(
      separators = ["<CHUNK>", "<PAGE>", "\n"],
         chunk_size = int(chunk_size),
         chunk_overlap  = int(chunk_overlap))

 with open(local_path) as f:
     doc = f.read()
 texts = text_splitter.split_text(doc)
 print(f"拆分数量:{len(texts)}")


 llm = SageMakerLLM(endpoint_name = endpoint_name)

 responses = []
 for t in texts:
     r = llm(t)
     responses.append(r)
 summary = "\n".join(responses)

LLM在摘要链中是我们SageMaker端点的一个薄包装:

class SageMakerLLM(LLM):

endpoint_name: str
    
@property
def _llm_type(self) -> str:
    return "summarize"
    
def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
    response = ai21.Summarize.execute(
                      source=prompt,
                      sourceType="TEXT",
                      sm_endpoint=self.endpoint_name
    )
    return response.summary 

问答

在检索增强生成方法中,我们首先将文档分成较小的片段。我们为每个片段创建嵌入并通过langchain的接口将它们存储在开源的Chroma向量数据库中。我们将数据库保存在Amazon Elastic File System(Amazon EFS)文件系统中以供以后使用。请参见以下代码:

documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size = 500,
                                                chunk_overlap  = 0)
texts = text_splitter.split_documents(documents)
print(f"分割数量:{len(texts)}")

embeddings = SMEndpointEmbeddings(
    endpoint_name=endpoint_name,
)
vectordb = Chroma.from_documents(texts, embeddings, 
    persist_directory=persist_directory)
vectordb.persist()

当嵌入准备就绪后,用户可以提问。我们在向量数据库中搜索与问题最接近的文本片段:

embeddings = SMEndpointEmbeddings(
    endpoint_name=endpoint_embed
)
vectordb = Chroma(persist_directory=persist_directory, 
embedding_function=embeddings)
docs = vectordb.similarity_search_with_score(question)

我们选择最匹配的片段,并将其用作回答问题的文本生成模型的上下文:

cohere_client = Client(endpoint_name=endpoint_qa)
context = docs[high_score_idx][0].page_content.replace("\n", "")
qa_prompt = f'Context={context}\nQuestion={question}\nAnswer='
response = cohere_client.generate(prompt=qa_prompt, 
                                  max_tokens=512, 
                                  temperature=0.25, 
                                  return_likelihoods='GENERATION')
answer = response.generations[0].text.strip().replace('\n', '')

用户体验

尽管LLM代表着先进的数据科学,但大多数LLM的用例最终涉及与非技术用户的交互。我们的示例Web应用程序处理了业务用户可以上传和处理新PDF文档的交互式用例。

下图显示了用户界面。用户首先上传PDF。文档存储在Amazon S3中后,用户可以开始进行文本提取作业。完成后,用户可以调用摘要任务或提问。用户界面公开了一些高级选项,如块大小和块重叠,这对于正在测试新文档上的应用程序的高级用户非常有用。

下一步

LLM提供了重要的新的信息检索功能。业务用户需要方便地访问这些功能。有两个方向可以考虑未来的工作:

  • 利用Jumpstart基础模型中已有的强大LLM。通过几行代码,我们的示例应用程序可以部署并利用AI21和Cohere的先进LLM进行文本摘要和生成。
  • 让非技术用户也能够使用这些功能。处理PDF文档的先决条件是从文档中提取文本,并且摘要作业可能需要几分钟才能运行。这需要一个具有异步后端处理能力的简单用户界面,使用Lambda和Fargate等云原生服务设计起来很容易。

我们还注意到,PDF文档是半结构化信息。由于它们依赖于字体大小和其他视觉指标,因此很难以编程方式识别重要的提示,如节标题。识别信息的基本结构可以帮助LLM更准确地处理数据,至少在LLM能够处理无限长度的输入之前。

结论

在本文中,我们展示了如何构建一个交互式的Web应用程序,让业务用户上传和处理PDF文档进行摘要和问题回答。我们看到了如何利用Jumpstart基础模型来访问高级LLMs,并使用文本分割和检索增强生成技术来处理更长的文档,并将它们作为信息提供给LLM。

在当前阶段,没有理由不将这些强大的功能提供给您的用户。我们鼓励您立即开始使用Jumpstart基础模型。