动态链构建指南:让链式调用更智能
引言
在编程和人工智能领域,动态链的构建常被用于根据输入在运行时生成链的一部分。这种动态调整机制尤为适合如路由这样的应用场景。在这篇文章中,我们将探讨如何借助LangChain中的RunnableLambda实现自构造链,以及在不同的API之间动态切换。
主要内容
1. 动态链构建的基础
LangChain允许通过RunnableLambda返回一个Runnable,而这个Runnable在执行整个链时会被调用。这一特性使得动态链构建成为可能。
2. API的多样性与选择
在构建动态链时,你可以根据需求选择不同的API,例如OpenAI、Anthropic、Azure、Google等。为了提高访问的稳定性,尤其是在某些地区,你可能需要使用API代理服务。
3. 实现动态链的步骤
- 定义上下文问题:我们将用户的问题转化为独立的问题,通过历史记录动态调整。
- 伪检索器:模拟数据检索的过程,为问题提供上下文支持。
- 完整链的构建:结合上下文化问题与伪检索器,通过LangChain构建一个完整的回答链。
代码示例
以下是一个完整的动态链构建示例,其中使用多个API进行调用。
import os
from getpass import getpass
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import Runnable, RunnablePassthrough, chain
# 设置API代理服务提高访问稳定性
os.environ["OPENAI_API_KEY"] = getpass()
os.environ["ANTHROPIC_API_KEY"] = getpass()
llm_openai = ChatOpenAI(model="gpt-4o-mini")
llm_anthropic = ChatAnthropic(model="claude-3-5-sonnet-20240620")
contextualize_instructions = """将最新用户问题转换为独立问题,给定聊天记录。不要回答问题,只返回问题。"""
contextualize_prompt = ChatPromptTemplate.from_messages(
[
("system", contextualize_instructions),
("placeholder", "{chat_history}"),
("human", "{question}"),
]
)
contextualize_question = contextualize_prompt | llm_openai | StrOutputParser()
qa_instructions = (
"""根据以下上下文回答用户问题:\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_anthropic
| StrOutputParser()
)
result = full_chain.invoke(
{
"question": "what about egypt",
"chat_history": [
("human", "what's the population of indonesia"),
("ai", "about 276 million"),
],
}
)
print(result)
常见问题和解决方案
- API访问受限:可使用代理服务来改善连接稳定性。
- 动态链的复杂性:理解每个组件的职责有助于调试和扩展。
总结和进一步学习资源
动态链构建是一项强大的技术,可以根据实际需求动态调整其行为。了解LangChain的特性和灵活性将为开发者提供更强的工具。你可以进一步学习LangChain的官方文档和相关API的使用指南。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---