天天看点

如何在10分钟内构建智能应用?——大语言模型带来的应用开发革命

作者:famotime

楔子:泯然众人的Siri

很早以前,人类就萌生了与计算机进行自然语言交互的想法,著名的“图灵测试”也是基于人机对话场景设计的。1966年,Joseph Weizenbaum在MIT开发了世界上第一个聊天机器人Eliza。但由于当时技术条件所限,Eliza只能进行有限的模式匹配,对话能力非常受限,真正智能、自然的对话能力一直是AI领域的“圣杯”。直到21世纪,统计机器学习和神经网络的发展才使聊天机器人有了长足的进步,然而训练一个聊天机器人仍需要海量的数据、算力和研发时间。

如何在10分钟内构建智能应用?——大语言模型带来的应用开发革命

2011年10月,苹果首度曝光其智能助手Siri的时候,很多人认为Siri开启了“未来移动设备使用方式的一种全新可能性”,但十多年过去了,人们对Siri曾经抱有的期望已经一一落空。每位用户都在 Siri 上遇到过自己的“失望时刻 ”——它可能没听懂一句简单的指令,甚至搞不定一项最基本的操作,更不可能跟你做一些深入的主题讨论,比如谈谈AI技术派别,聊聊欧洲文学史,或者仅仅是制定一份粗糙的旅游出行计划。如果这都能称之为“智能”,那“智能”已经低到了尘埃里。

直到2022年底ChatGPT的横空出世,让过去人们在Siri身上冷却的希望,再度活泛起来。

10分钟快速构建智能聊天机器人

如何在10分钟内构建智能应用?——大语言模型带来的应用开发革命

如今,借助OpenAI的开放API,只需要用几行代码,10分钟内就可以快速构建一个具备生活常识且学识丰富的智能聊天机器人。主要步骤如下:

  1. 注册OpenAI账号,获取API Key;
  2. 安装OpenAI Python库;
  3. 准备prompt(输入提示),调用Model完成对话;

下面是示例代码:

import os
import openai

OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
openai.api_key = OPENAI_API_KEY

def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
    # 传递整个messages,可指定角色
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature, # 控制模型输出的随机程度
    )
# print(str(response.choices[0].message))
    return response.choices[0].message["content"]           

调用API时除了选择模型,还可以调整以下参数,生成不同风格的文本,实现更加符合需求的交互:

  • max_tokens:生成文本的最大TOKEN数,通常是单词或子词数;
  • temperature:随机性参数,降低temperature会得到更加保守可预测的结果;
  • top_p: nucleus sampling参数,控制生成文本的多样性;
  • n: 生成的候选响应数量;
  • presence_penalty:惩罚现有内容的重复概率;
  • frequency_penalty:惩罚高频词汇出现的概率;

OpenAI提供的文本生成接口是没有状态的,默认情况下聊天机器人并没有记忆,但解决办法也简单,就是每次发问时把历史对话记录一股脑的都发给AI大模型。系统预置了几个不同的角色,assistant是聊天机器人自己,system是对机器人的背景设定,user是问话的用户。上面的截图举了一个例子,用户一开始告诉了机器人自己的姓名,然后在后续对话中把历史聊天记录一并带上发给机器人,机器人就可以凭借这份上下文记录,正确的“回忆”出用户的姓名了。

围绕提示词开发场景化智能应用

如何在10分钟内构建智能应用?——大语言模型带来的应用开发革命

仅仅调用接口,开发一个跟OpenAI原生能力一致的聊天机器人并没有多大意义,更重要的是借助预训练的大模型,我们可以快速开发出适用于特定场景的智能应用。其中的关键是构建好prompt,让模型明确应用场景和预期结果。Prompt可以包含:

  • 背景信息:为模型提供应用场景的上下文;
  • 指示:明确告知模型应该做什么;
  • 示例:提供输入和期望输出的示例;

更多关于Prompt Engineering(提示工程)的原则和技巧,参见我的另一篇博文:问题比答案重要——10分钟学到吴恩达ChatGPT Prompt课程精粹 。

在上图中举了一个智能客服的例子,可以看到寥寥几行Python代码跟第一个例子几乎没有区别,但是程序中加入了大量自然语言描述,其中一部分是供查询的产品信息,另外一部分(中间图示的步骤1...步骤2等)则是如何处理客户问题的流程描述。

delimiter = "# # # # "
system_message = f"""
请按照以下步骤回答客户的查询。客户的查询将以四个井号(# )分隔,即 {delimiter}。
步骤 1:{delimiter} 首先确定用户是否正在询问有关特定产品或产品的问题。产品类别不算。
步骤 2:{delimiter} 如果用户询问特定产品,请确认产品是否在以下列表中。所有可用产品:
产品:TechPro超极本
类别:计算机和笔记本电脑
品牌:TechPro
型号:TP-UB100
保修期:1年
评分:4.5
特点:13.3英寸显示屏,8GB RAM,256GB SSD,Intel Core i5处理器
描述:一款适用于日常使用的时尚轻便的超极本。
价格:$799.99
……
步骤 3:{delimiter} 如果消息中包含上述列表中的产品,请列出用户在消息中做出的任何假设,例如笔记本电脑 X 比笔记本电脑 Y 大,或者笔记本电脑 Z 有 2 年保修期。
步骤 4:{delimiter} 如果用户做出了任何假设,请根据产品信息确定假设是否正确。
步骤 5:{delimiter} 如果用户有任何错误的假设,请先礼貌地纠正客户的错误假设(如果适用)。只提及或引用可用产品列表中的产品,因为这是商店销售的唯一五款产品。以友好的口吻回答客户。
使用以下格式回答问题:
步骤 1:{delimiter} <步骤 1的推理>
步骤 2:{delimiter} <步骤 2 的推理>
步骤 3:{delimiter} <步骤 3 的推理>
步骤 4:{delimiter} <步骤 4 的推理>
回复客户:{delimiter} <回复客户的内容>
请确保在每个步骤之间使用 {delimiter} 进行分隔。"""           

这种以自然语言描述业务逻辑的开发模式,是基于大语言模型的应用开发与传统智能应用开发的最大不同,极大地降低了开发门槛,普通用户都可以参与到AI应用创造中来。传统的机器学习方法需要先收集大量对话语料,然后训练语言模型,构建和调优过程至少需要几个月时间。而Prompt编写的方式十分自由灵活,通过在prompt中嵌入角色设定,就可以让聊天机器人模拟不同人格,通过提前预设关键词,就可以实现场景化的问答服务,不需要独立训练模型,甚至不需要调优,写几段文字描述就可以让聊天机器人适应不同的场景,而且取得良好的效果,这样的即时体验是以前难以想象的。

更进一步,如果要开发复杂的生产环境应用,直接调用OpenAI API仍有诸多不便之处,比如实际业务场景经常需要多步处理,这时我们可以借助LangChain这样的开源框架。它为开发人员提供了创建由LLM(大型语言模型)驱动的应用程序所需的工具,比如针对多步处理,LangChain提供了称之为“链”的功能组件,方便开发人员将不同的组件“链”在一起,以创建更高级的LLM应用。

如何在10分钟内构建智能应用?——大语言模型带来的应用开发革命

LangChain的核心概念包括:

LLM 大语言模型:本质上是大语言模型的包装器,封装不同大型语言模型的差异化接口。

Chains 链:提供了调用多个处理结果并链接在一起以实现复杂目标的能力。 例如从特定 URL 检索数据,汇总检索到的文本,再利用生成的摘要来回答问题。

Prompts 提示:通过专门的类和函数(包括提示模板)简化了Prompt的创建和管理。

Document Loaders and Utils 文档工具:文档加载器将各种数据源转换为文本进行处理,而 utils 模块提供各类处理工具和代码片段。

Vectorstores 向量存储:使用嵌入模型将每个文档向量化并存储在数据库中,以便后续通过向量有效地检索相关文档。

Agents 代理:“代理”可以根据用户输入调用工具完成灵活、不确定的复杂任务。

如何在10分钟内构建智能应用?——大语言模型带来的应用开发革命

大模型基于本地知识库的问答,作为一个典型场景用例,可以参考之前的博文:创造一个真正懂你的AI个人助理!——如何为ChatGPT提供本地知识库?

大语言模型带来的应用开发革命

相比过去的知识工程方法,经过预训练的大语言模型解决了传统AI系统普遍面临的知识获取瓶颈。它像一个无所不知的百晓生,拥有广博的知识与强大的语言理解能力,这使得我们可以直接通过自然语言描述来完成业务编程,而不再需要人工进行大批量的数据准备、清洗、标注、模型调优、算法编写等繁重劳动。

相比传统机器学习方式的智能应用开发,基于大语言模型的应用开发有以下方面的不同:

  • 训练数据:无需人工标注数据,大模型可以通过Prompt提示完成迁移学习;
  • 开发方式:基于自然语言编程,不再需要编写规则、特征工程等;
  • 开发体验:交互式、直观、类似人类使用语言,无需了解机器学习原理;
  • 开发效率:几行代码打造原型,大幅降低开发成本;
  • 可扩展性:通过不断提供新样本来优化和扩展模型能力,无需从头重新训练;

当然,大模型也面临巨大算力消耗、训练代价高、系统偏差等问题。我们仍需保持清醒、审慎的态度,将这个强大的新工具运用于造福人类的目的。但这些变化毋庸置疑的解放了AI应用开发者的生产力,使他们可以关注更高层次的用户需求,而非重复枯燥的特征提取、模型训练调参等工作。同时,自然语言取代了传统的编程语言,使广大非技术人员也能参与到AI创作中来,这将带来革命性的变化。

也许,我们正站在人工智能新纪元的门槛上,超大规模的语言模型正如同熔炉中烧红的钢铁,散发着炽热的光芒。它照亮了从人类大脑到机器应用的最后一公里,更多基于大模型的智能应用必将快速发展起来,整个世界都将会因此而不同。

继续阅读