1、加载模型以及 Tokenizer
IPEX-LLM 支持 AutoModel、AutoModelForCausalLM、AutoModelForSpeechSeq2Seq 和 AutoModelForSeq2SeqLM。前缀带有 Auto 的这些类可帮助用户自动读取相关模型.
from ipex_llm.transformers import AutoModelForCausalLM
model_path = 'THUDM/chatglm3-6b'
model = AutoModelForCausalLM.from_pretrained(model_path,
load_in_4bit=True,
trust_remote_code=True)
LLM 推理也需要一个 tokenizer。它用于将输入文本编码为张量,然后输入 LLM,并将 LLM 输出的张量解码为文本。您可以使用 Huggingface transformers API 直接加载 tokenizer。它可以与 IPEX-LLM 加载的模型无缝配合使用。
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(model_path,
trust_remote_code=True)
2、推理
在生成之前,需要创建一个 prompt 模板。这里我们给出了一个用于提问和回答的 prompt 模板示例,参考自 ChatGLM2-6B prompt template。也可以根据自己的模型调整 prompt。
CHATGLM_V3_PROMPT_TEMPLATE = "问:{prompt}\n\n答:"
接下来,您可以使用加载的模型与 tokenizer 生成输出,generate 函数中的 max_new_tokens 参数定义了预测的最大 token 数量。
import time
import torch
prompt = "AI是什么?"
n_predict = 256
with torch.inference_mode():
prompt = CHATGLM_V3_PROMPT_TEMPLATE.format(prompt=prompt)
input_ids = tokenizer.encode(prompt, return_tensors="pt")
output = model.generate(input_ids,
max_new_tokens=n_predict)
output_str = tokenizer.decode(output[0], skip_special_tokens=True)
print('-'*20, 'Output', '-'*20)
print(output_str)
-------------------- Output --------------------
问:AI是什么?
答: AI是人工智能(Artificial Intelligence)的缩写,是指由计算机或其他机器模拟人类智能的技术和理论。通过使用算法、数据和模型,AI可以在各种任务中自主地做出决策和执行操作,例如语音识别、图像识别、自然语言处理、机器翻译、自动驾驶等。AI的发展已经引起了广泛的关注和应用,被认为是一项有潜力改变人类社会和工作的技术。
ChatGLM3-6B 支持流式输出函数 stream_chat,它使模型能够逐字提供流式响应。但是,其他模型可能不提供类似的 API。
为了成功观察到标准输出中的文本流,我们需要设置环境变量 PYTHONUNBUFFERED=1 以确保标准输出流直接发送到终端,而无需先进行缓冲。
import torch
with torch.inference_mode():
question = "AI 是什么?"
response_ = ""
print('-'*20, 'Stream Chat Output', '-'*20)
for response, history in model.stream_chat(tokenizer, question, history=[]):
print(response.replace(response_, ""), end="")
response_ = response
-------------------- Stream Chat Output --------------------
AI是人工智能(Artificial Intelligence)的简称,它是一种通过计算机程序和设备模拟人类智能的技术。AI旨在实现人类的一些智能功能,例如语音识别、图像识别、自然语言处理、机器翻译、决策推理等。人工智能技术可以使计算机像人类一样理解、学习、解决问题和进行交互。
AI涵盖了多个领域,包括机器学习、深度学习、自然语言处理、计算机视觉、知识表示与推理等。随着计算能力的提升和数据量的增加,AI技术得到了迅速发展,并在许多行业和领域产生了广泛的应用,如金融、医疗、教育、交通、安防等。
3、 在 LangChain 中使用
LangChain是一个被广泛的用于开发由语言模型驱动的应用程序的框架。本节将介绍如何将 IPEX-LLM 与 LangChain 集成。
pip install langchain
在推理之前,需要创建一个 prompt 模板。这里我们给出了一个用于提问和回答的 prompt 模板示例,其中包含两个输入变量:history 和 human_input。也可以根据自己的模型调整 prompt 模板。
CHATGLM_V3_LANGCHAIN_PROMPT_TEMPLATE = """{history}\n\n问:{human_input}\n\n答:"""
使用 LangChain API LLMChain 构造用于推理的 chain。在这里,我们使用 IPEX-LLM API 来构造一个 LLM 对象,它将自动加载经过低精度优化的模型。ConversationBufferWindowMemory 是 LangChain 中的一种存储类型,用于保存一个装有对话中最近 k 次交互的移动窗口。
from langchain import LLMChain, PromptTemplate
from ipex_llm.langchain.llms import TransformersLLM
from langchain.memory import ConversationBufferWindowMemory
llm_model_path = "THUDM/chatglm2-6b" # huggingface llm 模型的路径
prompt = PromptTemplate(input_variables=["history", "human_input"], template=CHATGLM_V3_LANGCHAIN_PROMPT_TEMPLATE)
max_new_tokens = 128
llm = TransformersLLM.from_model_id(
model_id=llm_model_path,
model_kwargs={"trust_remote_code": True},
)
# 以下代码与用例完全相同
llm_chain = LLMChain(
llm=llm,
prompt=prompt,
verbose=True,
llm_kwargs={"max_new_tokens":max_new_tokens},
memory=ConversationBufferWindowMemory(k=2),
)
# 生成
text = "AI 是什么?"
response_text = llm_chain.run(human_input=text,stop="\n\n")
Entering new LLMChain chain…
Prompt after formatting:
问:AI 是什么?
答:
AI指的是人工智能,是一种能够通过学习和理解数据,以及应用数学、逻辑、推理等知识,来实现与人类智能相似或超越人类智能的计算机系统。AI可以分为弱人工智能和强人工智能。弱人工智能是指一种只能完成特定任务的AI系统,比如语音识别或图像识别等;而强人工智能则是一种具有与人类智能相同或超越人类智能的AI系统,可以像人类一样思考、学习和理解世界。目前,AI的应用领域已经涵盖了诸如自然语言处理、计算机视觉、机器学习、深度学习、自动驾驶、医疗健康等多个领域。
Finished chain.