AI全栈课程学习笔记
AI全栈课程学习笔记
2 大模型应用开发基础
-- 本课主要让大家在认知上适配AI
学会什么:
- AGI时代的个人发展
- 大模型能做什么
- 大模型落地现状
- 大模型的通俗原理
- 大模型的应用架构
2.1 一些概念
AGI(Artificial General Intelligence)通用人工智能。
普通人能够做啥:
- 在过程中抓住机会
- 在AGI到来后成为获益者
- 主流预测3-5年会到来AGI时代(现在是2024年)
本课程主要让普通人成为AI产品制造者,也就是设计和开发AI产品,哪怕只是满足自己需求;
2.2 AI产品制造者的核心能力
三懂
- 懂业务:懂用户、懂客户、懂需求、懂市场、懂运营、懂商业模式、懂怎么赚钱;
- 懂AI:就是懂AI能做什么、不能做什么,怎么才能做得更好、更快、更便宜;懂怎么用AI解决赚钱过程中的问题;
- 懂编程:就是懂如何编写代码实现一个符合业务需求的产品,尤其是AI产品;
AI全栈工程师:懂业务、懂AI、懂编程
2.3 什么是AI
定义:基于机器学习、神经网络的是AI,基于规则、搜索的不是AI。
大模型全程LLM英文:Large Language Model
2.4 大模型能做什么
- 按格式输出,如:Json格式
- 分类
- 聚类
- 持续互动,如同游戏
- 技术相关问题
一切问题都可能解决所以叫通用人工智人。用AI要用【用人思维】。
2.5 成功落地大模型五要素
1.业务人员的积极性
2.对AI能力的认知
3.业务团队自带编程能力
4.小处着手
5.老板的耐心
2.6 找落地场景
1.从熟悉的领域入手。 -- 市场营销管理,客户管理系统,内容管理系统;教育领域;
2.尽量找能用语言描述的任务。
3.别求大而全。将任务拆解,先解决小人物,小场景。
4.让AI学最厉害员工的能力,再让ta辅导其他员工,实现将本增效。
2.7 工作机会
1.独立开发者
2.科技公司机会全部岗位
3.传统企业跑通AI工作流,找全栈工程师定制化开发
2.8 大模型工作原理
根据上下文,猜下一个字。
大模型会根据提示词的约束,猜出相关的字。
大模型核心工作过程:训练(学习)和推理(使用)
训练:
1.大模型阅读了人类说过的所有的话。这就是【机器学习】。
2.训练过程会把不同的token同时出现的概率存入【神经网络】文件。保存的数据就是【参数】,也叫【权重】。
推理:
1.我们给推理程序若干token,程序会加重大模型权重,算出概率最高的下一个token是什么。
2.用生成的token,再加上上文,就能继续生成下一个token。
再深一点,GPT大模型的架构是什么
- 这套生成机制内核[Transformer架构]
2.9 Token是什么
大模型认知的最小单位,可能是一个英文也可能是半个或者三分之一个。汉字也是如此可能是一个词或者一个汉字或者半个汉字。
大模型在训练前,需要先训练一个tokenizer模型。它能把所有的文本,切成token。
大模型生成时怎么知道结束了
- 终止符 比如GPT使用[END]。
- 生成的token低于一个阈值。
2.10 大模型技术选型
- prompt
- Agent+Function calling (对接其他系统)
- RAG (从向量数据库获取知识)
- Fine-tuning(精调/微调)
3 Prompt Engineering
这节课带来什么
- 掌握提示工程的核心方法论
- 掌握提示词调优的基本方法,了解它在实际生产中的应用
- 了解防止提示词注入的方法,AI更安全
3.1 什么是提示词工程
prompt就是发给大模型的指令。
包括:文字,语音,图片+文字,视频+语音等
3.2 我们在[提示词工程]上的优势
懂原理所以知道,什么适合大模型做,什么用外部系统来做。
3.3 Prompt调优
好的prompt是不断迭代出来的
如果知道训练数据,参考训练数据来构造prompt是最好的。
不知道训练数据怎么办
- 看Ta是否主动告知
- [试]是常用方法
有测试数据特别重要
高质量的prompt核心要点:
具体:指令要具体
丰富:信息要丰富
少歧义: 减少歧义
如何提高prompt能力
- 多写[小作文]
3.4 Prompt的典型构成
典型的组成:
- 角色(role)
大模型对Prompt的什么内容敏感:开头和结尾,所以我们要把重要的信息放在开头或者结尾。
先定义角色就是在开头把问题域收窄,减少歧义。
- 指示(instruction):对任务的描述
- 上下文:背景,在多轮交互中的历史信息
- 例子(examples) 如果有多轮对话的例子的例子可以在此加上多轮对话
- 输入(input_text)
- 输出(output_format)
3.5 对话系统的基本模块和思路
核心思路:
- NLU 把输入的自然语言对话,转成结构化的信息;
- 用传统软件手段处理结构化信息,得到处理策略;
- 把策略转成自然语言输出;NLG
prompt Demo:
# 任务描述
instruction = """
你的任务识别用户对手机流量产品的选择条件。
每种流量套餐包含三个属性:名称、月费价格、月流量。
根据用户需求,识别用户在上述三种属性上的需求是什么。
"""
# 用户输入
input_text = """
办一个100G的套餐。
"""
# 用户输出
output_text = """
以JSON格式输出
"""
prompt = f"""
# 目标
{instruction}
# 用户输入
{input_text}
# 输出格式
{output_text}
"""
#调用大模型
response = get_completion(prompt, response_format="json_object")
print(response)
按OpenAI的Structured Outputs API是控制JSON输出方式:
# 任务描述,和代码贴近
instruction = """
你的任务是识别用户对手机流量套餐的产品的选择条件。
每种流量的产品包含三个属性:名称(name),月费价格(price),月流量(data)。
根据用户输入,识别用户对上面三中属性要求是什么。
"""
# 输出格式定义和约束
output_format = """
以JSON格式输出。
1.name字段是string型,为下面之一:经济套餐,畅游套餐,无限套餐,校园套餐或者null;
2.price字段是一个结构体或null,包含两个字段:
2.1 字段operator是string类型,取值范围:'<='(小于等于),'>='(大于等于),"=="(等于)
2.2 字段value是int类型
3.data字段是一个结构体或者null,包含两个字段:
3.1 字段operator是string类型,取值范围:'<='(小于等于),'>='(大于等于),"=="(等于)
3.2 字段value是int类型或者string类型,string类型只能是'无上限'
4.用户的意图可以包含按price或data排序,以sort字段标识,取值为一个结构体:
4.1 结构体中以"ordering"="descend"表示按降序排序,以"value"字段存储待排序的字段。
4.3 结构体中以"ordering"="ascend"表示按升序排序,以"value"字段存储待排序的字段。
输出中只包含用户提及的字段,不要胡思乱想未定义的数据,不输出的值为null;
"""
# 输入
input_text = "办个100G以上的套餐"
prompt = f"""
# 目标
{instruction}
# 用户输入
{input_text}
# 输出格式
{output_text}
"""
response = get_completion(prompt, response_format="json_object")
要想使得回答更加准确,加入例子,答错的和答对的都要加。
examples = """
便宜的套餐: {"sort":{"ordering":} }
"""
3.5 多轮对话
需要模型支持多轮对话,就是将多轮对话的加入到context中。
instruction = """
"""
# 输出描述
output_format = """
以JSON格式输出。
1.
2.
3.
4.
输出中只包含用户提及的字段,不要猜测任何用户未直接提及的字段。不要输出值为null的字段。
"""
# 多轮对话的例子
examples = """
客服:有什么可以帮您
用户:100G套餐有什么
{"data":{"operator":">=","value":100}}
客服:有什么可以帮您
用户:100G套餐有什么
客服:我们现在有无限套餐,不限流量,月费300元
用户:太贵了,有200元以内的不
{"data":{"operator":">=","value":100},"price":{"operator":"<=","value":200}}
客服:有什么可以帮您
用户:便宜的套餐有什么
客服:我们现在有经济套餐,每月50元,10G流量
用户:100G以上的有什么
{"data":{"operator":">=","value":100},"sort":{"ordering"="ascend","value"="price"}}
客服:有什么可以帮您
用户:100G以上的套餐有什么
客服:我们现在有畅游套餐,流量100G,月费180元
用户:流量最多的呢
{"sort":{"ordering"="descend","value"="data"},"data":{"operator":">=","value":100}}
"""
input_text = "流量最大的多少钱"
# 多轮对话上下文
context = f"""
客服:有什么可以帮您
用户:有什么100G以上的套餐推荐
客服:我们有畅游套餐和无限套餐,您有什么价格倾向吗
用户:{input_text}
"""
prompt = f"""
# 目标
{instruction}
# 输出格式
{output_format}
# 举例
{examples}
# 对话上下文
{context}
"""
response = get_completion(prompt, response_format="json_object")
print(response)
4 结构化输出
LLM与外部世界的联系,这就需要有结构化的输出满足外部应用比如API接口。
以OpenAI为标准有三个输出:
- JSON mode
- Function Calling
- JSON Schema
接口的进化
命令行 ==>> 图像界面 ==>> 自然语言(不同系统) ==>> 脑机接口
CLI GUI CUI/LUI BCI
大模型链接外部世界有两个缺陷:
- 并非知晓一切;
- 没有【真逻辑】
ChatGPT的Actions的原理:
- 通过定义Actions 的 schema,GPT能读懂各个API能做什么。
- 拿到prompt,GPT分析出是否要调用API才能解决问题。
- 如果需要调用API,生成调用参数。
- ChatGPT调用API。
- API返回结果,GPT读懂结果,整合到回答中。
上面的过程,GPT已经是个Agent了。
schema描述,把 API 对接到 GPTs 里,只需要配置一段 API 描述信息:
openapi: 3.1.0
info:
title: 高德地图
description: 获取 POI 的相关信息
version: v1.0.0
servers:
- url: https://restapi.amap.com/v5/place
paths:
/text:
get:
description: 根据POI名称,获得POI的经纬度坐标
operationId: get_location_coordinate
parameters:
- name: keywords
in: query
description: POI名称,必须是中文
required: true
schema:
type: string
- name: region
in: query
description: POI所在的区域名,必须是中文
required: false
schema:
type: string
deprecated: false
/around:
get:
description: 搜索给定坐标附近的POI
operationId: search_nearby_pois
parameters:
- name: keywords
in: query
description: 目标POI的关键字
required: true
schema:
type: string
- name: location
in: query
description: 中心点的经度和纬度,用逗号分隔
required: false
schema:
type: string
deprecated: false
components:
schemas: {}
1 Function Calling
原理和Actions一样,只是使用方式区别:
