【大模型应用开发教程】03_调用大模型 API

教程地址:奇想星球
项目地址:llm-universe

一、基本概念

1. Prompt

Prompt 最初是 NLP(自然语言处理)研究者为下游任务设计出来的一种任务专属的输入模板,类似于一种任务(例如:分类,聚类等)会对应一种 Prompt。在 ChatGPT 推出并获得大量应用之后,Prompt 开始被推广为给大模型的所有输入。即,我们每一次访问大模型的输入为一个 Prompt,而大模型给我们的返回结果则被称为 Completion

例如,在下面示例中,我们给 ChatGPT 的提问 “NLP 中的 Prompt 指什么”是我们的提问,其实也就是我们此次的 Prompt;而 ChatGPT 的返回结果就是此次的 Completion。也就是对于 ChatGPT 模型,该 Prompt 对应的 Completion 是下图的展示。
在这里插入图片描述

后续我们都将会使用 Prompt 替代给 LLM 的输入,使用 Completion 替代 LLM 的输出。同时,我们会结合具体案例,介绍如何设计 Prompt 能够充分发挥 LLM 的能力。

2. Temprature

LLM 生成是具有随机性的,在模型的顶层通过选取不同预测概率的预测结果来生成最后的结果。我们一般可以通过控制 Temprature 参数来控制 LLM 生成结果的随机性与创造性。

Temprature 一般取值在 0~1 之间:

  • 当取值较低接近0时,预测的随机性会较低,产生更保守、可预测的文本,不太可能生成意想不到或不寻常的词。
  • 当取值较高接近1时,预测的随机性会较高,所有词被选择的可能性更大,会产生更有创意、多样化的文本,更有可能生成不寻常或意想不到的词。

例如,当我们使用 ChatGPT 要求其为我们想一个关于跨语言模型的硕士毕业论文选题,当我们将 temprature 设置为0时,模型回复为:

题目:基于跨语言模型的机器翻译性能优化研究

摘要:随着全球化的发展,跨语言交流的需求日益增长。机器翻译作为一种自动化翻译技术,为跨语言交流提供了便利。然而,由于语言之间的差异性,机器翻译系统在不同语言对之间的性能存在差异。本论文旨在通过研究跨语言模型,探索如何优化机器翻译的性能,提高翻译质量和准确性。

关键词:跨语言模型,机器翻译,性能优化,翻译质量,准确性

1. 引言
1.1 研究背景和意义
1.2 国内外研究现状
1.3 研究目标和内容

2. 跨语言模型的原理和方法
2.1 传统机器翻译方法
2.2 跨语言模型的基本原理
2.3 跨语言模型的常用方法和技术

3. 跨语言模型在机器翻译中的应用
3.1 跨语言模型在机器翻译中的优势和挑战
3.2 跨语言模型在不同语言对上的性能表现比较
3.3 跨语言模型在特定领域机器翻译中的应用案例分析

4. 跨语言模型的性能优化方法
4.1 数据预处理和特征选择
4.2 模型参数调优和训练策略
4.3 跨语言模型与其他技术的结合应用

5. 实验设计与结果分析
5.1 实验设计和数据集介绍
5.2 实验结果分析和对比
5.3 实验结果的可行性和可靠性验证

6. 结论与展望
6.1 研究工作总结
6.2 存在的问题和不足
6.3 进一步研究方向和展望

参考文献

注:以上仅为一个选题示例,具体选题应根据个人兴趣和研究背景进行调整和修改。

当我们将 Temprature 设置为1时,模型回复为:

以下是关于跨语言模型的几个硕士毕业论文选题建议:

1. 跨语言文本分类模型的比较和优化——通过比较不同跨语言模型的性能,分析其在不同语言之间的适应性和准确性,并尝试优化现有模型,提高跨语言文本分类的效果。

2. 基于跨语言模型的机器翻译性能分析——通过比较不同跨语言模型在机器翻译任务中的表现,研究不同语言之间的短板和优势,并探讨如何针对性地改进跨语言机器翻译的性能。

3. 跨语言情感分析模型的构建与应用——使用跨语言模型构建情感分析模型,通过比较模型在不同语言上的准确性和一致性,分析不同语言中情感表达的差异,并探索在多语言场景下的情感分析应用。

4. 多任务学习下的跨语言模型训练——探索多任务学习下跨语言模型的训练方法和效果,通过同时训练多个任务来提高跨语言模型的泛化能力和性能,并验证多任务学习对跨语言模型的影响。

5. 跨语言问答系统的构建与评估——构建跨语言问答系统,通过跨语言模型实现问题的自动解析和答案的生成,并评估系统在多语言环境下的效果和可用性。

6. 基于预训练的跨语言模型的应用于语音识别——将预训练的跨语言模型应用于语音识别任务中,研究其对语音识别准确性和多语种适应性的影响,并比较不同模型对多语种语音数据的处理能力。

选择适合自己兴趣和研究方向的选题,并与导师进行深入讨论和确认。

对于不同的问题与应用场景,我们可能需要设置不同的 Temprature。例如,

  • 在本教程搭建的个人知识库助手项目中,我们一般将 Temprature 设置为0,从而保证助手对知识库内容的稳定使用,规避错误内容、模型幻觉;
  • 在产品智能客服、科研论文写作等场景中,我们同样更需要稳定性而不是创造性;
  • 但在个性化 AI、创意营销文案生成等场景中,我们就更需要创意性,从而更倾向于将 Temprature 设置为较高的值。

3. System Prompt

System Prompt 是随着 ChatGPT API 开放并逐步得到大量使用的一个新兴概念,事实上,它并不在大模型本身训练中得到体现,而是大模型服务方为提升用户体验所设置的一种策略。

具体来说,在使用 ChatGPT API 时,你可以设置两种 Prompt:

  1. System Prompt,该种 Prompt 内容会在整个会话过程中持久地影响模型的回复,且相比于普通 Prompt 具有更高的重要性;
  2. User Prompt,这更偏向于咱们平时的 Prompt,即需要模型做出回复的输入。

我们一般设置 System Prompt 来对模型进行一些初始化设定,例如,我们可以在 System Prompt 中给模型设定我们希望它具备的人设如一个个人知识库助手等。System Prompt 一般在一个会话中仅有一个。在通过 System Prompt 设定好模型的人设或是初始设置后,我们可以通过 User Prompt 给出模型需要遵循的指令。例如,当我们需要一个幽默风趣的个人知识库助手,并向这个助手提问我今天有什么事时,可以如下地构造 Prompt:

{
    
    
    "system prompt":"你是一个幽默风趣的个人知识库助手,可以根据给定的知识库内容回答用户的提问,注意,你的回答风格应是幽默风趣的",
    "user prompt":"我今天有什么事务?"
}

通过如上 Prompt 的构造,我们可以让模型以幽默风趣的风格回答用户提出的问题。注意,如果有多个用户问题,那么我们只需要添加对应数量的 User Prompt 即可,System Prompt 仅需构造一个。

附一 基于 LangChain 自定义 LLM

LangChain 为基于 LLM 开发自定义应用提供了高效的开发框架,便于开发者迅速地激发 LLM 的强大能力,搭建 LLM 应用。

LangChain 也同样支持多种大模型,内置了 OpenAI、LLAMA 等大模型的调用接口。但是,LangChain 并没有内置所有大模型,它通过允许用户自定义 LLM 类型,来提供强大的可扩展性。

在本部分,我们以百度文心大模型为例,讲述如何基于 LangChain 自定义 LLM,让我们基于 LangChain 搭建的应用能够支持百度文心、讯飞星火等国内大模型。

本部分涉及相对更多 LangChain、大模型调用的技术细节,有精力同学可以学习部署,如无精力可以直接使用后续代码来支持调用。

要实现自定义 LLM,需要定义一个自定义类继承自 LangChain 的 LLM 基类,然后定义两个函数:

  1. _call 方法,其接受一个字符串,并返回一个字符串,即模型的核心调用;
  2. _identifying_params 方法,用于打印 LLM 信息。

首先我们导入所需的第三方库:

import json
import time
from typing import Any, List, Mapping, Optional, Dict, Union, Tuple
import requests
from langchain.callbacks.manager import CallbackManagerForLLMRun
from langchain.llms.base import LLM
from langchain.utils import get_from_dict_or_env
from pydantic import Field, model_validator

由于百度文心使用双重秘钥进行认证,用户需要先基于 API_Key 与 Secret_Key 来获取 access_token,再使用 access_token 来实现对模型的调用(详见《3. 调用百度文心》),因此我们需要先定义一个 get_access_token 方法来获取 access_token:

def get_access_token(api_key : str, secret_key : str):
    """
    使用 API Key,Secret Key 获取access_token,替换下列示例中的应用API Key、应用Secret Key
    """
    # 指定网址
    url = f"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")

接着我们定义一个继承自 LLM 类的自定义 LLM 类:

# 继承自 langchain.llms.base.LLM
class Wenxin_LLM(LLM):
    # 原生接口地址
    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant"
    # 默认选用 ERNIE-Bot-turbo 模型,即目前一般所说的百度文心大模型
    model_name: str = Field(default="ERNIE-Bot-turbo", alias="model")
    # 访问时延上限
    request_timeout: Optional[Union[float, Tuple[float, float]]] = None
    # 温度系数
    temperature: float = 0.1
    # API_Key
    api_key: str = None
    # Secret_Key
    secret_key : str = None
    # access_token
    access_token: str = None
    # 必备的可选参数
    model_kwargs: Dict[str, Any] = Field(default_factory=dict)

上述初始化涵盖了我们平时常用的参数,也可以根据实际需求与文心的 API 加入更多的参数。

接下来我们实现一个初始化方法 init_access_token,当模型的 access_token 为空时调用:

def init_access_token(self):
    if self.api_key != None and self.secret_key != None:
        # 两个 Key 均非空才可以获取 access_token
        try:
            self.access_token = get_access_token(self.api_key, self.secret_key)
        except Exception as e:
            print(e)
            print("获取 access_token 失败,请检查 Key")
    else:
        print("API_Key 或 Secret_Key 为空,请检查 Key")
接下来我们实现核心的方法——调用模型 API:
def _call(self, prompt : str, stop: Optional[List[str]] = None,
                run_manager: Optional[CallbackManagerForLLMRun] = None,
                **kwargs: Any):
    # 除 prompt 参数外,其他参数并没有被用到,但当我们通过 LangChain 调用时会传入这些参数,因此必须设置
    # 如果 access_token 为空,初始化 access_token
    if self.access_token == None:
        self.init_access_token()
    # API 调用 url
    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token={}".format(self.access_token)
    # 配置 POST 参数
    payload = json.dumps({
    
    
        "messages": [
            {
    
    
                "role": "user",# user prompt
                "content": "{}".format(prompt)# 输入的 prompt
            }
        ],
        'temperature' : self.temperature
    })
    headers = {
    
    
        'Content-Type': 'application/json'
    }
    # 发起请求
    response = requests.request("POST", url, headers=headers, data=payload, timeout=self.request_timeout)
    if response.status_code == 200:
        # 返回的是一个 Json 字符串
        js = json.loads(response.text)
        return js["result"]
    else:
        return "请求失败"

然后我们还需要定义一下模型的描述方法:

# 首先定义一个返回默认参数的方法
@property
def _default_params(self) -> Dict[str, Any]:
    """获取调用Ennie API的默认参数。"""
    normal_params = {
    
    
        "temperature": self.temperature,
        "request_timeout": self.request_timeout,
        }
    return {
    
    **normal_params}


@property
def _identifying_params(self) -> Mapping[str, Any]:
    """Get the identifying parameters."""
    return {
    
    **{
    
    "model_name": self.model_name}, **self._default_params}

通过上述步骤,我们就可以基于 LangChain 定义百度文心的调用方式了。我们将此代码封装在 wenxin_llm.py 文件中,将在讲述如何调用百度文心的 Notebook 中直接使用该 LLM。

更具体代码可参考notebook

七、总结

在本章中,我们简要介绍了四种常用大模型 API 的调用方式:ChatGPT、百度文心、讯飞星火、智谱 AI。四种模型 API 都具有不同的调用要求,我们分别进行了介绍并对其原生接口进行了封装,方便用户直接调用使用;同时,我们也简要介绍了如何将大模型 API 封装到 LangChain 的自定义 LLM 中,如何将大模型 API 封装成统一方式调用的本地 API,以及如何将大模型 Embedding API 封装到 LangChain 的自定义 LLM 中。我们分别以百度文心、讯飞星火、智谱 AI作为示例介绍了调用方式,欢迎读者们自行实践尝试将更多的模型进行统一封装。

学习完本章,你应该掌握了常用大模型的基本调用方式,那么接下来,你就可以开始着手基于大模型打造自己的应用啦!

公众号:奇想星球平台
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/liluo_2951121599/article/details/134023879