前言
【在线阅读地址】https://datawhalechina.github.io/llm-universe/
【项目仓库地址】https://github.com/datawhalechina/llm-universe
【用户反馈地址】https://emoumcwvfx.feishu.cn/share/base/form/shrcnWBh2a9gl3HhW5ww736B64f
【小程序使用手册】
https://mp.weixin.qq.com/s/iPmzb72Yk0mhIA2NYezXDg
关于如何调用各种大模型API,【动手学大模型应用开发】这门课程已经讲得很详细了,在这里就不再多说。
在第二章的学习中,我觉得最大的收获是了解了LangChain,以及如何使用 LangChain 调用各种大模型。下面记录一下使用 LangChain 调用百度文心的过程。
使用 LangChain 调用百度文心
1.将自定义好 Wenxin_LLM,封装在 wenxin_llm.py中
代码如下:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : wenxin_llm.py
@Time : 2023/09/22 14:27:55
@Author : Logan Zou
@Version : 1.0
@Contact : loganzou0421@163.com
@License : (C)Copyright 2017-2018, Liugroup-NLPR-CASIA
@Desc : 基于 LangChain 定义文心模型调用方式
'''
import json
import time
from typing import Any, List, Mapping, Optional, Dict, Union, Tuple
import requests
from langchain.llms.base import LLM
from langchain.utils import get_from_dict_or_env
from pydantic import Field, root_validator
from langchain.callbacks.manager import CallbackManagerForLLMRun
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")
# 继承自 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 = "ERNIE-Bot-turbo"
# 访问时延上限
request_timeout: 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)
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")
def _call(self, prompt : str, stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
**kwargs: Any):
# 如果 access_token 为空,初始化 access_token
if self.access_token == None:
self.init_access_token()
# API 调用 url
url="{}?access_token={}".format(self.url,self.access_token)
#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,
}
# print(type(self.model_kwargs))
return {**normal_params}
@property
def _llm_type(self) -> str:
return "Wenxin"
@property
def _identifying_params(self) -> Mapping[str, Any]:
"""Get the identifying parameters."""
return {**{"model_name": self.model_name}, **self._default_params}
我对课程中的_call方法做了一点小修改,
将
url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token{}".format(self.access_token)
改为了
url="{}?access_token={}".format(self.url,self.access_token)
使得可以在调用Wen_LLM的时候按自己的需要输入要调用的模型url
2.调用定义好的 Wenxin_LLM
import os
from wenxin_llm import Wenxin_LLM
os.environ["wenxin_api_key"]="***" #自己申请的api_key
os.environ["wenxin_secret_key"]="***" #自己申请的secret_key
wenxin_api_key = os.environ["wenxin_api_key"]
wenxin_secret_key = os.environ["wenxin_secret_key"]
#调用ERNIE-Bot 4.0模型
url="https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro"
llm = Wenxin_LLM(api_key=wenxin_api_key, secret_key=wenxin_secret_key,url=url)
llm("你有什么功能")
输出结果:
‘我有许多功能和应用,比如:各种类型的问答、各种文本创作、推理与数学计算、写代码、聊天交流、图片生成等,有什么我可以帮您的吗?’