第一期 简介
一:AI简介
(一)什么是AI
人脑有处理复杂问题的能力,至今也无法完全解释这种能力的原理是什么,于是把这种现象/能力称为智能;反过来说,当完全了解原理的情况下,我们不会认为智能
(二)AI发展阶段
第一阶段(算数智能):本质是巨能算,大数复杂计算,比人能算。随着时间发展,计算机普及,原理大家也都清楚,不再认为这个为智能;AlphaGo就是进行计算,智能计算能力、算法比人厉害
第二阶段(感知智能):深度学习重回舞台,语言识别、人脸识别等技术大规模出现,模拟人的感官(眼/耳...)接收信号进行处理,核心特点是输入输出有确定性和唯一性;最开始人们认为这个叫智能(不清楚原理),但是随着发展普及,人们不再认为语音唤醒/人脸识别是一种智能,而是一种日常化的东西
第三阶段(认知智能):能进行推理,决策,比如无人驾驶,复杂对话系统;结果还没研究明白,GhatGpt就来了
第四阶段(通用智能):原来的感知/认知智能是用于解决单一任务,ChatGpt展现了通用智能的雏形,感觉什么都可以干(绝大多数);
二:ChatGpt简介
(一)如何使用ChatGpt
1.如何使用教程,包括注册账号等等 (谷歌邮箱、接码平台《如果后面选择wildCard信用卡会提供手机号》)
2.openai的api使用,现在变了,需要绑定国外信用卡,否则一直429限额
参考:知乎和B站,直接看B站吧,但是最后走到老狗的博客,分为fomecard和wildCard(会给一个虚拟手机号和外部环境,贵)
(二)ChatGpt能做什么,一起补充下
写代码(Comate)、写邮件、数据分析(比如对excel分析、图片转视频;原理调用了python实现逻辑处理返回结果)、聊天(豆包).....
三:通用AI,如何利用解决业务问题
(一)案例使用
可以看到chatGpt解决业务,尤其是文本分析上,还是特别厉害的(后续提示工程、langchain会展示更多)
其他业务比如舆情分析,过去的处理要为评论分多类标签(NLP),标签多了,模型复杂度增加性能不一定好,chatGpt来做文本分类问题方便、准确(通过合适的prompt提示词);质检,和业务强绑定的,数据量少,逻辑复杂文本分析问题;代码生成、运维查错、业务逻辑代码生成...
(二)从AI视角,如何定义遇到的业务问题(学会去描述问题、拆解问题)
在AI时代,用好AI的主要环节就是如何去看待业务问题:拆解/看待业务问题->描述清楚业务问题->调用大模型帮助解决问题
1.看待业务(从机器学习角度),从以下3个角度
2.描述业务问题,从业务问题分类来看(绝大多数业务问题可以归为下面至少一类)《后面训练会有点用》
- 分类问题:输出有限集(离散),注意:输出的标签是预选定义好的
- 聚类问题: 和分类类似,区别在于分类输出的标签是预选定义的,而聚类没有办法提前规定标签,是由数据本身决定
- 回归问题:是一个连续问题,输出是一个数,用误差评判好坏
- 决策问题:本质是无法以单一的一步输出来判断对错,而是在一系列动作之后,以最终结果来评判收益大小;比如下棋、自动驾驶;还有chatGpt训练过程,最终和人回复的阶段要对齐alignment也是决策问题(如果合理的输出一段文字《一个字一个字输出》,使得达到最终的目的《通顺、价值观、结果》),如果只考虑通顺,可以看作分类🤔
- 其他复杂问题从下面两个视角看待:
其中内容生成前面说了,在不考虑最终目的的情况下,下一个生成的词是哪一个,实际就是从词库(中文5000词)选一个出来
信息抽取作为分类问题:分类问题有一个相对复杂的分支叫结构化分类,传统信息抽取就是对每个字打上标签,然后提前需要的信息。打标签就是一个分类问题
反正都看成文本生成问题呗,上面两个可以看作(信息抽取通过文本生成获取信息)
3.chatGpt能解决哪些问题?分类、聚类、回归、决策
- 分类问题可以
- 聚类问题可以(可以做,但是不推荐,不是最高效、最实惠)
- 回归问题不可以?(做了推导,还是错,因为我们要的是一个回归的结果预测值,他给出了不同情况的不同值《虽然有道理》),可以通过给提示让他把这个问题当作回归问题解决,写一段代码,或者写简单神经网络进行回归都可以,直接让他处理是不可以的。
但是实际上现在的chatgpt已经可以理解问题是否是回归问题,然后通过代码得到对应的回归值了
- 决策问题:分情况(不适合博弈,擅长长任务规划《可以根据这个能力将任务让他自己进行一步步拆解、规划、运行,后面langchain讲》)
博弈:
长任务规划:
补充:一些比较复杂的prompt,用中文的话理解不太好,最好用英文方便理解
(三)如果遇到GhatGpt解决不了的问题怎么办
自己训练模型(后面课程)
(四)ChatGpt如何生成结果
根据上文,猜测下一个词的概率(循环,把这个词加入上文,猜测下一个词),比如:我今天很?;可以看出当上文非常完整(prompt调优效果足够好),那么预测下一个词的概率就会比较收敛,循环下去,越来越精准
实例:调用openai的模型,看看对话生成过程如何产出结果 (openai官方文档)补充:密钥只会展示一次,如果忘了就重新建立吧
import openai import os import time from dotenv import load_dotenv,find_dotenv _ = load_dotenv(find_dotenv()) #find_dotenv() 函数会查找.env 文件,优先在当前目录查找,不存在则查找父级目录;如果找到.env 文件,load_dotenv() 函数将加载其中的变量并设置为环境变量 openai.api_key = os.getenv("OPENAI_API_KEY") prompt = "你好," response = openai.completions.create( model="gpt-3.5-turbo-instruct", #这是一款新的指令语言模型,效率可以与聊天优化的 GPT-3.5 Turbo 模型相媲美。 prompt=prompt, temperature=0.4, # 0.4 表示生成的文本的随机性,数值越大,生成的文本越随机,数值越小,生成的文本越确定。 max_tokens=40, # 40 表示生成的文本的最大长度,单位是字符。 stream=True, # 设置为 True 表示返回一个生成器,每次生成一个文本片段。 ) for chunk in response: print(chunk.choices[0].text, end="") # 打印生成的文本片段 time.sleep(0.1)
其中gpt-3.5-turbo-instruct指令模型属于大语言模型的一种,会在使用一大量数据进行预训练之后,再通过人类反馈(RLHF《Reinforcement Learning fromHuman Feedback》)做进一步完善。在此过程中,会由人类负责评估模型根据用户提示词生成的输出,对结果做改进以达成目标效果,再将更新后的素材用于进一步训练。
(五)ChatGpt原理
1.简易版原理
2.简略结构,transform(NLP),3.5是96层
四:OpenAI API简单使用
(一)环境安装
1.安装python
2.安装openai库即可
pip3 install openai
(二)openai API使用
1.查看可调用的模型
import openai import os import time from dotenv import load_dotenv,find_dotenv _ = load_dotenv(find_dotenv()) #find_dotenv() 函数会查找.env 文件,优先在当前目录查找,不存在则查找父级目录;如果找到.env 文件,load_dotenv() 函数将加载其中的变量并设置为环境变量 openai.api_key = os.getenv("OPENAI_API_KEY") models = openai.models.list() for model in models.data: print(model.id)
woc,有4可以用了,是因为付费了吧🤔高玩
2.调用模型,看看prompt怎么写
import openai import os from dotenv import load_dotenv,find_dotenv _ = load_dotenv(find_dotenv()) #find_dotenv() 函数会查找.env 文件,优先在当前目录查找,不存在则查找父级目录;如果找到.env 文件,load_dotenv() 函数将加载其中的变量并设置为环境变量 openai.api_key = os.getenv("OPENAI_API_KEY") messages = [ #可以认为数组里面每一个元素是多轮对话里面的一轮,这几轮里面实现角色区分,三种角色:system(系统)、assistant(chatgpt机器人)、user(用户) { "role": "system", #一般用于任务描述,告诉机器人扮演什么角色,有什么背景....(放在第一轮,比较敏感) "content": "你是AI助手呆瓜" }, { "role": "assistant", "content": "有什么可以帮您的吗?" }, { "role": "user", "content": "你叫什么名字" } ] # 调用gpt-3.5-turbo模型 chat_completion = openai.chat.completions.create( model="gpt-3.5-turbo", messages=messages ) # 输出结果 print(chat_completion.choices[0].message.content)
本文一共用到了两个模型gpt-3.5-turbo和gpt-3.5-turbo-instruct
1.可以认为gpt-3.5-turbo是专门为聊天优化而设计的大模型;gpt-3.5-turbo-instruct(体量小)是指令模型,注重理解人类意图并进行完善,能够更好地理解并响应人类的查询预期,减少错误并缓解有害内容的传播。参考文章1和文章2
2.可以看到两个模型的调用方式不同,分别是openai.chat.completions和 openai.completions,目前认知是对话调用chat.completions,补全调用completions参考文章
Completion模型核心功能是根据提示(prompt)进⾏提示语句的补全(即继续进行后续⽂本创作),它本质上是文本补全模型,所以调用openai.completions。
而Chat模型升级的核心功能是对话, 它基于大量高质量对话文本进行微调,能够更好的理解用户对话意图,所以它能更顺利的完成与用户的对话,调用openai.chat.completions
3.Chat模型能够比较好的理解对话意图,跟接近于人类对话的常规方式,而Completions模型则是根据概率进行对话补全。Chat模型的核心优势也就体现出来了: 它能更好的理解人类意图。与大语⾔模型(LLMs)交互最低⻔槛的形式就是对话,如果模型能够非常好的理解人类对话意图,才会更有利于模型的发展和社会价值的认同。参考文章
最后,阅读这篇文章,不需要完全看懂,权当预习
个人觉得阅读这篇文章,不要过分在意Chat模型和Completions模型的异同。不然里面部分东西会比较混乱
作业:参考上面文章实现本地知识库构建,使用本文的最新的方法
1.传递本地知识
直接询问他,看起来不太会:
传递本地知识后:
import openai import os from dotenv import load_dotenv,find_dotenv _ = load_dotenv(find_dotenv()) #find_dotenv() 函数会查找.env 文件,优先在当前目录查找,不存在则查找父级目录;如果找到.env 文件,load_dotenv() 函数将加载其中的变量并设置为环境变量 openai.api_key = os.getenv("OPENAI_API_KEY") with open("./Chat Completion Models.txt","r",encoding="utf-8") as fp: chatCompletions_model = fp.read() messages = [ { "role": "system", "content": chatCompletions_model }, { "role": "user", "content": "你知道chat.completions.create函数的使用方法吗?" } ] # 调用gpt-3.5-turbo模型 chat_completion = openai.chat.completions.create( model="gpt-3.5-turbo-16k-0613", messages=messages ) # 输出结果 print(chat_completion.choices[0].message.content)
2.让大模型根据本地知识库,创建多轮对话函数
import openai import os from dotenv import load_dotenv,find_dotenv _ = load_dotenv(find_dotenv()) #find_dotenv() 函数会查找.env 文件,优先在当前目录查找,不存在则查找父级目录;如果找到.env 文件,load_dotenv() 函数将加载其中的变量并设置为环境变量 openai.api_key = os.getenv("OPENAI_API_KEY") with open("./Chat Completion Models.txt","r",encoding="utf-8") as fp: chatCompletions_model = fp.read() messages = [ { "role": "system", "content": chatCompletions_model }, { "role": "user", "content": "请基于chat.completions.create函数帮忙实现一个可以进行多轮对话的函数" } ] # 调用gpt-3.5-turbo模型 chat_completion = openai.chat.completions.create( model="gpt-3.5-turbo-16k-0613", messages=messages ) # 输出结果 print(chat_completion.choices[0].message.content)
有一些需要修正的:
1.chat_model传参上
2.而且prompt也要改成中文,统一修正
3.并加入本地知识库
4.由于本地知识库错误(落后),导致return message["content"]出错,应该是message.content;还有就是to_dict收到了原文影响
3.测试对轮对话函数
import openai with open("./Chat Completion Models.txt","r",encoding="utf-8") as fp: chatCompletions_model = fp.read() def chat_model(messages): response = openai.chat.completions.create( model="gpt-3.5-turbo-16k-0613", messages=messages ) message = response.choices[0].message.content messages.append({"role": "assistant", "content": message}) return message # 定义初始消息 messages = [ {"role": "system", "content": chatCompletions_model}, {"role": "user", "content": "你好!"}, {"role": "assistant", "content": "你好!我是你的智能助手,有什么我可以帮助你的,都可以向我提问。"} ] # 多轮对话 while True: user_input = input("User: ") if user_input == "exit": break messages.append({"role": "user", "content": user_input}) assistant_response = chat_model(messages) print("Assistant:", assistant_response)