接着上一篇继续总结,上一篇是对于大语言模型从无到有过程的个人理解,这一篇则是一个现有的大语言模型如何与之进行交互。当然,我是一个编程小白,也缺乏与机器学习、深度学习相关的数学基础,许多内容只是浅显的个人理解,如有纰漏,欢迎交流。
如何使用一个现成的大语言模型?
现成的大语言模型也就是已经经过训练、预训练并发布的模型,沿着上一篇,首先是发布在hugging face上可以自由下载的模型,其中7B、9B这样的小尺寸模型,或许对于一块有着18GB、24GB的GPU是能够支撑的,也就可以在本地部署。其次是现有的服务商提供的在线部署的大尺寸模型,可以直接通过web界面与之进行交互,此外也可通过调用API的形式在本地间接使用。
1.本地部署:
通过在课程中的学习,可以通过hugging face平台的transformer库中的AutoModelForCausalLM类自动拉取模型(类似于在cmd中直接pip一个库或者用git命令拉取一个项目?看起来本质依然是把模型下载到本地),或者直接在hugging face平台下载模型的bin文件至本地,在使用时,通过如下方式导入模型:
'''模型的名称和路径常量 '''
MODEL_NAME = 'llama-2-7b-chat.ggmlv3.q4_K_S.bin'
MODEL_PATH = '/home/huangj/03_Llama/
再定义一个供llm函数接收的类:
from langchain.llms.base import LLM
class CustomLLM(LLM):
model_name = MODEL_NAME
# 该方法使用Llama库调用模型生成回复
def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
prompt_length = len(prompt) + 5
# 初始化Llama模型,指定模型路径和线程数
llm = Llama(model_path=MODEL_PATH+MODEL_NAME, n_threads=4)
# 使用Llama模型生成回复
response = llm(f"Q: {prompt} A: ", max_tokens=256)
# 从返回的回复中提取文本部分
output = response['choices'][0]['text'].replace('A: ', '').strip()
# 返回生成的回复,同时剔除了问题部分和额外字符
return output[prompt_length:]
此外,通过网络查阅,似乎也可以直接通过Langchain.llm库得如下类创建大语言模型实例:
llm = LlamaCPP(model_path=MODEL_PATH)
不过在本地使用模型对内存、显存存在一定要求,生成效率与token容量有限,所运行的小尺寸模型往往也效果欠佳。
2.使用Web页面:
这应该也是对于大多数人最常用的一种接触大语言模型的方式,比如直接使用网页版的豆包、智谱清言。但是这同样存在一些问题:
首先是批处理问题,对于一个通过代码调用的模型,可以直接以一个循环的方式从数据集中读取问题、逐一提交、并接收格式化回答后写入新的文件之中,而网页端大多时候需要以聊天的形式获取输出,在同一个对话框中还可能会受到前置对话的影响。
其次是自由度问题,通过代码调用模型的过程中,可以通过token上限、是否需要mermory、temperature等方式更灵活的调整模型,而在网页对话中,这些参数通常是默认的,同时可能由于超过token容量使得模型在不知道什么时候突然发生“失忆”。
其次也是我个人的一些顾虑,也就是稳定性。线上的模型可能会随时更新调整,比如之前小数点比大小的问题,就很快进行了修复。而一些其他修复可能并不是所有人都需要的,当然,调用API同样会有这样的问题,只能是在本地设备不足情况不得不进行的取舍吧。
3.使用API:
最早对它的了解来自于情感陪伴方向,通过酒馆,借助角色卡、世界观等提示词公车,拉取一个claude 3.5或其他模型,进行定制化聊天。这次学习主要也是借助豆包的API进行,增长了不少认识。
首先是申请到的API怎么读入代码中,直接放在工程文件可能会导致密钥暴露,因而更多时候会选择存入环境变量文件并通过环境变量读取进来,即:
'''.env file'''
OPENAI_API_KEY =
OPENAI_BASE_URL =
LLM_MODELEND =
在项目中:
import os
import python-dotenv
load_dotenv('/path/to/your/.env')
llm = ChatOpenAI(model=os.environ.get("LLM_MODELEND"))