# 构建动态链:实时自构造与执行
在现代编程中,动态链的构造和执行是一个强大的技术,可以根据输入在运行时自动生成和调整程序流程。本文将探讨如何利用LangChain构建动态链,特别是通过`RunnableLambda`返回可执行单元的特性,实现链的自构造。这个概念在需要动态路由的场景中特别有用。
## 主要内容
### 什么是动态链?
动态链是一种根据输入参数在运行时动态构建和执行的链。不同于静态链,在链构成过程中可以根据条件选择不同的路径或执行单元,提升了程序的灵活性和可扩展性。
### LangChain与RunnableLambda
LangChain是一个支持构建灵活链的框架,其中的`RunnableLambda`允许返回一个新的`Runnable`对象,这个对象会在主链中被执行。通过这种特性,我们可以构建多变的流程。
### 示例:构建动态链
以下是一个使用LangChain构建动态链的例子。我们将根据用户输入的历史记录决定是否对问题进行上下文重构。
```python
import os
from langchain_core.runnables import Runnable, RunnablePassthrough, chain
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from operator import itemgetter
from langchain_openai import ChatOpenAI
# 设置API密钥
os.environ["OPENAI_API_KEY"] = "your_api_key" # 使用API代理服务提高访问稳定性
# 实例化LLM
llm = ChatOpenAI(model="gpt-4o-mini")
# 定义Prompt模板
contextualize_instructions = """Convert the latest user question into a standalone question given the chat history. Don't answer the question, return the question and nothing else (no descriptive text)."""
contextualize_prompt = ChatPromptTemplate.from_messages(
[
("system", contextualize_instructions),
("placeholder", "{chat_history}"),
("human", "{question}"),
]
)
contextualize_question = contextualize_prompt | llm | StrOutputParser()
qa_instructions = """Answer the user question given the following context:\n\n{context}."""
qa_prompt = ChatPromptTemplate.from_messages(
[("system", qa_instructions), ("human", "{question}")]
)
# 定义动态链
@chain
def contextualize_if_needed(input_: dict) -> Runnable:
if input_.get("chat_history"):
return contextualize_question
else:
return RunnablePassthrough() | itemgetter("question")
@chain
def fake_retriever(input_: dict) -> str:
return "egypt's population in 2024 is about 111 million"
full_chain = (
RunnablePassthrough.assign(question=contextualize_if_needed).assign(
context=fake_retriever
)
| qa_prompt
| llm
| StrOutputParser()
)
# 调用链
result = full_chain.invoke(
{
"question": "what about egypt",
"chat_history": [
("human", "what's the population of indonesia"),
("ai", "about 276 million"),
],
}
)
print(result)
运行结果
当我们提供了聊天历史时,该链会自动执行contextualize_question部分,调整问题以便更好地与上下文匹配。
常见问题和解决方案
1. API访问不稳定
由于网络限制,在某些地区访问API可能不稳定,建议使用代理服务来提高访问可靠性。
2. 动态链的调试
调试动态链时,需要仔细检查每个Runnable的返回值和上下文传递,以确保每个环节执行正确。
总结和进一步学习资源
动态链构建为我们提供了强大的灵活性,可以有效应对复杂的业务逻辑需求。为了进一步了解LangChain的使用及其扩展能力,建议阅读以下资源:
参考资料
- LangChain GitHub文档
- API服务商集成指南
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---
动态链构建常见问题及解决方案

被折叠的 条评论
为什么被折叠?



