施耐德电气利用SageMaker的检索增强学习模型,确保其企业资源计划(ERP)系统的实时更新
施耐德电气利用SageMaker的检索增强学习模型,实时更新企业资源计划(ERP)系统
此篇文章是与施耐德电气的北美人工智能解决方案工程与架构经理Anthony Medeiros和商业智能经理Blake Santschi合作撰写的。施耐德电气的其他专家包括Jesse Miller、Somik Chowdhury、Shaswat Babhulgaonkar、David Watkins、Mark Carlson和Barbara Sleczkowski。
企业资源规划(ERP)系统用于帮助公司在一个系统中管理会计、销售或订单管理等多个业务功能。尤其是用于存储与客户账户相关的信息。同一公司的不同组织可能使用不同的ERP系统,将它们合并是一个需要领域特定知识的复杂技术挑战。
施耐德电气是能源管理和工业自动化数字化转型的领先者。为了更好地满足客户需求,施耐德电气需要跟踪其ERP系统中相关客户账户之间的链接。随着客户群体的不断增长,每天都会新增新客户,他们的账户团队必须手动筛选这些新客户并将它们与正确的父实体关联起来。
链接决策是基于公开可用的最新信息,可能受到最近的收购、市场新闻或部门重组的影响。账户链接的一个例子是识别亚马逊和其子公司全食超市之间的关系。
施耐德电气正在使用大型语言模型来回答各种领域特定知识的问题,但模型训练的日期限制了其知识。他们通过使用一个在亚马逊SageMaker JumpStart上可用的开源大型语言模型Retriever-Augmented Generation来处理大量的外部知识,并展示ERP记录中的企业或公共关系。
在2023年初,当施耐德电气决定利用人工智能(AI)自动化其部分账户链接流程时,该公司与亚马逊AWS机器学习解决方案实验室(MLSL)合作。借助MLSL在机器学习咨询和执行方面的专业知识,施耐德电气能够开发出一种AI架构,减少他们在链接工作流中的手动工作量,并为下游分析团队提供更快的数据访问。
生成式人工智能
生成式人工智能和大型语言模型(LLMs)正在改变企业组织解决传统上与自然语言处理和理解相关的复杂挑战的方式。LLMs提供的一些好处包括能够理解大量文本并通过生成类似人类回答的响应来回答相关问题。亚马逊通过提供Amazon SageMaker JumpStart、Amazon Bedrock和Amazon Titan等多个选项,使客户能够轻松尝试和生产化LLM工作负载。
外部知识获取
LLMs以其压缩人类知识的能力而闻名,并在各种特定领域的知识问题回答中展示出了卓越的能力,但它们的知识受到模型训练日期的限制。我们通过将LLM与Google搜索API相结合,提供了一个强大的Retrieval Augmented LLM(RAG)来解决施耐德电气面临的挑战。RAG能够处理从Google搜索中获取的大量外部知识,并展示ERP记录之间的公司或公共关系。
请参考以下示例:
问题: One Medical的母公司是谁?Google搜索查询:“One Medical母公司” → 信息 → LLM回答: One Medical,亚马逊的子公司…
上述示例(来自施耐德电气客户数据库)涉及到2023年2月进行的一项收购,因此单独使用LLM无法得知该信息,因为知识被截断。通过与Google搜索相结合,扩充LLM可以保证获取最新的信息。
Flan-T5模型
在这个项目中,我们使用了Flan-T5-XXL模型(来自Flan-T5系列模型)。
Flan-T5模型经过指令调整,因此能够执行各种零样本自然语言处理任务。在我们的下游任务中,不需要适应大量的世界知识,而是需要在提供的搜索结果文本上进行良好的问题回答,因此拥有110亿参数的T5模型表现良好。
JumpStart通过Amazon SageMaker Studio和SageMaker SDK提供了方便的模型系列部署。这包括Flan-T5 Small、Flan-T5 Base、Flan-T5 Large、 Flan-T5 XL和Flan-T5 XXL。此外,JumpStart还提供了几个不同量化级别的Flan-T5 XXL版本。我们使用Amazon SageMaker Studio Jumpstart将Flan-T5-XXL部署到端点用于推断。
使用LangChain的检索增强LLM
LangChain是一个受欢迎且快速增长的框架,允许开发由LLMs驱动的应用程序。它基于”链”的概念,这些链是不同组件的组合,旨在改进给定任务的LLMs功能。例如,它允许我们自定义提示,并将LLMs与外部搜索引擎或数据源等不同工具集成。在我们的用例中,我们使用谷歌的Serper组件来搜索网络,并使用在Amazon SageMaker Studio Jumpstart上可用的Flan-T5-XXL模型进行部署。 LangChain执行整体协调,并允许将搜索结果页面输入到Flan-T5-XXL实例中。
检索增强生成(RAG)包括两个步骤:
- 从外部源中检索相关文本片段
- 将片段与提示中的上下文进行增强处理,输入LLM。
对于Schneider Electric的用例,RAG的进行如下:
- 将给定的公司名称与问题组合在一起,例如“X的母公司是谁”,其中X是给定的公司,并通过Serper AI执行谷歌查询
- 将提取的信息与提示和原始问题结合,传递给LLM以获得答案。
以下图示说明了这个过程。
使用以下代码创建一个端点:
# 创建FLAN-T5-XXL Sagemaker端点llm = SagemakerEndpoint(...)
实例化搜索工具:
search = GoogleSerperAPIWrapper()search_tool = Tool( name="Search", func=search.run, description="对于需要进行搜索的情况很有用", verbose=False)
在下面的代码中,我们将检索和增强组件链接在一起:
my_template = """使用以下信息回答以下问题。 \n问题:{question}? \n信息:{search_result} \n答案: """prompt_template = PromptTemplate( input_variables=["question", 'search_result'], template=my_template)question_chain = LLMChain( llm=llm, prompt=prompt_template, output_key="answer")def search_and_reply_company(company): # 检索search_result = search_tool.run(f"{company}的母公司") # 增强 output = question_chain({ "question":f"{company}的母公司是谁?", "search_result": search_result}) return output["answer"]search_and_reply_company("Whole Foods Market")"Amazon"
提示工程
上下文和问题的结合称为提示。我们注意到我们使用的普通提示(围绕询问母公司的变体)在大多数公共领域表现良好,但在教育或医疗领域无法很好地概括,因为母公司的概念在那里没有意义。对于教育,我们使用了“X”,而对于医疗保健,我们使用了“Y”。
为了实现这种特定于领域的提示选择,我们还必须确定给定帐户所属的领域。为此,我们还使用了一个多项选择问题“{account}的领域是什么?”作为第一步,并根据答案使用相关的提示作为第二步询问帐户的母公司。请参阅以下代码:
my_template_options = """使用以下信息回答以下问题。 \n问题:{question}? \n信息:{search_result} \n选项:\n{options} \n答案:"""prompt_template_options = PromptTemplate(input_variables=["question", 'search_result', 'options'],template=my_template_options)question_chain = LLMChain( llm=llm, prompt=prompt_template_options, output_key="answer") my_options = """- 医疗保健- 教育- 石油和天然气- 银行业- 制药- 其他领域 """def search_and_reply_domain(company):search_result = search_tool.run(f"{company} ")output = question_chain({ "question":f"{company}的领域是什么?", "search_result": search_result, "options":my_options})return output["answer"]search_and_reply_domain("Exxon Mobil")"石油和天然气"
领域特定提示将整体准确率从55%提高至71%。总体而言,开发有效提示的努力和时间似乎显著提高了LLM响应的质量。
带有表格数据的RAG(SEC-10k)
SEC 10K申报是上市公司每年提交的子公司和细分行业的可靠信息来源。可以直接在SEC的EDGAR或通过CorpWatch API上获得这些申报。
我们假设信息以表格格式给出。下面是一个模拟原始SEC-10K数据集格式的伪CSV数据集。可以将多个CSV数据源合并为一个组合的pandas数据帧:
# 一个类似于CorpWatch API数据集的伪数据集 df.head()
index relation_id source_cw_id target_cw_id parent subsidiary 1 90 22569 37 AMAZON WHOLE FOODS MARKET873 1467 22569 781 AMAZON TWITCH899 1505 22569 821 AMAZON ZAPPOS900 1506 22569 821 AMAZON ONE MEDICAL901 1507 22569 821 AMAZON WOOT!
LangChain通过create_pandas_dataframe_agent为pandas提供了一个抽象层。对于此任务,使用LangChain/LLM的两个主要优势是:
- 一旦启动,它允许下游用户以自然语言而不是代码与数据集交互。
- 它对拼写错误和不同的命名方式更加健壮。
我们像上面那样启动终端并创建代理:
# 创建pandas数据帧代理 agent = create_pandas_dataframe_agent(llm, df, varbose=True)
在以下代码中,我们查询母公司/子公司关系,代理将查询转化为pandas语言:
# 示例 1query = "WHOLE FOODS MARKET的母公司是谁?"agent.run(query)#### 输出> 输入新的AgentExecutor链...思考:我需要找到在子公司列中带有WHOLE FOODS MARKET的行动作:python_repl_ast行动输入:df[df['subsidiary'] == 'WHOLE FOODS MARKET']观察结果:source_cw_id target_cw_id parent subsidiary22569 37 AMAZON WHOLE FOODS MARKET思考:我现在知道最终答案最终答案:AMAZON> 链条结束。
# 示例 2query = "亚马逊的子公司有哪些?"agent.run(query)#### 输出> 输入新的AgentExecutor链...思考:我需要找到source_cw_id为22569的行动作:python_repl_ast行动输入:df[df['source_cw_id'] == 22569]...思考:我现在知道最终答案最终答案:亚马逊的子公司有Whole Foods Market、Twitch、Zappos、One Medical、Woot!...> 链条结束。'亚马逊的子公司有Whole Foods Market、Twitch、Zappos、One Medical、Woot!'
结论
在这篇文章中,我们详细介绍了如何利用LangChain的构建模块来增强一个具有搜索功能的LLM,以发现Schneider Electric的客户账户之间的关系。我们在初始流程上进行了扩展,采用了领域识别的两步处理方式,以提高准确性。除了Google搜索查询之外,还可以使用详细描述企业结构(如SEC 10K报告)的数据集来进一步增强LLM,提供可靠的信息。Schneider Electric团队还可以扩展和设计自己的提示,以模仿他们对某些公共部门账户进行分类的方式,进一步提高流程的准确性。这些功能将使Schneider Electric能够保持客户的最新和准确的组织结构,并解锁在这些数据上进行分析的能力。