初始大模型开发技术
chatgpt与openai
最直观感受:
在网页中打开 https://chat.openai.com/,就是浏览器上显示最左边的图标;
在网页中打开 https://platform.openai.com/,就是浏览器上显示最右边的图片;
在网页中打开 https://openai.com/pricing,浏览器显示重点绿色的图标,是openai各个模型的收费标准;
现在注册openai的账号只需要邮箱,不需要国外手机号,但是申请api key还是需要国外手机号接收验证码才能获取;新注册用户会有5美金的免费额度,好像是3个月有效期;
chatgpt产品形态
聊天模型,免费版本基于gpt-3.5,在大模型外层包了审核机制和用户界面的应用,开通plus版本,可以使用gpt-4,还可以使用gpts,类似可以让用户自己定制自己的会话主题等,也是将openai的一系列接口做了定制,包了用户界面,供没有开发经验的用户快速个性化的使用 可以自己定制的chatgpt;
gpts的详细解释以及与 assitant api的区别可参考:
https://www.datalearner.com/blog/1051701996595465
openai产品形态
openai playground
playground,类似上面的gpts,只是gpts是定制的,需要开通plus,这个playground应该是通过调用模型api接口(自动调用,不需要申请api key),按token来扣费的;
playground界面:有system,user,assistant三个角色;
system:你想让他做为什么角色来跟用户对话,在这里定义;
user:用户输入信息;
assistant:针对用户输入返回的信息,你也可以定义一些返回信息,他会拿去做接下来回复的参考,当然也可以修改返回信息;
可以保存,可以view code来看相应的代码;
右侧model,temperature(0返回固定),maximum length等参数在代码中都有对应;
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{
"role": "user",
"content": ""
},
{
"role": "assistant"
}
],
temperature=1,
max_tokens=256,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
playground中也可以选择chat,assistants,complete;
playground和api key的收费可以在usage中进行查看:
openai api key
openai官网api的详细介绍: https://platform.openai.com/docs/api-reference/introduction
openai包的github地址:https://github.com/openai/openai-python
通过python使用openai,通过pip直接安装就可以,安装好导入,openai中模型接口的调用是通过key来进行收费,在系统环境变量中配置好OPENAI_API_KEY,以免暴露;
import os
from openai import OpenAI
client = OpenAI(
# This is the default and can be omitted
api_key=os.environ.get("OPENAI_API_KEY")
)
models = client.models.list()
model_list = [[model.id,model.owned_by] for model in models.data] #查看当前可用的openai的models
'''
output:
[['dall-e-3', 'system'],
['gpt-3.5-turbo-0613', 'openai'],
['dall-e-2', 'system'],
['gpt-3.5-turbo-instruct-0914', 'system'],
['whisper-1', 'openai-internal'],
['tts-1-hd-1106', 'system'],
['tts-1-hd', 'system'],
['babbage-002', 'system'],
['text-embedding-3-small', 'system'],
['gpt-3.5-turbo-instruct', 'system'],
['gpt-3.5-turbo-0125', 'system'],
['gpt-3.5-turbo', 'openai'],
['davinci-002', 'system'],
['gpt-3.5-turbo-0301', 'openai'],
['gpt-3.5-turbo-16k', 'openai-internal'],
['tts-1', 'openai-internal'],
['tts-1-1106', 'system'],
['text-embedding-ada-002', 'openai-internal'],
['gpt-3.5-turbo-1106', 'system'],
['gpt-3.5-turbo-16k-0613', 'openai'],
['text-embedding-3-large', 'system']]
'''
由于按照tokens计费,所以openai提供了tiktoken包,可以用来计算输入的token数,官方cookbook参考:https://cookbook.openai.com/examples/how_to_count_tokens_with_tiktoken#5-comparing-encodings;
import tiktoken
embedding_encoding = "cl100k_base"
encoding = tiktoken.get_encoding(embedding_encoding)
x="你是王后,你是女生"
encoding.encode(x)
'''
output:
[57668, 21043, 29207, 233, 34547, 3922, 57668, 21043, 58850, 21990]
'''
for i in [57668, 21043, 29207, 233, 34547, 3922, 57668, 21043, 58850, 21990]:
print(i,encoding.decode([i]))
'''
output:
57668 你
21043 是
29207 �
233 �
34547 后
3922 ,
57668 你
21043 是
58850 女
21990 生
'''
其中 embedding_encoding与相应模型对应:
openai model api
Completions API
data = client.completions.create(
model="gpt-3.5-turbo-instruct",
prompt="讲个笑话",
max_tokens=1000,
temperature=0
)
Embedding API
embedding_model = "text-embedding-ada-002"
res = client.embeddings.create(input="abc", model=embedding_model)
print(res.data[0].embedding)
Chat Completions API
简单对话:
messages=[
{
"role": "user",
"content": "Hello!"
}
]
data = client.chat.completions.create(
model="gpt-3.5-turbo",
messages = messages
)
new_message = data.choices[0].message
print(new_message)
'''
output:
ChatCompletionMessage(content='Hello! How can I assist you today?', role='assistant', function_call=None, tool_calls=None)
'''
可以通过追加消息设置多角色,实现类似playground的功能;
messages=[
{"role": "system", "content": "你是一个乐于助人的体育界专家。"},
{"role": "user", "content": "2008年奥运会是在哪里举行的?"},
]
data = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=messages
)
message = data.choices[0].message.content
print(message)
'''
output:
2008年奥运会是在中国的北京市举行的。有什么其他的问题我可以回答吗?
'''
messages.append({"role": "assistant", "content": message})
messages.append({"role": "user", "content": "1.金牌最多的是哪个国家?2.奖牌最多的是哪个国家?"})
data = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=messages
)
print(data.choices[0].message.content)
'''
output:
1. 2008年奥运会中,金牌最多的国家是中国。中国取得了51枚金牌。
2. 奖牌最多的国家同样是中国。中国在2008年奥运会中获得了100枚奖牌,其中包括51枚金牌、21枚银牌和28枚铜牌。有没有其他的问题呢?
'''
但是同样的问题直接问是这样的问答:
data = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{'role': 'user', 'content': '1.金牌最多的是哪个国家?2.奖牌最多的是哪个国家?'}]
)
print(data.choices[0].message.content)
'''
1. 目前,美国是金牌最多的国家。根据2021年东京奥运会数据,美国的金牌总数为1137枚。
2. 目前,美国是奖牌最多的国家。根据2021年东京奥运会数据,美国的奖牌总数为2820枚。
'''
langchain
多角色,实现类似playground的功能:
from langchain.chat_models import ChatOpenAI
chat_model = ChatOpenAI(model_name="gpt-3.5-turbo")
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
chat_model = ChatOpenAI(model_name="gpt-3.5-turbo")
messages = [
SystemMessage(
content="You are a helpful assistant that translates English to Chinese."
),
HumanMessage(
content="I love programming."
),
]
chat_model(messages)
'''
output:
AIMessage(content='我喜欢编程。')
'''
messages = [SystemMessage(content="You are a helpful assistant."),
HumanMessage(content="Who won the world series in 2020?"),
AIMessage(content="The Los Angeles Dodgers won the World Series in 2020."),
HumanMessage(content="Where was it played?")]
chat_model(messages)
'''
output:
AIMessage(content='The 2020 World Series was played at Globe Life Field in Arlington, Texas.')
'''
langchain其他的功能后续更新,由于官方更新较快,最新信息以官方文档为准:
https://python.langchain.com/docs/get_started/introduction
https://api.python.langchain.com/en/latest/langchain_api_reference.html#
gradio
交互界面可使用gradio来开发,类似界面如下:
官方文档:https://www.gradio.app/docs/interface
flask
通过requests接口提供服务,可以使用flask来开发
后续
以上是基础概念的理解以及大概技术的梳理,至于大模型的应用中 用到的RAG,chain of thoughts的实现,以及在推荐系统中如何应用大模型的论文的实现以及落地应用(https://zhuanlan.zhihu.com/p/658252702),继续探索中。。。