LLM 提示可以通过在模板句子中注入特定术语来增强。选择正确的术语对于获得高质量的回复至关重要。该笔记本通过使用强化学习和 VowpalWabbit 的术语注入引入了自动化提示工程。
强化学习链提供了一种自动确定注入的最佳项的方法,无需微调底层基础模型。
为了说明这一点,请考虑送餐服务的场景。我们使用 LangChain 询问像 Tom 这样的顾客的饮食偏好,并从我们丰富的菜单中推荐合适的餐点。 rl_chain 根据用户偏好选择餐食,将其注入到提示模板中,并将提示转发到 LLM。然后,LLM 的响应(这是个性化推荐)返回给用户。
下面列出的示例是一个演示该概念的适用性的玩具示例。最后提供了高级选项和解释。
# Install necessary packages
# ! pip install langchain langchain-experimental matplotlib vowpal_wabbit_next sentence-transformers pandas
# four meals defined, some vegetarian some not
meals = [
"Beef Enchiladas with Feta cheese. Mexican-Greek fusion",
"Chicken Flatbreads with red sauce. Italian-Mexican fusion",
"Veggie sweet potato quesadillas with vegan cheese",
"One-Pan Tortelonni bake with peppers and onions",
]
# pick and configure the LLM of your choice
from langchain_openai import OpenAI
llm = OpenAI(model="gpt-3.5-turbo-instruct")
使用提供的默认值初始化强化学习链
需要定义用于查询LLM的提示模板。它可以是任何东西,但这里正在使用 {meal} 并将被上面的餐食之一取代,强化学习链将尝试挑选并注入最好的餐食
from langchain.prompts import PromptTemplate
# 导入PromptTemplate类,用于生成模板化的文本
# 下面定义一个模板字符串,其中的变量 meal 将在链式运行时被替换为上述的某个餐点
# 另外还有一些变量 user、preference 和 text_to_personalize,这些变量将在链式运行时提供
PROMPT_TEMPLATE = """Here is the description of a meal: "{meal}".
Embed the meal into the given text: "{text_to_personalize}".
Prepend a personalized message including the user's name "{user}"
and their preference "{preference}".
Make it sound good.
"""
# 模板字符串,用于生成文本模板
PROMPT = PromptTemplate(
input_variables=["meal", "text_to_personalize", "user", "preference"],
template=PROMPT_TEMPLATE,
)
# 创建一个PromptTemplate实例,指定输入变量和模板字符串
接下来,强化学习链的 PickBest 链正在初始化。我们必须提供选择的 llm 和定义的提示。顾名思义,该连锁店的目标是根据某些标准挑选最好的餐食。
import langchain_experimental.rl_chain as rl_chain
chain = rl_chain.PickBest.from_llm(llm=llm, prompt=PROMPT)
设置好连锁店后,我将使用我想要从中选择的餐食以及连锁店选择餐食的一些上下文来调用它。
response = chain.run(
meal=rl_chain.ToSelectFrom(meals), # 从 meals 列表中动态选择一个餐点
user=rl_chain.BasedOn("Tom"), # 设置用户的名字为 "Tom"
preference=rl_chain.BasedOn(["Vegetarian", "regular dairy is ok"]), # 设置用户的饮食偏好
text_to_personalize="This is the weeks specialty dish, our master chefs believe you will love it!" # 固定的个性化消息
)
print(response["response"])
What is the chain doing
链条在中间做什么事情
以下是强化学习链操作的逐步细分:
- 接受膳食清单。
- 考虑用户及其饮食偏好。
- 根据这种情况,选择合适的膳食。
- 自动评估膳食选择的适当性。
- 将所选餐点插入提示中并将其提交到LLM。
- 将 LLM 的响应返回给用户。
从技术上讲,该链通过采用上下文强盗强化学习模型(特别是利用 VowpalWabbit ML 库)来实现这一目标。
最初,由于强化学习模型未经训练,它可能会选择不一定符合用户偏好的随机选择。然而,随着它更多地接触用户的选择和反馈,它应该开始做出更好的选择(或者快速学习一个好的选择并选择它!)。
for _ in range(5):
try:
response = chain.run(
meal=rl_chain.ToSelectFrom(meals), # 从 meals 列表中动态选择一个餐点
user=rl_chain.BasedOn("Tom"), # 设置用户的名字为 "Tom"
preference=rl_chain.BasedOn(["Vegetarian", "regular dairy is ok"]), # 设置用户的饮食偏好
text_to_personalize="This is the weeks specialty dish, our master chefs believe you will love it!" # 固定的个性化消息
)
except Exception as e:
print(e) # 如果生成过程中出现异常,打印异常信息
print(response["response"]) # 打印生成的响应文本
print() # 输出空行,用于分隔每次生成的响应文本
强化学习链是怎么样学习的
值得注意的是,虽然强化学习模型可以做出复杂的选择,但它本质上并不能识别“素食”等概念,也不能理解“牛肉玉米卷饼”不适合素食。相反,它利用 LLM 将其选择建立在常识之上。
连锁店了解汤姆更喜欢素食的方式是通过连锁店内置的自动选择评分器。记分器将再次调用 LLM 并要求它使用 ( BasedOn ) 中包含的信息来评估选择 ( ToSelectFrom )。
如果您想查看自动评分器的详细信息,可以设置 set_debug(True) ,但您也可以自己定义评分提示。
scoring_criteria_template = (
"Given {preference} rank how good or bad this selection is {meal}"
)
# 定义评分模板,用于生成评分标准的文本
chain = rl_chain.PickBest.from_llm(
llm=llm,
prompt=PROMPT,
selection_scorer=rl_chain.AutoSelectionScorer(
llm=llm, scoring_criteria_template_str=scoring_criteria_template
),
)
# 使用 rl_chain.PickBest.from_llm 方法创建一个链式操作,以选择最佳的选项
# 参数 llm 是语言模型,用于生成文本
# 参数 prompt 是之前定义的模板化文本结构 PROMPT
# selection_scorer 是一个自动评分器,使用 scoring_criteria_template 作为评分标准模板
如果您想检查分数和其他选择元数据,您可以通过检查链返回的元数据对象
response = chain.run(
meal=rl_chain.ToSelectFrom(meals), # 从 meals 列表中动态选择一个餐点
user=rl_chain.BasedOn("Tom"), # 设置用户的名字为 "Tom"
preference=rl_chain.BasedO