作者:Adva Nakash Peleg
翻译:付雯欣
校对:赵茹萱
本文约3100字,建议阅读10分钟
本文将从实际项目需求出发,手把手带你了解LLM。
图:由DALL-E生成的图片
试想一下:你有一个很棒的项目想法,可以通过大语言模型(LLM)来实现,并且很快实现了一个可运行的概念验证(POC)。你为自己感到骄傲,并惊讶于你只需很少的工作就能使其发挥作用。(只需五行prompt的魔力 ☺)
但接下来呢?
你很快就会意识到,在使用LLM时,编写POC是容易的,但要做出一个真正可行的产品却需要更多艰苦的工作。
如果你认同这个情景,你可能会对这篇文章感兴趣。
LLM旅程之始
理解这个旅程的最佳方式是看看我们当前的一个LLM项目。旅程的第一部分可以分为三个步骤。
1. 寻找动机
在一个充满复杂产品的世界里,还在面对着海量信息的情况下,我们的客户常常感到迷失。有时,即使是执行基本操作也需要阅读许多文档,耗费大量时间浏览产品的UI界面,或者分析大量信息,例如日志、报告和其他原始资料。
客户通常会问:“难道我不能用自己的话说出我想要的东西,然后让系统为我完成吗?”
答案是——有了LLM——可以的!
2. 确立目标
在这个例子中,项目目标是通过客户提供的自然语言(natural language,NL)对我们的产品进行操作。
我们的项目首先学习产品的API规范文件(以标准格式声明API的文件,通常是OpenAPI),然后使用LLM将自然语言请求转换为正确的API调用。
3. 实现可运行的概念验证(POC)
在确立项目目标后,我们进入了POC阶段。
POC的目的是确保我们的想法是可行的。
我们需要构建一个基本系统,该系统接收API规范文件连同自然语言的用户请求作为输入,并执行用户的请求作为结果。
为了实现这一点,我们选择了OpenAI的GPT作为我们的LLM,并选择了LangChain作为封装LLM使用的库。
我们编写了一个引擎,该引擎接收输入数据,将其处理成逻辑分组(服务),并将其加载到LangChain库中,同时包含用户请求和一些执行指令的prompt。我们使用LangChain的链、工具和代理来实现这一点,同时结合OpenAI的功能调用特性。
你可以在这个网站上了解更多关于LangChain工具和代理的信息:https://python.langchain.com/v0.1/docs/modules/agents/
下图描述了我们POC中的主要角色:
图:POC 流程
恭喜,我们有了一个可运行的POC!现在真正的旅程开始了……
首要任务:准确性
在初期对POC的兴奋消退后,我们开始看到LLM决策和响应中的一些缺陷。
在软件行业,我们通常使用确定性算法(即,对于相同的输入,算法总是产生相同的输出)。
我的第一个建议是将你习惯的确定性期望抛到一边。是的,即使在OpenAI的温度设置为0的情况下也是如此。
目标是学习如何在这个新的非确定性世界中导航。换句话说,我们如何使其更可预测,以及如何处理不同的响应?
这里有一些小tips:
Tip1:确保你在使用正确的prompt
你需要逐步告诉LLM需要做什么。这包括描述你的输入(它的格式、含义)、预期输出(它的格式、含义)等等。有时这意味着使用比你想象的更多的提示行,或在提示中包含示例。
在下面的Few-Shots Learning示例中,你可以看到在提示中添加例子(shots)的优势。
请看以下请求:“Get the user details of the user ‘user1’, and create a new user with those details”。
这看起来很基本和直截了当,对吗?错!你不会相信LLM尝试采取的奇怪操作——包括将“those”一词放入新用户的详细信息中。相反,在提示中给LLM以下示例效果非常好:
Question: Get the details of ‘User1’ entity and create a new entity named ‘User2’ with the same details
Thought: I should first get the details of ‘User1’ using the “Get entity Details” tool. then I should use the “entity writer” tool to create a new entity named ‘User2’ with the same details.
Tip2:给你的LLM配备工具
有时LLM不知道如何自行执行正确的操作。在这种情况下,你可以为LLM配备一套工具,当LLM不确定该怎么做时可以使用这些工具。这可以通过LangChain工具或OpenAI的功能调用轻松实现。
以下是一些不同工具的示例:
一个用于计算日期的日期工具。你可以问它:“给我所有昨天的日志。”由于LLM可能难以理解“昨天”具体指的是哪一天,日期工具可以帮助它将“昨天”转换为可用的时间戳。
一个可以帮助LLM向用户获取澄清信息的用户/人类工具。你可以问它:“创建一个新用户。”由于LLM可能需要额外的信息,比如用户名,它可以使用用户工具询问用户所需的用户名。
Tip3:限制LLM的创造力
另一个建议是限制LLM的创造力,让LLM在不确定时询问澄清信息,而不是妄自猜测。
例如,当你要求“创建一个名为‘user1’的新用户”时,API的一个参数是密码。
LLM可能会尝试使用生成的密码Password123来创建用户。这可能不是你想要的结果。你可以指示LLM在这种情况下询问澄清信息,而不是自行猜测。
永远预料 “未曾预料”
我们现在已经创建了一个支持所有用例并在“顺利路径”中表现非常好的引擎。但是错误流程和边缘情况下怎么办呢?
以下是一些关于处理这些情况的想法:
指示LLM如何处理意外响应:让LLM知道错误可能发生,描述如何识别错误以及错误发生时应采取的措施。
向用户呈现清晰的错误消息:当发生错误时,向用户展示清晰的消息,使用户能够理解发生了什么以及如何修复。
定义自动恢复行为:在某些情况下,LLM可以自动从故障中恢复。
示例1:自动纠正错误
“创建一个名为‘user1’的用户”。
LLM可能会请求创建此用户,并自动生成描述,例如“这是一个管理员用户!”。在这种情况下,产品可能会返回一个错误,指出“‘!’的使用是非法的。只允许使用字母数字值”。我们可以指示LLM读取此错误消息并自动纠正自身,使用不包含无效字符的描述。
示例2:绕过认证问题
“获取名为‘user1’的用户”。
可能我们用来认证到产品系统的token已经过期。在这种情况下,产品返回错误“token已过期”。
我们可以指示LLM处理认证问题并返回特殊消息,以便我们可以自动刷新token并重试请求。
部署、托管和重大决策
在构建引擎并对模型进行微调之后,你需要做出关于部署的决策。需要做出的众多选择各有利弊,包括:
在哪里托管引擎
对于我们来说,这个问题很容易决定。由于我们主推SaaS,这是我们的首选。
而且由于我们的主要云提供商是AWS,这也是我们的首选。
在哪里托管LLM模型
我们使用了OpenAI的GPT模型,它提供了最佳的结果(主要是因为我们大量使用了本模型原生支持的功能调用特性)。经过一些比较,我们得出的结论是,托管此模型的最佳方式是使用Azure OpenAI。这意味着该项目建立在两个云提供商之上——但这完全不是问题。
选择部署策略
作为无状态和无服务器解决方案的倡导者,我总是倾向于走这条路。
这并不意味着引擎不能托管在静态、有状态的机器上。但我认为,无状态和无服务器在弹性、扩展、部署和管理方面的优势实在是太大了,几乎没有竞争对手。
这就指引我们来到了下一个挑战……
使您的LLM引擎无状态和无服务器化
敬请关注,LLM的旅程:从POC(概念验证)到生产环境(下篇)
编辑:黄继彦
译者简介
付雯欣,中国人民大学统计学专业硕士研究生在读,数据科学道路上的探索者一枚。小时候梦想做数学家,现在依旧着迷于数据背后的世界。热爱阅读,热爱遛弯儿,不停感受打开生命大门的瞬间。欢迎大家和我一起用概率的视角看世界~
翻译组招募信息
工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。
你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。
其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。
点击文末“阅读原文”加入数据派团队~
转载须知
如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。
发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。
关于我们
数据派THU作为数据科学类公众号,背靠清华大学大数据研究中心,分享前沿数据科学与大数据技术创新研究动态、持续传播数据科学知识,努力建设数据人才聚集平台、打造中国大数据最强集团军。
新浪微博:@数据派THU
微信视频号:数据派THU
今日头条:数据派THU
点击“阅读原文”拥抱组织