语言模型的接入
使用智谱 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。
对于需要使用 API key 来搭建应用的话,需要点击右侧的查看 API key
按钮,就会进入到我们个人的 API 管理列表中。在该界面,就可以看到我们获取到的 API 所对应的应用名字和 API key
了。
我们可以点击 添加新的 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 模型的请求参数。 - 通过属性方法返回默认参数、模型类型和标识参数。