@[TOC](【GPT入门】第33课 一文吃透 LangChain:chain 结合 with_fallbacks ([]) 的实战指南)
1. fallback概述
模型回退,可以设置在llm上,也可以设置在chain上,都带有with_fallbacks([])函数
2. llm的回退
2.1 代码
核心代码: bad_llm.with_fallbacks([good_llm])
打开debug,观察执行情况
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import OllamaLLM
from langchain.globals import set_debug
from langchain_core.output_parsers import StrOutputParser
set_debug(True)
chat_prompt = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant."),
("human", "{input}"),
])
bad_llm = OllamaLLM(model="gpt-fack")
good_llm = OllamaLLM(model="gpt-4")
llm_with_fallback = bad_llm.with_fallbacks([good_llm])
fallback_chain = chat_prompt | llm_with_fallback | StrOutputParser()
print(fallback_chain.invoke({"input": "你是谁?"}))
2.2 执行结果
[llm/start] [llm:OllamaLLM] Entering LLM run with input:
{
"prompts": [
"你是谁?"
]
}
[llm/end] [llm:OllamaLLM] [10.98s] Exiting LLM run with output:
{
"generations": [
[
{
"text": "我是来自阿里云的大规模语言模型,我被命名为通义千问。我可以回答各种问题,包括但不限于科技、文化、生活、历史、地理等各个领域的问题。我还能够进行文本摘要、代码解析、图像生成、视频转码等各种任务。如果您有任何具体问题或需要某个特定任务的帮助,请随时告诉我,我会尽力为您提供最准确和最有用的答案和帮助。",
"generation_info": {
"model": "gpt-4",
"created_at": "2025-04-02T21:53:46.7502575Z",
"done": true,
"done_reason": "stop",
"total_duration": 10975642300,
"load_duration": 3865007300,
"prompt_eval_count": 11,
"prompt_eval_duration": 1252263100,
"eval_count": 83,
"eval_duration": 5857248900,
"response": "",
"context": [
151644,
872,
.---省略---
33108,
100364,
1773
]
},
"type": "Generation"
}
]
],
"llm_output": null,
"run": null,
"type": "LLMResult"
}
我是来自阿里云的大规模语言模型,我被命名为通义千问。我可以回答各种问题,包括但不限于科技、文化、生活、历史、地理等各个领域的问题。我还能够进行文本摘要、代码解析、图像生成、视频转码等各种任务。如果您有任何具体问题或需要某个特定任务的帮助,请随时告诉我,我会尽力为您提供最准确和最有用的答案和帮助。
3. chain级别fallback
核心代码:res = bad_chain.with_fallbacks([good_chain])
3.1 代码
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import OllamaLLM
from langchain.globals import set_debug, set_verbose
set_debug(True)
from langchain_core.output_parsers import StrOutputParser
chat_prompt = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant."),
("human", "{input}"),
])
# 构建一个错误的model, 该model不存在,会报错
llm_chatmodel = OllamaLLM(model="gpt-fack")
bad_chain = chat_prompt | llm_chatmodel | StrOutputParser()
# print(bad_chain.invoke({"input": "你是谁?"}))
# 构建一个正确的链
llm_chatmodel = OllamaLLM(model="gpt-4")
good_chain = chat_prompt | llm_chatmodel | StrOutputParser()
# print(good_chain.invoke({"input": "你是谁?"}))
# 设置fallback
res = bad_chain.with_fallbacks([good_chain])
print(res.invoke({"input": "我是星火老师,你是谁?"}))
3.2 执行结果
C:\ProgramData\anaconda3\envs\gptLearning\python.exe "E:\workspace\gptLearning\gptLearning\ls10\06 ollama\332_chain级别的fallback.py"
[chain/start] [chain:RunnableWithFallbacks] Entering Chain run with input:
{
"input": "我是星火老师,你是谁?"
}
[chain/start] [chain:RunnableWithFallbacks > chain:RunnableSequence] Entering Chain run with input:
{
"input": "我是星火老师,你是谁?"
}
[chain/start] [chain:RunnableWithFallbacks > chain:RunnableSequence > prompt:ChatPromptTemplate] Entering Prompt run with input:
{
"input": "我是星火老师,你是谁?"
}
[chain/end] [chain:RunnableWithFallbacks > chain:RunnableSequence > prompt:ChatPromptTemplate] [1ms] Exiting Prompt run with output:
[outputs]
[llm/start] [chain:RunnableWithFallbacks > chain:RunnableSequence > llm:OllamaLLM] Entering LLM run with input:
{
"prompts": [
"System: You are a helpful assistant.\nHuman: 我是星火老师,你是谁?"
]
}
[llm/error] [chain:RunnableWithFallbacks > chain:RunnableSequence > llm:OllamaLLM] [9ms] LLM run errored with error:
"ResponseError(\"model 'gpt-fack' not found\")Traceback (most recent call last):\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\langchain_core\\language_models\\llms.py\", line 787, in _generate_helper\n self._generate(\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\langchain_ollama\\llms.py\", line 288, in _generate\n final_chunk = self._stream_with_aggregation(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\langchain_ollama\\llms.py\", line 256, in _stream_with_aggregation\n for stream_resp in self._create_generate_stream(prompt, stop, **kwargs):\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\langchain_ollama\\llms.py\", line 211, in _create_generate_stream\n yield from self._client.generate(\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\ollama\\_client.py\", line 168, in inner\n raise ResponseError(e.response.text, e.response.status_code) from None\n\n\nollama._types.ResponseError: model 'gpt-fack' not found (status code: 404)"
[chain/error] [chain:RunnableWithFallbacks > chain:RunnableSequence] [19ms] Chain run errored with error:
"ResponseError(\"model 'gpt-fack' not found\")Traceback (most recent call last):\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\langchain_core\\runnables\\base.py\", line 3025, in invoke\n input = context.run(step.invoke, input, config)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\langchain_core\\language_models\\llms.py\", line 390, in invoke\n self.generate_prompt(\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\langchain_core\\language_models\\llms.py\", line 763, in generate_prompt\n return self.generate(prompt_strings, stop=stop, callbacks=callbacks, **kwargs)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\langchain_core\\language_models\\llms.py\", line 966, in generate\n output = self._generate_helper(\n ^^^^^^^^^^^^^^^^^^^^^^\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\langchain_core\\language_models\\llms.py\", line 787, in _generate_helper\n self._generate(\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\langchain_ollama\\llms.py\", line 288, in _generate\n final_chunk = self._stream_with_aggregation(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\langchain_ollama\\llms.py\", line 256, in _stream_with_aggregation\n for stream_resp in self._create_generate_stream(prompt, stop, **kwargs):\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\langchain_ollama\\llms.py\", line 211, in _create_generate_stream\n yield from self._client.generate(\n\n\n File \"C:\\ProgramData\\anaconda3\\envs\\gptLearning\\Lib\\site-packages\\ollama\\_client.py\", line 168, in inner\n raise ResponseError(e.response.text, e.response.status_code) from None\n\n\nollama._types.ResponseError: model 'gpt-fack' not found (status code: 404)"
[chain/start] [chain:RunnableWithFallbacks > chain:RunnableSequence] Entering Chain run with input:
{
"input": "我是星火老师,你是谁?"
}
[chain/start] [chain:RunnableWithFallbacks > chain:RunnableSequence > prompt:ChatPromptTemplate] Entering Prompt run with input:
{
"input": "我是星火老师,你是谁?"
}
[chain/end] [chain:RunnableWithFallbacks > chain:RunnableSequence > prompt:ChatPromptTemplate] [1ms] Exiting Prompt run with output:
[outputs]
[llm/start] [chain:RunnableWithFallbacks > chain:RunnableSequence > llm:OllamaLLM] Entering LLM run with input:
{
"prompts": [
"System: You are a helpful assistant.\nHuman: 我是星火老师,你是谁?"
]
}
[llm/end] [chain:RunnableWithFallbacks > chain:RunnableSequence > llm:OllamaLLM] [12.51s] Exiting LLM run with output:
{
"generations": [
[
{
"text": "我是来自阿里云的大规模语言模型——通义千问。我被设计成能够理解和生成各种形式的语言文本,包括但不限于中文、英文、法文等。\n\n我可以根据你的问题或指令进行回答,甚至可以自动生成与主题相关的文章或段落。无论你有什么需求,我都会尽力提供最准确和最有帮助的答案。\n\n感谢你选择与我交流!如果你有任何疑问或需要进一步的帮助,请随时告诉我,我会尽力为你提供最好的支持和服务。",
"generation_info": {
"model": "gpt-4",
"created_at": "2025-04-02T22:06:15.9157224Z",
"done": true,
"done_reason": "stop",
"total_duration": 12508307000,
"load_duration": 3565616000,
"prompt_eval_count": 29,
"prompt_eval_duration": 1493288400,
"eval_count": 100,
"eval_duration": 7411968100,
"response": "",
"context": [
151644,
---省略--
100143,
106510,
1773
]
},
"type": "Generation"
}
]
],
"llm_output": null,
"run": null,
"type": "LLMResult"
}
[chain/start] [chain:RunnableWithFallbacks > chain:RunnableSequence > parser:StrOutputParser] Entering Parser run with input:
{
"input": "我是来自阿里云的大规模语言模型——通义千问。我被设计成能够理解和生成各种形式的语言文本,包括但不限于中文、英文、法文等。\n\n我可以根据你的问题或指令进行回答,甚至可以自动生成与主题相关的文章或段落。无论你有什么需求,我都会尽力提供最准确和最有帮助的答案。\n\n感谢你选择与我交流!如果你有任何疑问或需要进一步的帮助,请随时告诉我,我会尽力为你提供最好的支持和服务。"
}
[chain/end] [chain:RunnableWithFallbacks > chain:RunnableSequence > parser:StrOutputParser] [5ms] Exiting Parser run with output:
{
"output": "我是来自阿里云的大规模语言模型——通义千问。我被设计成能够理解和生成各种形式的语言文本,包括但不限于中文、英文、法文等。\n\n我可以根据你的问题或指令进行回答,甚至可以自动生成与主题相关的文章或段落。无论你有什么需求,我都会尽力提供最准确和最有帮助的答案。\n\n感谢你选择与我交流!如果你有任何疑问或需要进一步的帮助,请随时告诉我,我会尽力为你提供最好的支持和服务。"
}
[chain/end] [chain:RunnableWithFallbacks > chain:RunnableSequence] [12.52s] Exiting Chain run with output:
{
"output": "我是来自阿里云的大规模语言模型——通义千问。我被设计成能够理解和生成各种形式的语言文本,包括但不限于中文、英文、法文等。\n\n我可以根据你的问题或指令进行回答,甚至可以自动生成与主题相关的文章或段落。无论你有什么需求,我都会尽力提供最准确和最有帮助的答案。\n\n感谢你选择与我交流!如果你有任何疑问或需要进一步的帮助,请随时告诉我,我会尽力为你提供最好的支持和服务。"
}
[chain/end] [chain:RunnableWithFallbacks] [12.55s] Exiting Chain run with output:
{
"output": "我是来自阿里云的大规模语言模型——通义千问。我被设计成能够理解和生成各种形式的语言文本,包括但不限于中文、英文、法文等。\n\n我可以根据你的问题或指令进行回答,甚至可以自动生成与主题相关的文章或段落。无论你有什么需求,我都会尽力提供最准确和最有帮助的答案。\n\n感谢你选择与我交流!如果你有任何疑问或需要进一步的帮助,请随时告诉我,我会尽力为你提供最好的支持和服务。"
}
我是来自阿里云的大规模语言模型——通义千问。我被设计成能够理解和生成各种形式的语言文本,包括但不限于中文、英文、法文等。
我可以根据你的问题或指令进行回答,甚至可以自动生成与主题相关的文章或段落。无论你有什么需求,我都会尽力提供最准确和最有帮助的答案。
感谢你选择与我交流!如果你有任何疑问或需要进一步的帮助,请随时告诉我,我会尽力为你提供最好的支持和服务。
Process finished with exit code 0
执行过程有详细的错误信息