施耐德电气利用增强检索的LLM在SageMaker上确保CRM系统实时更新
关键要点
施耐德电气通过与AWS机器学习解决方案实验室的合作,将增强检索的大型语言模型LLM应用于其客户关系管理CRM系统,实现实时更新。利用Google Search API,使LLM能够访问最新的外部信息,确保链接客户账户的决策依据充分且准确。构建了一种智能化的工作流,包括检索、增强与特定领域的提示选择,从而提高了工作效率和准确性。施耐德电气是一家在能源管理和工业自动化领域处于领先地位的公司。为了满足客户的需求,施耐德电气需要跟踪其CRM系统中的客户账户之间的关联。随着客户基础的不断扩展,新客户每天都在增加,因此其账户团队必须手动整理这些新客户并与相应的母实体进行链接。
这一决策通常依赖于互联网上最新的信息,可能受近期收购、市场新闻或公司重组的影响。例如,识别亚马逊及其子公司Whole Foods Market之间的关系就是一种账户链接。
施耐德电气决定利用其在多个知识领域中回答问题的能力,与AWS机器学习解决方案实验室(Mlsl)合作,开发出一种AI架构,降低了客户账户链接过程中的人工工作量,提升了下游分析团队的数据访问速度。
生成型AI
生成型AI和大型语言模型LLM正在改变企业解决传统复杂自然语言处理问题的方式。LLM的优势在于能够理解大量文本并提供类似人类的回答。AWS利用诸如 Amazon SageMaker JumpStart、Amazon Bedrock和Amazon Titan等平台,使客户能够轻松尝试和生产化LLM工作负载。
外部知识获取
LLM通常可压缩人类知识,但其知识受限于模型训练的时间。因此,通过将LLM与Google搜索API结合,我们开发了一种强大的增强检索LLMRAG来解决施耐德电气面临的问题。该RAG能够处理大量来源于Google搜索的外部知识,并展示CRM记录之间的企业或公共关系。
例如:
问题 Who is the parent company of One Medical谷歌查询 “One Medical parent company” 获取信息 交给LLM提供答案答案 One Medical a subsidiary of Amazon
由于这个例子中的收购发生在2023年2月,因此LLM本身无法捕捉到这些最新信息。通过结合谷歌搜索,可以确保使用到的是最新的信息。
FlanT5模型
在该项目中,我们使用了FlanT5模型家族中的FlanT5XXL。FlanT5模型经过指令调优,可执行多种零样本的自然语言处理任务。在我们的下游任务中,并不需要处理大量的世界知识,而是需在提供的文本语境中良好回答问题,因此,11B参数的T5模型表现出色。
JumpStart通过Amazon SageMaker Studio和SageMaker SDK便捷地部署了该模型家族。这包括FlanT5 Small、FlanT5 Base、FlanT5 Large、FlanT5 XL和FlanT5 XXL。
利用LangChain的增强检索LLM
LangChain是一个旨在支持LLM开发的快速成长的框架。它基于“链”的概念,将不同组件结合,提升LLM在特定任务上的功能。在我们的用例中,结合了谷歌Serper组件进行网络搜索,并在Amazon SageMaker Studio Jumpstart上部署了FlanT5XXL模型。LangChain负责整体协调,将搜索结果页面输入到FlanT5XXL实例中。
增强检索生成RAG流程包括以下两步:
从外部来源检索相关文本片段在传递给LLM的提示中,增强这些片段的上下文对于施耐德电气的用例,RAG流程如下:
将给定公司名称与问题“Who is the parent company of X”组合,并传递给谷歌查询。将提取的信息与提示和原始问题相结合,传递给LLM获取答案。
使用以下示例代码创建一个端点:
python
启动 FLANT5XXL SageMaker 端点
llm = SagemakerEndpoint()
实例化搜索工具:
pythonsearch = GoogleSerperAPIWrapper()searchtool = Tool( name=Search func=searchrun description=需要通过搜索提问时使用 verbose=False)
以下代码将检索和增强组件链在一起:
pythonmytemplate = 使用以下信息回答问题。 n问题 {question} n信息 {searchresult} n答案 prompttemplate = PromptTemplate( inputvariables=[question searchresult] template=mytemplate)questionchain = LLMChain( llm=llm prompt=prompttemplate outputkey=answer)
def searchandreplycompany(company) # 检索 searchresult = searchtoolrun(f{company} parent company) # 增强 output = questionchain({ question fWho is the parent company of {company} searchresult searchresult}) return output[answer]
searchandreplycompany(Whole Foods Market)
输出 Amazon
提示工程
上下文与问题的组合称为提示。我们注意到,针对大多数公共部门领域,我们使用的通用提示表现良好,但在教育或医疗领域则未能很好适用,因为母公司这一概念在这些行业中并不意味深远。对于教育,我们使用“X”,而在医疗领域则使用“Y”。
为了实现这种特定领域的提示选择,我们还需要识别给定账户所归属的领域。为此,我们也使用了一种增强检索的方式,问一个多选题“公司{account}的领域是什么?”作为第一步,基于回答,我们再使用相关的提示,询问该账户的母公司。
pythonmytemplateoptions = 使用以下信息回答问题。 n问题 {question} n信息 {searchresult} n选项 n {options} n答案
prompttemplateoptions = PromptTemplate( inputvariables=[question searchresult options] template=mytemplateoptions)questionchain = LLMChain( llm=llm prompt=prompttemplateoptions outputkey=answer)
myoptions = healthcare education oil and gas banking pharma other domain
def searchandreplydomain(company) searchresult = searchtoolrun(f{company} ) output = questionchain({ question fWhat is the domain of {company} searchresult searchresult options myoptions}) return output[answer]
searchandreplydomain(Exxon Mobil)
输出 oil and gas
通过针对特定行业的提示,整体性能提升了从55到71的准确率。综上所述,开发有效的提示所投入的努力和时间显著提高了LLM响应的质量。
RAG与表格数据SEC10K
SEC 10K申报表是另一种可靠的信息来源,提供上市公司每年提交的子公司和分支机构相关的文件。这些文件可以直接在SEC EDGAR上获取,或通过CorpWatch API。
我们假设以下信息以表格格式提供。下面是一个类似于SEC10K数据集的伪csv数据集,能够将多个csv数据源合并成一个pandas数据框:
python
类似于CorpWatch API数据集的伪数据集
dfhead()
迅猛兔加速器最新版本输出示例
index relationid sourcecwid targetcwid parent subsidiary1 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通过使用createpandasdataframeagent提供对pandas的抽象层。使用LangChain和LLM有两个主要优点:
一旦启动,允许下游用户以自然语言与数据集进行交互,而不是编写代码对于拼写错误和命名不同的账户有更强的鲁棒性我们按之前描述的方式启动端点,并创建代理:
python
创建pandas dataframe代理
agent = createpandasdataframeagent(llm df varbose=True)
接下来,我们查询母公司/子公司关系,代理将查询翻译成pandas语言:
python
示例 1
query = WHOLE FOODS MARKET的母公司是谁?agentrun(query)
输出示例
进入新的代理执行链思考 我需要找到subsidiary列中包含WHOLE FOODS MARKET的行动作 pythonreplast动作输入 df[df[subsidiary] == WHOLE FOODS MARKET]观察sourcecwid targetcwid parent subsidiary22569 37 AMAZON WHOLE FOODS MARKET思考 我现在知道最终答案最终答案 AMAZON完成链。
python
示例 2
query = 亚马逊的子公司有哪些?agentrun(query)
输出示例
进入新的代理执行链思考 我需要找到sourcecwid为22569的行动作 pythonreplast动作输入 df[df[sourcecwid] == 22569]思考 我现在知道最终答案最终答案 亚马逊的子公司有Whole Foods Market、Twitch、Zappos、One Medical、Woot!完成链。
结论
本文详细介绍了如何利用LangChain的构建模块,增强LLM的搜索能力,以识别施耐德电气的客户账户之间的关系。我们将初始流程扩展为一个两步流程,在使用特定行业提示之前先进行领域识别。
除了谷歌搜索查询,像SEC 10K申报表这样的企业结构数据集可进一步增强LLM的可靠信息。施耐德电气的团队还可以扩展和设计自己的提示,仿照他们分类某些公共部门账户的方式,进一步提高流程的准确性。这些能力将使施耐德电气能够保持客户组织结构的准确性和时效性,并为这项数据的分析提供支持。
关于作者
Anthony Medeiros是施耐德电气北美人工智能解决方案工程与架构负责人,专注于为多个业务职能提供高价值的AI/ML项目。
Blake Sanstchi是施耐德电气的商业智能经理,领导分析团队,通过数据驱动的洞察支持销售组织。
Joshua Levy是亚马逊机器学习解决方案实验室的高级应用科学经理,帮助客户设计和构建AI/ML解决方案以解决关键商业问题。
Kosta Belz是AWS MLSL的高级应用科学家,专注于生成AI和文档处理。
Aude Genevay是亚马逊GenAI孵化器的应用科学家,致力于通过ML和AI帮助客户解决关键商业问题。
Md Sirajus Salekin是AWS机器学习解决方案实验室的应用科学家,帮助AWS客户通过AI/ML解决方案加速业务发展。
Zichen Wang PhD,是AWS的高级应用科学家,拥有多年利用生物和医学数据开发机器学习和统计方法的研究经验。
Anton Gridin是支持全球工业账户的首席解决方案架构师,拥有15年以上安全应用程序开发和领导工程团队的经验。