分类目录:《大模型从入门到应用》总目录
LangChain系列文章:
- 基础知识
- 快速入门
- 安装与环境配置
- 链(Chains)、代理(Agent:)和记忆(Memory)
- 快速开发聊天模型
- 模型(Models)
- 基础知识
- 大型语言模型(LLMs)
- 基础知识
- LLM的异步API、自定义LLM包装器、虚假LLM和人类输入LLM(Human Input LLM)
- 缓存LLM的调用结果
- 加载与保存LLM类、流式传输LLM与Chat Model响应和跟踪tokens使用情况
- 聊天模型(Chat Models)
- 基础知识
- 使用少量示例和响应流式传输
- 文本嵌入模型
- Aleph Alpha、Amazon Bedrock、Azure OpenAI、Cohere等
- Embaas、Fake Embeddings、Google Vertex AI PaLM等
- 提示(Prompts)
- 基础知识
- 提示模板
- 基础知识
- 连接到特征存储
- 创建自定义提示模板和含有Few-Shot示例的提示模板
- 部分填充的提示模板和提示合成
- 序列化提示信息
- 示例选择器(Example Selectors)
- 输出解析器(Output Parsers)
- 记忆(Memory)
- 基础知识
- 记忆的类型
- 会话缓存记忆、会话缓存窗口记忆和实体记忆
- 对话知识图谱记忆、对话摘要记忆和会话摘要缓冲记忆
- 对话令牌缓冲存储器和基于向量存储的记忆
- 将记忆添加到LangChain组件中
- 自定义对话记忆与自定义记忆类
- 聊天消息记录
- 记忆的存储与应用
- 索引(Indexes)
- 基础知识
- 文档加载器(Document Loaders)
- 文本分割器(Text Splitters)
- 向量存储器(Vectorstores)
- 检索器(Retrievers)
- 链(Chains)
- 基础知识
- 通用功能
- 自定义Chain和Chain的异步API
- LLMChain和RouterChain
- SequentialChain和TransformationChain
- 链的保存(序列化)与加载(反序列化)
- 链与索引
- 文档分析和基于文档的聊天
- 问答的基础知识
- 图问答(Graph QA)和带来源的问答(Q&A with Sources)
- 检索式问答
- 文本摘要(Summarization)、HyDE和向量数据库的文本生成
- 代理(Agents)
- 基础知识
- 代理类型
- 自定义代理(Custom Agent)
- 自定义MRKL代理
- 带有ChatModel的LLM聊天自定义代理和自定义多操作代理(Custom MultiAction Agent)
- 工具
- 基础知识
- 自定义工具(Custom Tools)
- 多输入工具和工具输入模式
- 人工确认工具验证和Tools作为OpenAI函数
- 工具包(Toolkit)
- 代理执行器(Agent Executor)
- 结合使用Agent和VectorStore
- 使用Agents的异步API和创建ChatGPT克隆
- 处理解析错误、访问中间步骤和限制最大迭代次数
- 为代理程序设置超时时间和限制最大迭代次数和为代理程序和其工具添加共享内存
- 计划与执行
- 回调函数(Callbacks)
特征存储是传统机器学习中的一个概念,它确保输入模型的数据是最新和相关的。在考虑将LLM应用程序投入生产时,这个概念非常重要。为了个性化LLM应用程序,我们可能希望将LLM与特定用户的最新信息结合起来。特征存储可以是保持数据更新的好方法,而LangChain提供了一种将该数据与LLM结合的简单方式。
在下面的示例中,我们将展示如何将提示模板连接到特征存储。其基本思想是从提示模板中调用特征存储以检索值,然后将这些值格式化到提示中。
Feast
首先,我们将使用流行的开源特征存储框架Feast。首先,假设我们已经做完了Feast的入门步骤。紧接着,我们将基于入门示例构建,并创建一个LLMChain,用于驱动有关其最新统计信息。
加载 Feast 存储
根据Feast的README
中的说明进行设置:
from feast import FeatureStore
# 根据存储路径进行更新
feast_repo_path = "../../../../../my_feature_repo/feature_repo/"
store = FeatureStore(repo_path=feast_repo_path)
提示
在这里,我们将设置一个自定义的FeastPromptTemplate
。这个提示模板将接收一个司机 ID,查找他们的统计数据,并将这些统计数据格式化到提示中。需要注意的是,这个提示模板的输入只有driver_id
,因为这是唯一由用户定义的部分,所有的其它变量都在提示模板内部查找。
from langchain.prompts import PromptTemplate, StringPromptTemplate
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_template = FeastPromptTemplate(input_variables=["driver_id"])
print(prompt_template.format(driver_id=1001))
输出:
根据司机的最新统计数据,写一个便签将这些统计数据传达给他们。
如果他们的对话率超过0.5,请给他们一个赞美。否则,在最后讲一个关于鸡的愚蠢笑话,让他们感觉好一些。
以下是司机的统计数据:
对话率:0.4745151400566101
接受率:0.055561766028404236
平均每日行程数:936
你的回复:
在上面的例子中,我们创建了一个FeastPromptTemplate
的实例,并使用format
方法为特定的driver_id
生成一个提示。使用store.get_online_features
从特征存储中检索司机的特征向量,并将相关统计数据填充到提示模板中。现在,我们可以将生成的提示文本用于进一步处理或作为输入提供给您的语言模型。
在链式结构中使用
现在我们可以在链式结构中使用它,创建一个由特征存储支持的个性化链式结构:
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
chain = LLMChain(llm=ChatOpenAI(), prompt=prompt_template)
chain.run(1001)
输出:
"嗨!我想向您更新一下您当前的统计数据。您的接受率为0.055561766028404236,平均每日行程数为936。虽然您当前的对话率为0.4745151400566101,但我相信只要再加一点努力,您就能超过0.5的标准!继续保持良好的工作!还记得,即使鸡无法总是穿过马路,但它们仍会尽力而为。"
以上是根据提供的统计数据生成的更新消息。消息中包含司机的接受率、平均每日行程数和对话率的信息。鼓励司机继续努力工作,并给予他们一些鸡的笑话来增加一些轻松的氛围。
Tecton
上面,我们展示了如何在LangChain中使用流行的开源自管特征存储Feast。下面的示例将展示如何使用Tecton进行类似的集成。Tecton是一个完全托管的特征平台,用于协调完整的ML特征生命周期,从转换到在线服务,具备企业级SLA。
前提条件
- Tecton部署
- 将
TECTON_API_KEY
环境变量设置为有效的服务账户密钥
定义和加载特征
我们将使用Tecton教程中user_transaction_counts
的Feature View作为Feature Service的一部分。为简单起见,我们只使用了一个Feature View;然而,更复杂的应用可能需要更多的Feature View来检索其提示所需的特征。
user_transaction_metrics = FeatureService(
name="user_transaction_metrics",
features=[user_transaction_counts]
)
上述Feature Service预计将被应用到实时工作空间中。在本示例中,我们将使用prod
工作空间。
import tecton
workspace = tecton.get_workspace("prod")
feature_service = workspace.get_feature_service("user_transaction_metrics")
Prompts
在这里,我们将设置一个自定义的TectonPromptTemplate
。该提示模板将接收一个用户ID,查找其统计数据,并将这些统计数据格式化为提示。需要注意的是,该提示模板的输入只有user_id
,因为这是唯一由用户定义的部分,所有其他的变量都在提示模板内部查找。
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_template = TectonPromptTemplate(input_variables=["user_id"])
print(prompt_template.format(user_id="user_469998441571"))
输出:
给定供应商的最新交易统计数据,根据以下规则给他们写一封信:
如果他们在过去一天内有交易,向他们祝贺最近的销售成绩。
如果过去一天没有交易,但过去30天内有交易,逗趣地鼓励他们多卖一些。
最后总是加上一个关于鸡的愚蠢笑话。
以下是供应商的统计数据: 过去一天的交易数量:657 过去30天的交易数量:20326
您的回复:
在链式模型中使用
现在我们可以在链式模型中使用它,创建一个通过Tecton Feature平台支持的个性化链式模型:
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
chain = LLMChain(llm=ChatOpenAI(), prompt=prompt_template)
chain.run("user_469998441571")
输出:
'哇,恭喜您最近的销售成绩!您的业务就像热气球上的一只鸡一样飞得很高!继续保持良好的工作!'
Featureform
最后,我们将使用Featureform,一个开源的企业级特征存储,来运行相同的示例。Featureform允许我们使用Spark等基础设施或本地环境来定义特征转换。
初始化Featureform
我们可以按照README中的说明初始化Featureform中的转换和特征。
import featureform as ff
client = ff.Client(host="demo.featureform.com")
Prompts
在这里,我们将设置一个自定义的FeatureformPromptTemplate
,该提示模板将使用用户每笔交易的平均金额作为输入。需要注意的是,该提示模板的输入只有avg_transaction
,因为所有其他变量都在提示模板内部查找。
from langchain.prompts import PromptTemplate, StringPromptTemplate
template = """Given the amount a user spends on average per transaction, let them know if they are a high roller. Otherwise, make a silly joke about chickens at the end to make them feel better
Here are the user's stats:
Average Amount per Transaction: ${avg_transcation}
Your response:"""
prompt = PromptTemplate.from_template(template)
class FeatureformPromptTemplate(StringPromptTemplate):
def format(self, **kwargs) -> str:
user_id = kwargs.pop("user_id")
fpf = client.features([("avg_transactions", "quickstart")], {"user": user_id})
return prompt.format(**kwargs)
prompt_template = FeatureformPrompTemplate(input_variables=["user_id"])
print(prompt_template.format(user_id="C1410926"))
在对话链中使用
现在我们还可以将其用于对话链中,成功创建一个由Featureform Feature平台支持的个性化对话链。文章来源:https://www.toymoban.com/news/detail-619059.html
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
chain = LLMChain(llm=ChatOpenAI(), prompt=prompt_template)
chain.run("C1410926")
参考文献:
[1] LangChain 🦜️🔗 中文网,跟着LangChain一起学LLM/GPT开发:https://www.langchain.com.cn/
[2] LangChain中文网 - LangChain 是一个用于开发由语言模型驱动的应用程序的框架:http://www.cnlangchain.com/文章来源地址https://www.toymoban.com/news/detail-619059.html
到了这里,关于自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:连接到特征存储]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!