ChatGPT
调用 OpenAI API 是付费服务,需要先获取 OpenAI API Key,之后才能在应用中访问 ChatGPT。首先需要在OpenAI注册账号(登录注册需要科学的上网手段,有可靠方法可留言),如果能成功注册就可以获得一个 OpenAI API KEY,将这个 key 保存到一个.env文件中,将这个文件放到项目根目录下。
读取.env 文件代码:
import os import openai from dotenv import load_dotenv, find_dotenv # 读取本地/项目的环境变量。 # find_dotenv()寻找并定位.env文件的路径 # load_dotenv()读取该.env文件,并将其中的环境变量加载到当前的运行环境中 # 如果你设置的是全局的环境变量,这行代码则没有任何作用。 _ = load_dotenv(find_dotenv()) # 如果你需要通过代理端口访问,你需要如下配置 os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:7890' os.environ["HTTP_PROXY"] = 'http://127.0.0.1:7890' # 获取环境变量 OPENAI_API_KEY openai.api_key = os.environ['OPENAI_API_KEY']
使用OpenAI原生接口调用
# 获取环境变量 OPENAI_API_KEY openai.api_key = os.environ['OPENAI_API_KEY'] # 创建ChatCompletion completion = openai.ChatCompletion.create( model="gpt-3.5-turbo", # 调用ChatGPT3.5 messages=[ {"role": "system", "content": "You are an assistant."}, {"role": "user", "content": "Hello, GPT!"} ] )
参数解释:
model:调用的模型,取值:“gpt-3.5-turbo”(ChatGPT-3.5)、“gpt-3.5-16k-0613”(ChatGPT-3.5 16K 版本)、“gpt-4”(ChatGPT-4)。
message:提示词,ChatCompletion 的 message 需要传入一个列表,列表中包括多个不同角色的 提示词。system:即system prompt;user:用户输入的 prompt;assitance:助手,一般是模型历史回复,作为给模型参考的示例。(一般不需要使用到 system 与 assistance)
temperature:Temperature 系数,控制模型返回的稳定性。
max_tokens:模型输出的最大 token 数。OpenAI 计算 token 数是合并计算 Prompt 和 Completion 的总 token 数,要求总 token 数不能超过模型上限(如默认模型 token 上限为 4096),如果输入的 prompt 较长,需要设置较小的 max_token 值,否则会报错超出限制长度。
使用LangChain调用OpenAI
LangChain 有多种大模型的封装,可以调用 ChatGPT 搭建个人应用。
from langchain.chat_models import ChatOpenAI chat = ChatOpenAI(temperature=0.0)
ChatOpenAI 常用参数:
model_name:模型名称,默认为 ‘gpt-3.5-turbo’。
temperature:温度系数。 openai_api_key:OpenAI API key,
openai_proxy:设置代理。max_tokens:模型输出的最大 token 数。
streaming:是否使用流式传输,即逐字输出模型回答,默认为 False。
LangChain 提供了 Template 模块设置 Prompt。可以直接调用 Template 填充个性化任务。Template 是包括 Python 字符串范式的字符,可以使用 format 方法进行填充。
from langchain.prompts import ChatPromptTemplate template_str = """Translate the text that is delimited by triple backticks into a Chinses. text: ```{text}```""" chat_template = ChatPromptTemplate.from_template(template_str) text = "Today is Saturday." # 接着调用 format_messages 将 template 转化为 message 格式 message = chat_template.format_messages(text=text) response = chat(message)
文心一言
调用文心一言API同样需要key才可以使用。其有两层秘钥认证,第一层,拥有调用权限的账户可获取 API_Key 和 Secret_Key,每一个账户可以创建若干个应用,每个应用会对应一个 API_Key 和 Secret_Key,基于这两个 Key 可获取 access_token 值。使用 access_token 调用百度文心大模型。
进入文心千帆服务平台,选择应用接入,创建文心大模型的应用,创建成功后就可以看到AppID、API Key、Secret Key,使用API Key、Secret Key获取access_token需要通过post请求。
import requests import json def get_access_token(): """ 使用 API Key,Secret Key 获取access_token,替换下列示例中的应用API Key、应用Secret Key """ # 指定网址 url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" \ "{api_key}&client_secret={secret_key}" # 设置 POST 访问 payload = json.dumps("") headers = { 'Content-Type': 'application/json', 'Accept': 'application/json' } # 通过 POST 访问获取账户对应的 access_token response = requests.request("POST", url, headers=headers, data=payload) return response.json().get("access_token")
使用百度原生接口调用
def get_res(prompt): # 调用接口 url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/" \ "eb-instant?access_token={access_token}" # 配置 POST 参数 payload = json.dumps({ "messages": [ { "role": "user", # user prompt "content": "{}".format(prompt) # 输入的 prompt } ] }) headers = {'Content-Type': 'application/json'} # 发起请求 response = requests.request("POST", url, headers=headers, data=payload) # 返回的是一个 Json 字符串 js = json.loads(response.text) return js["result"]
常用参数:
messages:提示词,不支持 max_token 参数,由模型自行控制最大 token 数,content 总长度不能超过11200字符,超出时模型自动遗忘前文。
temperature:温度系数,默认0.95,不能设置为0。stream:是否使用流式传输。
使用LangChain调用文心模型
原生的 LangChain 不支持调用文心模型,需要自定义LLM后才可使用。
ChatGLM
ChatGLM 包括 ChatGLM-130B 和 ChatGLM-6B 模型,支持复杂的自然语言指令,可解决推理类问题。初次使用的用户有18元token的免费使用额度。ChatGLM 有 SDK 和 HTTP 两种方式实现模型 API 的调用,建议使用 SDK 进行调用以获得更好的编程体验。注:需要安装zhupuai库。
import zhipuai zhipuai.api_key = "api key" # 填写控制台中获取的 APIKey 信息 model = "chatglm_std" # 用于配置大模型版本 def get_prompt(role, content, ms=[]): # role 是指定角色,content 是 prompt 内容 d = dict() d["role"] = role d["content"] = content ms.append(d) return ms p = get_prompt("user", "Hello!") # 请求模型, 调用glm的SDK response = zhipuai.model_api.invoke( model=model, prompt=p ) print(response)
常用参数:
prompt:
列表, 按照 {"role": "user", "content": "Hello!"} 的键值对形式进行传参,超过模型输入长度限制会自动截断。
temperature:控制输出的随机性,(0.0,1.0],不能等于 0,默认值 0.95 。
top_p:
核取样,(0.0, 1.0) ,默认值 0.7,0.7表示从前 70% 的结果中取 tokens。
request_id:字符串,
每次请求的唯一标识,用户端传参要保证唯一,为空则默认生成。
return_type:字符串,
返回内容的类型,默认返回json_string,text
表示返回文本内容。
注:可根据需要调整top_p或temperature,但不要同时调整。
使用LangChain调用ChatGLM时同样需要先自定义LLM才可使用。
LLM开发流程
调用 LLM 的 API 实现核心的理解与生成,使用 Prompt 控制大语言模型。LLM的两个核心功能:指令理解和文本生成。相比之前,使用小模型解决业务问题,需要将业务分解成子问题,对每个子问题划分训练集和验证集,训练模型,最后在将模型链接在一起。在 LLM 的帮助下,可使用通用模型 + 不同业务的提示词来解决业务问题。在这种情况下,对效果的评估也不同于之前,由于不需要构建训练集、验证集、测试集,而是直接使用业务数据作为验证集以调整提示词,并结果不好的数据作为测试集修改提高提示词。
开发过程分解
应用目的:开发模型的核心目的。
应用功能:应用需实现的功能及业务逻辑拆解。
应用架构:业务数据 + 提示词 + 通用大模型
数据处理:对业务数据预处理,做向量化并存在数据库中。
提示工程:使用业务数据构建验证集并以此设计提示词。
优化迭代:根据上一步构建的提示词效果,选出效果不佳的case优化提示词。