青训营笔记:model API调用相关

214 阅读4分钟

OpenAI的Completions API已经在2023年7月完成最后一次更新并废弃,该接口仅适用于早期版本的少量模型("gpt-3.5-turbo-instruct", "davinci-002", "babbage-002");

相关功能可以被ChatCompletion接口替代。

个人感觉比较重要和常用的是prompt,temperature,n,

调用 Chat 模型

Chat模型中有两个核心概念:消息和角色。

  • 消息:是传递给模型的提示,以列表形式呈现。每个消息包含两部分:

模型基于这些消息生成回复。例如,系统消息设定对话背景(如“你是一个智能助手”),用户消息提出具体请求(如“为我的花店起名”)。

    • role(角色):可以是system(系统)、user(用户)或assistant(助手)。
    • content(内容):即消息的实际信息。
  • 角色
    • system:用于设置对话场景或上下文,帮助模型理解其扮演的角色。
    • user:代表用户的输入,比如提问或指示。
    • assistant:代表模型对用户输入的响应。在多轮对话中,它还可以引用之前的交流来保持连贯性。注意,在一轮对话结束时,最后的消息应来自用户,以便模型能够回应。
      当模型完成处理后,返回的结果将包括一个或多个选择项,每个选择项都是一条带有角色和内容的消息。

在使用Chat模型生成内容后,返回的响应,也就是response会包含一个或多个choices,每个choices都包含一个message。每个message也都包含一个role和content。role可以是system、user或assistant,表示该消息的发送者,content则包含了消息的实际内容。

response的形式

{
 'id': 'chatcmpl-2nZI6v1cW9E3Jg4w2Xtoql0M3XHfH',
 'object': 'chat.completion',
 'created': 1677649420,
 'model': 'gpt-4',
 'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87},
 'choices': [
   {
    'message': {
      'role': 'assistant',
      'content': '你的花店可以叫做"花香四溢"。'
     },
    'finish_reason': 'stop',
    'index': 0
   }
  ]
}

这种设计的主要优点包括:

  1. 对话历史的管理:通过使用Chat模型,你可以更方便地管理对话的历史,并在需要时向模型提供这些历史信息。例如,将过去的用户输入和模型的回复都包含在消息列表中,这样模型在生成新的回复时就可以考虑到这些历史信息。
  2. 角色模拟:通过system角色,你可以设定对话的背景,给模型提供额外的指导信息,从而更好地控制输出的结果。

通过 LangChain 调用 Text 和 Chat 模型

import os
os.environ["OPENAI_API_KEY"] = '你的Open API Key'
from langchain.llms import OpenAI
llm = OpenAI(  
    model="gpt-3.5-turbo-instruct",
    temperature=0.8,
    max_tokens=60,)
response = llm.predict("请给我的花店起个名")
print(response)

# output:
# 花之缘、芳华花店、花语心意、花风旖旎、芳草世界、芳色年华


import os
os.environ["OPENAI_API_KEY"] = '你的Open API Key'
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI(model="gpt-4",
                  temperature=0.8,
                  max_tokens=60)
from langchain.schema import (
HumanMessage,
SystemMessage
)
messages = [
    SystemMessage(content="你是一个很棒的智能助手"),
    HumanMessage(content="请给我的花店起个名")
]
response = chat(messages)
print(response)

# output:
# content='当然可以,叫做"花语秘境"怎么样?' 
# additional_kwargs={} example=False

首先,通过导入LangChain的ChatOpenAI类创建一个聊天模型对象,并设置所需参数。接着,从LangChain导入SystemMessageHumanMessage类来构建消息列表,该列表包含一条设定上下文或指示的系统消息以及一条请求回复的人类消息。最后,利用这个聊天模型对象与消息列表调用相应方法生成回复文本,并将结果保存到response变量中。

思考题

  1. 从今天的两个例子看起来,使用LangChain并不比直接调用OpenAI API来得省事?而且也仍然需要OpenAI API才能调用GPT家族模型。那么LangChain的核心价值在哪里?至少从这两个示例中没看出来。针对这个问题,你仔细思考思考。

LangChain的核心价值在于简化语言模型集成、提高开发效率,并提供额外功能以支持复杂应用开发。它抽象了底层的API调用细节,使得开发者可以专注于构建应用程序的逻辑,而不是处理不同的API和模型之间的差异。

  1. LangChain支持的可绝不只有OpenAI模型,那么你能否试一试HuggingFace开源社区中的其它模型,看看能不能用。
from transformers import pipeline

# 加载 HuggingFace 模型
model_id = "bigscience/bloom-1b7"
pipe = pipeline("text-generation", model=model_id)

# 定义提示
prompt = "给一家新开业的花店起一个吸引人的名字:"

# 生成文本
response = pipe(prompt, max_length=50, do_sample=True, top_k=50, top_p=0.95, num_return_sequences=3)

# 打印生成的名字
for name in response:
    print(name['generated_text'])

3. 上面我提到了生成式模型,那么,大语言模型除了文本生成式模型,还有哪些类别的模型?比如说有名的Bert模型,是不是文本生成式的模型?

除了文本生成,大语言模型还能做文本分类、命名实体识别、问答、文本摘要、机器翻译和对话系统等。Bert主要用于理解文本,不是生成文本的模型。