引言:在这篇文章中,我们要讨论的是如何将prompt templates和feature stores结合起来。大致思路就是在prompt模板中调用feature store来获取值,然后将这些值格式化为prompt。我们会使用流行的开源feature store框架Feast开始这篇深入的探讨。
特征存储是传统机器学习中的一个概念,确保输入模型的数据是最新且相关的。在考虑将LLM应用程序投入生产时,这个概念非常重要。为了个性化LLM应用程序,您可能希望将LLM与关于特定用户的最新信息相结合。特征存储可以是保持数据更新的绝佳方式,而LangChain提供了一种将该数据与LLMs相结合的简单方法。
先来简单介绍一下什么是特征存储(Feature Store)
Feature stores是一个用于管理和提供机器学习模型特征数据的平台,它可以帮助数据科学家和机器学习工程师更快速、更准确地构建和部署模型。Feature stores的出现是为了解决“特征重复计算”、“特征工程复杂”和“特征不一致”等问题,这些问题都会影响到机器学习模型的准确性和性能。
Feature stores的原理是将特征数据存储在单独的数据库中,通过提供统一的接口来访问这些特征数据。这个数据库通常是高度可扩展的,并且具有高度优化和针对特征数据的存储结构。数据科学家和机器学习工程师可以从feature stores中选择并提取所需的特征,以便用于模型训练和推理。
为了进一步提高性能,Feature stores通常支持实时特征提取,这意味着特征可以在需要时立即提取和使用。此外,Feature stores还可以支持特征版本控制、数据验证和质量控制,以确保所使用的特征是最新、最准确和最符合要求的。
总之,Feature stores是一个非常有用和必要的机器学习工具,它可以帮助数据科学家和机器学习工程师更快速、更高效地构建和部署机器学习模型。
具体使用
通过上面的介绍,我们知道Feature Store是机器学习中的一个很酷的概念,可以确保给予模型的数据是最新和相关的。当然,你不想跟机器说“嘿,我已经改变了我的数据集,快来重新训练吧!”对吧?所以你肯定需要Feature Store,这东西可以轻松维护数据的新鲜度,并让你的模型们轻松地跟数据结合起来。
举个例子,我们可以把Feast应用到LLMChain中,向指定的司机写一封关于他们最新统计信息的便条。当然,为了能够让你理解得更加深入,我们还是需要展示一些代码的。
首先,我们得引入Feast啊,这个需要用到一行代码:
from feast import FeatureStore
接下来的代码是构造一个FeastPromptTemplate,这个模板会接受一个driver_id作为输入,查找他们的统计信息,并将这些信息格式化到prompt中。
from langchain.prompts import PromptTemplate, StringPromptTemplate
#格式化prompt
template = """给司机发一份关于他们最新的统计信息的便条。
如果他们的会话率大于0.5,就可以给他们一个赞美。否则在结束时加上一句有关鸡的愚蠢笑话,让他们感觉好些。
以下是司机的统计信息:
会话率: {conv_rate}
接收率: {acc_rate}
平均每日旅行数: {avg_daily_trips}
你的回应:"""
prompt = PromptTemplate.from_template(template)
class FeastPromptTemplate(StringPromptTemplate):
def format(self, **kwargs) -> str:
driver_id = kwargs.pop("driver_id")
feature_vector = store.get_online_features(
features=[
'driver_hourly_stats:conv_rate',
'driver_hourly_stats:acc_rate',
'driver_hourly_stats:avg_daily_trips'
],
entity_rows=[{"driver_id": driver_id}]
).to_dict()
kwargs["conv_rate"] = feature_vector["conv_rate"][0]
kwargs["acc_rate"] = feature_vector["acc_rate"][0]
kwargs["avg_daily_trips"] = feature_vector["avg_daily_trips"][0]
return prompt.format(**kwargs)
#建立prompt实例化
prompt_template = FeastPromptTemplate(input_variables=["driver_id"])
为了让你更好地理解Feature Store在LLMChain中是如何使用的,下面的代码可以帮助你完成它:
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
#创建LLMChain实例
chain = LLMChain(llm=ChatOpenAI(), prompt=prompt_template)
#运行LLMChain
chain.run(1001)
如果一切顺利的话,你将得到类似以下提示消息:
“你好!我想向你更新一下你最近的统计信息。你的接收率是0.055561766028404236,你的平均每日旅行次数是936。尽管你当前的会话率只有0.4745151400566101,但我相信只要你再努力一点点,就能超过那个0.5的限制!继续保持好的状态!还有,记得,即使是鸡也不能总是穿越马路,不过它们仍然努力拼搏。”
之后,我们又会讨论如何将Tecton用于集成。Tecton是一个完全托管的特征平台,可以对整个ML特征生命周期进行编排,从转换到在线服务(它甚至可以提供企业级SLA!)。
实际上,使用Tecton要求有点高,还要手动设置TECTON_API_KEY环境变量为有效的服务账户密钥,还得在tecton.ai 上注册才行。(具体的得靠您自己寻找详细步骤)
接下来的代码是如何设置一个自定义的TectonPromptTemplate(需要借助Featureform)的过程。这个prompt模板将可以接受一个user_id,查找他们的统计信息,并将这些信息格式化到prompt中。
from langchain.prompts import PromptTemplate, StringPromptTemplate
template = """给予供应商最新的历史交易统计数据,并根据以下规则写一张纸条:
1.如果他们在最近的一天中有交易,请简短地恭喜他们的最近销售。
2.如果在最近的一天内没有交易,但是在之前的30天内有过交易,请开玩笑地鼓励他们多卖一些。
3.总是在结尾加上一句有关鸡的愚蠢笑话。
以下是您的交易统计数据:
最近一天的交易次数:{transaction_count_1d}
最近30天的交易次数:{transaction_count_30d}
你的回应:"""
prompt = PromptTemplate.from_template(template)
class TectonPromptTemplate(StringPromptTemplate):
def format(self, **kwargs) -> str:
user_id = kwargs.pop("user_id")
feature_vector = feature_service.get_online_features(join_keys={"user_id": user_id}).to_dict()
kwargs["transaction_count_1d"] = feature_vector["user_transaction_counts.transaction_count_1d_1d"]
kwargs["transaction_count_30d"] = feature_vector["user_transaction_counts.transaction_count_30d_1d"]
return prompt.format(**kwargs)
#建立prompt实例化
prompt_template = TectonPromptTemplate(input_variables=["user_id"])
通过本文的介绍,相信你能更加深入地理解如何将prompt templates与feature stores连接起来。
今天就到这里,明天继续连载。