调用模型+链

249 阅读6分钟

注册Hugging Face image.png

预训练+微调 使用HuggingFace的Transformers库来调用Llama啦!

# 导入必要的库
from transformers import AutoTokenizer, AutoModelForCausalLM

# 加载预训练模型的分词器
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-chat-hf")

# 加载预训练的模型
# 使用 device_map 参数将模型自动加载到可用的硬件设备上,例如GPU
model = AutoModelForCausalLM.from_pretrained(
          "meta-llama/Llama-2-7b-chat-hf", 
          device_map = 'auto')  

# 定义一个提示,希望模型基于此提示生成故事
prompt = "请给我讲个玫瑰的爱情故事?"

# 使用分词器将提示转化为模型可以理解的格式,并将其移动到GPU上
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")

# 使用模型生成文本,设置最大生成令牌数为2000
outputs = model.generate(inputs["input_ids"], max_new_tokens=2000)

# 将生成的令牌解码成文本,并跳过任何特殊的令牌,例如[CLS], [SEP]等
response = tokenizer.decode(outputs[0], skip_special_tokens=True)

# 打印生成的响应
print(response)

这段程序是一个很典型的HuggingFace的Transformers库的用例,该库提供了大量预训练的模型和相关的工具。

  • 导入AutoTokenizer:这是一个用于自动加载预训练模型的相关分词器的工具。分词器负责将文本转化为模型可以理解的数字格式。
  • 导入AutoModelForCausalLM:这是用于加载因果语言模型(用于文本生成)的工具。
  • 使用from_pretrained方法来加载预训练的分词器和模型。其中,device_map = 'auto' 是为了自动地将模型加载到可用的设备上,例如GPU。
  • 然后,给定一个提示(prompt):"请给我讲个玫瑰的爱情故事?",并使用分词器将该提示转换为模型可以接受的格式,return_tensors="pt" 表示返回PyTorch张量。语句中的 .to("cuda") 是GPU设备格式转换,因为我在GPU上跑程序,不用这个的话会报错,如果你使用CPU,可以试一下删掉它。
  • 最后使用模型的 .generate() 方法生成响应。max_new_tokens=2000 限制生成的文本的长度。使用分词器的 .decode() 方法将输出的数字转化回文本,并且跳过任何特殊的标记。

LangChain 和 HuggingFace 的接口

llm = HuggingFaceHub(    
repo_id="google/flan-t5-small", 
#repo_id="meta-llama/Llama-2-7b-chat-hf", 
)

通过 HuggingFace Pipeline

image.png

用 LangChain 调用自定义语言模型

对于简单的应用程序来说,直接调用LLM就已经足够了。因此,在前几节课的示例中,我们主要通过LangChain中提供的提示模板、模型接口以及输出解析器就实现了想要的功能。 但是,如果你想开发更复杂的应用程序,那么就需要通过 “Chain” 来链接LangChain的各个组件和功能——模型之间彼此链接,或模型与其他组件链接。 链的调用方式

直接调用

llm_chain("玫瑰") 实际自动调用call方法

run

llm_chain.run("玫瑰")

predict方法

result = llm_chain.predict(flower="玫瑰")
输入键只能是关键字参数

apply方法

apply方法允许我们针对输入列表运行链,一次处理多个输入。

generate方法

generate方法类似于apply,只不过它返回一个LLMResult对象,而不是字符串。LLMResult通常包含模型生成文本过程中的一些相关信息,例如令牌数量、模型名称等。

image.png

image.png

image.png

思考题 1.链实现第四节课的代码

"""
 
"""
# 导入LangChain中的提示模板
import os
from langchain.prompts import PromptTemplate
from langchain import PromptTemplate, OpenAI, LLMChain
# 创建原始模板
template = """您是一位专业的鲜花店文案撰写员。\n
对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?
"""
# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)
# 打印LangChain提示模板的内容
print(prompt)

# 设置OpenAI API Key
# os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'

# 导入LangChain中的OpenAI模型接口
 
from langchain_openai import OpenAI, ChatOpenAI

# 创建模型实例
# model = OpenAI(model_name='gpt-3.5-turbo-instruct')
model = ChatOpenAI(model=os.environ.get("LLM_MODELEND"))
# 输入提示
 
llm_chain = LLMChain(
        llm=model,
          prompt=PromptTemplate.from_template(template))
        
 
# 得到模型的输出
#output = model.invoke(input)
output = llm_chain({'flower_name': '向日葵', 'price': '50'} )
# 打印输出内容
print(output)

{'flower_name': '向日葵', 'price': '50', 'text': '以下是几个吸引人的简短描述:\n\n1. 仅需 50 元,就能把这束充满阳光与活力的向日葵带回家,让它为你的生活增添一抹明亮色彩。\n2. 50 元的向日葵,如同一轮小太阳,温暖你的世界,点亮你的心情。\n3. 花 50 元,拥有这束向日葵,让它那灿烂的笑容陪伴你每一天。\n4. 售价 50 元的向日葵,绽放着无尽的生机与希望,是你生活中的小确幸。\n5. 只需 50 元,这束向日葵将成为你家中最耀眼的存在,带来满满的正能量。\n6. 50 元的向日葵,以其独特的魅力,为你营造出温馨而美好的氛围。\n7. 花 50 元,让这束向日葵为你的生活注入阳光般的活力与快乐。\n8. 售价 50 元的向日葵,是大自然馈赠的美好礼物,值得你拥有。\n9. 50 元的向日葵,象征着积极向上,为你的生活增添一份别样的光彩。\n10. 仅需 50 元,就能与这束向日葵相伴,享受它带来的温暖与美好。'}

加入输出解析器

import os
from langchain.prompts import PromptTemplate
from pydantic import BaseModel, Field
from langchain.output_parsers import PydanticOutputParser
from langchain import PromptTemplate, OpenAI, LLMChain
from langchain_openai import OpenAI, ChatOpenAI
# 定义一个 Pydantic 模型来指定输出的结构
class FlowerDescription(BaseModel):
    description: str = Field(description="对鲜花的描述")
    reason: str = Field(description="选择这种描述的原因")

# 创建输出解析器
output_parser = PydanticOutputParser(pydantic_object=FlowerDescription)

# 定义模板
template = """您是一位专业的鲜花店文案撰写员。
对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?并解释为什么选择这样的描述。
"""
# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)

# 创建模型实例
# model = OpenAI(model_name='gpt-3.5-turbo-instruct')
model = ChatOpenAI(model=os.environ.get("LLM_MODELEND"))

# 创建 LLMChain
llm_chain = LLMChain(
    llm=model,
    prompt=prompt,
    output_parser=output_parser
)

# 得到模型的输出
output = llm_chain({'flower_name': '向日葵', 'price': '50'})

# 打印输出内容
print(output)

下是一个关于售价 50 元向日葵的简短描述:

“50 元,收获一束如阳光般灿烂的向日葵,它带着满满的活力与希望,为你的生活注入无尽温暖。”

选择这样描述的原因:首先,突出了向日葵如阳光般灿烂的特点,能让顾客立刻联想到向日葵积极向上的形象,引发他们对美好、活力的向往。其次,提到“带着满满的活力与希望”,进一步强调了向日葵的象征意义,使它不仅仅是一束花,更像是一种能给人带来精神鼓舞的物品。最后,“为你的生活注入无尽温暖”则表达了购买这束花能给生活带来积极的影响,让顾客觉得 50 元不仅仅是买了一束花,更是买了一份美好和温暖,从而增加购买的吸引力。