@[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 StrOutputParserset_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_verboseset_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
執行過程有詳細的錯誤信息