1.LLM层

将zhipuai API 进行封装

语言模型的接入

使用智谱 GLM

智谱 AI 是由清华大学计算机系技术成果转化而来的公司,致力于打造新一代认知智能通用模型。公司合作研发了双语千亿级超大规模预训练模型 GLM-130B,并构建了高精度通用知识图谱,形成数据与知识双轮驱动的认知引擎,基于此模型打造了 ChatGLM(chatglm.cn)。

ChatGLM 系列模型,包括 ChatGLM-130B、ChatGLM-6B 和 ChatGLM2-6B(ChatGLM-6B 的升级版本)模型,支持相对复杂的自然语言指令,并且能够解决困难的推理类问题。其中,ChatGLM-6B 模型来自 Huggingface 上的下载量已经超过 300w(截至 2023 年 6 月 24 日统计数据),该模型在 Hugging Face (HF) 全球大模型下载榜中连续 12 天位居第一名,在国内外的开源社区中产生了较大的影响。

1 API 申请

首先进入到 智谱AI开放平台,点击开始使用或者开发工作台进行注册:新注册的用户可以免费领取有效期 1 个月的 100w token 的体验包,进行个人实名认证后,还可以额外领取 400w token 体验包。智谱 AI 提供了 GLM-4 和 GLM-3-Turbo 这两种不同模型的体验入口,我们选择GLM-4。

智谱 AI 控制台

对于需要使用 API key 来搭建应用的话,需要点击右侧的查看 API key按钮,就会进入到我们个人的 API 管理列表中。在该界面,就可以看到我们获取到的 API 所对应的应用名字和 API key 了。

智谱 AI api 管理

我们可以点击 添加新的 API key 并输入对应的名字即可生成新的 API key。

2 调用智谱 GLM API

智谱 AI 提供了 SDK 和原生 HTTP 来实现模型 API 的调用,我们使用 SDK 进行调用以获得更好的编程体验。

首先需要配置密钥信息,将前面获取到的 API key 设置到 .env 文件中的 ZHIPUAI_API_KEY 参数,然后运行以下代码加载配置信息。

import os

from dotenv import load_dotenv, find_dotenv

# 读取本地/项目的环境变量。

# find_dotenv() 寻找并定位 .env 文件的路径
# load_dotenv() 读取该 .env 文件,并将其中的环境变量加载到当前的运行环境中  
# 如果你设置的是全局的环境变量,这行代码则没有任何作用。
_ = load_dotenv(find_dotenv())

智谱的调用传参和其他类似,也需要传入一个 messages 列表,列表中包括 role 和 prompt。我们封装如下的 get_completion 函数,供后续使用。

from zhipuai import ZhipuAI

client = ZhipuAI(
    api_key=os.environ["ZHIPUAI_API_KEY"]
)

def gen_glm_params(prompt):
    '''
    构造 GLM 模型请求参数 messages

    请求参数:
        prompt: 对应的用户提示词
    '''
    messages = [{"role": "user", "content": prompt}]
    return messages


def get_completion(prompt, model="glm-4", temperature=0.95):
    '''
    获取 GLM 模型调用结果

    请求参数:
        prompt: 对应的提示词
        model: 调用的模型,默认为 glm-4,也可以按需选择 glm-3-turbo 等其他模型
        temperature: 模型输出的温度系数,控制输出的随机程度,取值范围是 0~1.0,且不能设置为 0。温度系数越低,输出内容越一致。
    '''

    messages = gen_glm_params(prompt)
    response = client.chat.completions.create(
        model=model,
        messages=messages,
        temperature=temperature
    )
    if len(response.choices) > 0:
        return response.choices[0].message.content
    return "generate answer error"
get_completion("你好")
'你好!有什么可以帮助您的吗?'

传入 zhipuai 的参数介绍:

  • messages (list),调用对话模型时,将当前对话信息列表作为提示输入给模型;按照 {"role": "user", "content": "你好"} 的键值对形式进行传参;总长度超过模型最长输入限制后会自动截断,需按时间由旧到新排序

  • temperature (float),采样温度,控制输出的随机性,必须为正数取值范围是:(0.0, 1.0),不能等于 0,默认值为 0.95。值越大,会使输出更随机,更具创造性;值越小,输出会更加稳定或确定

  • top_p (float),用温度取样的另一种方法,称为核取样。取值范围是:(0.0, 1.0) 开区间,不能等于 0 或 1,默认值为 0.7。模型考虑具有 top_p 概率质量 tokens 的结果。例如:0.1 意味着模型解码器只考虑从前 10% 的概率的候选集中取 tokens

  • request_id (string),由用户端传参,需保证唯一性;用于区分每次请求的唯一标识,用户端不传时平台会默认生成

  • 根据应用场景调整 top_p 或 temperature 参数

项目代码

from typing import Any, List, Mapping, Optional, Dict
from langchain_core.callbacks.manager import CallbackManagerForLLMRun
from langchain_core.language_models.llms import LLM
from zhipuai import ZhipuAI


# 继承自 langchain_core.language_models.llms.LLM,用于调用 ZhipuAI 的语言模型服务
class ZhipuAILLM(LLM):
    # 默认选用 glm-4 模型
    model: str = "glm-4"
    # 温度系数
    temperature: float = 0.1
    # API_Key
    api_key: str = None
    max_tokens: int = 2048


#定义 _call 方法:
    #这个方法实现了实际的 API 调用逻辑:
           #初始化 ZhipuAI 客户端。
           #生成请求参数。
           #调用 chat.completions.create 方法获取响应。
           #返回响应中的内容,如果没有结果则返回错误信息。
    def _call(self, prompt: str, stop: Optional[List[str]] = None,
              run_manager: Optional[CallbackManagerForLLMRun] = None,
              **kwargs: Any):

        #生成 GLM 模型请求参数的方法:
        #生成 GLM 模型的请求参数 messages,包括系统消息和用户输入
        def gen_glm_params(prompt):
            '''
            构造 GLM 模型请求参数 messages

            请求参数:
                prompt: 对应的用户提示词
            '''
            messages = [{"role": "system", "content": """
            - Role: 金融分析师
            - Background: 用户需要对金融领域的文本进行深入分析,以回答特定的金融问题。
            - Profile: 你是一位经验丰富的金融分析师,具备深厚的金融市场知识、财务报表分析能力以及对金融新闻和数据的敏感度。
            - Skills: 金融市场分析、财务报表解读、金融产品知识、数据分析、问题解决。
            - Goals: 设计一个流程,帮助用户从金融文本中提取关键信息,并回答相关的金融问题。
            - Constrains: 分析必须准确无误,避免误导用户。同时,应遵守金融行业的法律法规和道德标准。
            - OutputFormat: 结果应以清晰、条理分明的文本形式呈现,包括关键数据点和分析结论。
            - Workflow:
              1. 阅读并理解提供的金融文本。
              2. 提取文本中的关键金融信息和数据。
              3. 分析这些信息,形成对问题的响应。
            - Examples:
              文本:“2023年第一季度,XYZ公司的净利润增长了15%,主要得益于其新产品线的成功推出。”
              问题:“XYZ公司净利润增长的原因是什么?”
              回答:XYZ公司净利润增长的原因主要是其新产品线的成功推出。
            
              文本:“最新的市场报告显示,由于全球经济放缓,ABC股票的价格在过去一个月内下跌了10%。”
              问题:“ABC股票价格下跌的主要原因是什么?”
              回答:ABC股票价格下跌的主要原因是全球经济放缓。
            
            - Initialization: 欢迎使用金融信息检索服务。请提供您需要分析的金融文本,以及您想要了解的具体问题。
            """},
                {"role": "user", "content": prompt}]
            return messages

        client = ZhipuAI(
            api_key=self.api_key
        )

        messages = gen_glm_params(prompt)
        response = client.chat.completions.create(
            model="glm-4",
            messages=messages,
            temperature=self.temperature,
            max_tokens=self.max_tokens
        )

        if len(response.choices) > 0:
            return response.choices[0].message.content
        return "generate answer error"

    # 定义属性方法:
      # _default_params:返回调用 API 的默认参数。
      # _llm_type:返回模型类型的字符串标识。
      # _identifying_params:返回模型的标识参数。
    # 首先定义一个返回默认参数的方法
    @property
    def _default_params(self) -> Dict[str, Any]:
        """获取调用Ennie API的默认参数。"""
        normal_params = {
            "temperature": self.temperature,
        }
        # print(type(self.model_kwargs))
        return {**normal_params}

    @property
    def _llm_type(self) -> str:
        return "Zhipu"

    @property
    def _identifying_params(self) -> Mapping[str, Any]:
        """Get the identifying parameters."""
        return {**{"model": self.model}, **self._default_params}
  • 定义了一个 ZhipuAILLM 类,用于调用 ZhipuAI 的 GLM 模型。
  • 提供了同步调用方法 _call,并生成 GLM 模型的请求参数。
  • 通过属性方法返回默认参数、模型类型和标识参数。
  • 41
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值