LangChain实战课 模型I/O|豆包MarsCode AI刷题

308 阅读6分钟

前言

LangChain实战课的第三节,介绍LangChain的模型I/O,感兴趣的小伙伴也可以看看之前的文章~

Model I/O

把对模型的使用过程拆解成三块,LangChain中这个过程被统称为 Model I/O(Input/Output)

  • 输入提示(对应图中的Format)
  • 调用模型(对应图中的Predict)
  • 输出解析(对应图中的Parse)

image.png

(1)提示模板

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

运行结果

  • input_variables:输入变量
  • template:模板

image.png

(2)语言模型

  • LangChain允许使用通用接口来调用语言模型。

LangChain支持三大类模型

  1. 大语言模型(LLM),也叫Text Model,输入文本字符串,输出文本字符串。如:Open AI的text-davinci-003、Facebook的LLaMA、ANTHROPIC的Claude。
  2. 聊天模型(Chat Model),通常由语言模型支持,但API更加结构化,输入聊天消息列表,返回聊天消息。如:Open AI的ChatGPT系列模型。
  3. 文本嵌入模型(Embedding Model),输入文本,输出浮点数列表,把文档存入向量数据库。如:OpenAI的text-embedding-ada-002。

1. 调用语言模型

  • 跟提示模板的代码一起使用
# 导入LangChain中的OpenAI模型接口
import os
from langchain_openai import ChatOpenAI
# 创建模型实例
model = ChatOpenAI(model=os.environ.get("LLM_MODELEND"))
# 输入提示,实例化模板
input = prompt.format(flower_name=["玫瑰"], price="50")
# 得到模型的输出
output = model.invoke(input)
# 打印输出内容
print(output)
运行结果

image.png

2. 复用提示模板,同时生成多个鲜花的文案。

  • 跟提示模板的代码一起使用
# 导入LangChain中的OpenAI模型接口
import os
from langchain_openai import ChatOpenAI

# 创建模型实例
model = ChatOpenAI(model=os.environ.get("LLM_MODELEND"))

# 多种花的列表
flowers = ["玫瑰", "百合", "康乃馨"]
prices = ["50", "30", "20"]

# 生成多种花的文案
for flower, price in zip(flowers, prices):
    # 使用提示模板生成输入
    input_prompt = prompt.format(flower_name=flower, price=price)
    # 得到模型的输出
    output = model.invoke(input_prompt)
    # 打印输出内容
    print(output)
运行结果

image.png

LangChain调用模型的意义

  • LangChain只需要定义一次模板,就可以生成各种不同的提示,切换到不同的模型不需要修改任何提示相关的代码
1. 使用Open AI API来完成上述功能代码
from openai import OpenAI  # 导入OpenAI
import os

prompt_text = "您是一位专业的鲜花店文案撰写员。对于售价为{}元的{},您能提供一个吸引人的简短描述吗?"  # 设置提示

flowers = ["玫瑰", "百合", "康乃馨"]
prices = ["50", "30", "20"]

# 循环调用Text模型的Completion方法,生成文案
for flower, price in zip(flowers, prices):
    prompt = prompt_text.format(price, flower)
    client = OpenAI()
    response = client.chat.completions.create(
        model=os.environ.get("LLM_MODELEND"),
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": prompt},
        ],
        max_tokens=100,
    )
    print(response.choices[0].message.content) # 输出文案
运行结果

image.png

2. 使用HuggingFaceHub中的开源模型来完成上述功能代码

配置操作

  • 要注册HUGGINGFACEHUB_API_TOKEN

    笔者参考的这篇博文:如何获取HuggingFace的Access Token-CSDN博客

  • 将HUGGINGFACEHUB_API_TOKEN配置到环境变量中

    (类似详细操作见第一篇文章:LangChain实战课-开篇词

  • HuggingFaceHub 类在 LangChain 0.0.21 版本中已被弃用,并将在 1.0 版本中移除。建议使用 langchain-huggingface 包中的更新版本,该版本应通过以下方式导入和使用:

    安装更新的 langchain-huggingface 包 pip install -U langchain-huggingface

    从更新的包中导入 HuggingFaceEndpoint 类 from langchain_huggingface import HuggingFaceEndpoint

    创建模型实例 model = HuggingFaceEndpoint(repo_id="google/flan-t5-large")

import os
# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
# 导入LangChain中的提示模板
from langchain.prompts import PromptTemplate

# 创建原始模板
template = """You are a flower shop assitiant。\n
For {price} of {flower_name} ,can you write something for me?
"""
# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)
# 打印LangChain提示模板的内容
print(prompt)

# 导入LangChain中的OpenAI模型接口
from langchain_huggingface import HuggingFaceEndpoint
# 创建模型实例
model = HuggingFaceEndpoint(
    repo_id="google/flan-t5-large", 
    max_new_tokens=512,
    temperature=0.5,
    huggingfacehub_api_token=os.environ.get("HUGGINGFACEHUB_API_TOKEN"),
    )
# 输入提示
input = prompt.format(flower_name=["rose"], price="50")

# 得到模型的输出
output = model.invoke(input)
# 打印输出内容
print(output)
  • 由于HuggingFaceHub需要外网访问,笔者尝试使用镜像https://hf-mirror.com也未能连接成功,并且使用的AI练中学,磁盘空间不足以下载这个模型,因此没能跑通这个代码。请大佬们提供一些解决思路~ image.png

(3)输出解析

  • 输出解析器,可以把返回的非结构化文本,转换成结构化数据,可以精确地获取需要的信息。

步骤

①定义输出结构,鲜花的描述文案(description)和原因(reason)。

②获取输出格式说明(format_instructions)。

③根据原始的字符串模板和输出解析器格式说明创建新的提示模板(整合了输出解析结构信息)。

④通过的模板生成模型的输入,得到模型的输出

整合到一个pandas DataFrame对象中

# 导入LangChain中的提示模板
from langchain.prompts import PromptTemplate
# 创建提示模板
prompt_template = """您是一位专业的鲜花店文案撰写员。
对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?
{format_instructions}"""

# 通过LangChain调用模型
import os
from langchain_openai import ChatOpenAI
# 创建模型实例
model = ChatOpenAI(model=os.environ.get("LLM_MODELEND"))

# 导入结构化输出解析器和ResponseSchema
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
# 定义我们想要接收的响应模式
response_schemas = [
    ResponseSchema(name="description", description="鲜花的描述文案"),
    ResponseSchema(name="reason", description="问什么要这样写这个文案"),
]
# 创建输出解析器
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
# 获取格式指示
format_instructions = output_parser.get_format_instructions()
# 根据模板创建提示,同时在提示中加入输出解析器的说明
prompt = PromptTemplate.from_template(
    prompt_template, partial_variables={"format_instructions": format_instructions}
)

# 数据准备
flowers = ["玫瑰", "百合", "康乃馨"]
prices = ["50", "30", "20"]

# 创建一个空的DataFrame用于存储结果
import pandas as pd
df = pd.DataFrame(columns=["flower", "price", "description", "reason"])  # 先声明列名

for flower, price in zip(flowers, prices):
    # 根据提示准备模型的输入
    input = prompt.format(flower_name=flower, price=price)

    # 获取模型的输出
    output = model.invoke(input)
    # 解析模型的输出(这是一个字典结构)
    parsed_output = output_parser.parse(output.content)

    # 在解析后的输出中添加“flower”和“price”
    parsed_output["flower"] = flower
    parsed_output["price"] = price

    # 将解析后的输出添加到DataFrame中
    df.loc[len(df)] = parsed_output

# 打印字典
print(df.to_dict(orient="records"))

# 保存DataFrame到CSV文件
df.to_csv("flowers_with_descriptions.csv", index=False)

运行结果

image.png

总结

①学到了LangChain中模型I/O的三个阶段:输入提示、调用模型、输出解析。

②输入提示模板:使用占位符自动处理变量的插入、便于代码维护和服用。

调用模型:使用不同的模型只需要更改模型名称,无需修改代码。

输出解析提示模板可以嵌入对输出格式的定义,便于后续处理输出。

⑤注册了HUGGINGFACEHUB_API_TOKEN,学到HuggingFaceHub中开源模型的基本调用方法。