當解析錯誤發生時,如何重試
雖然在某些情況下,僅查看輸出即可修正任何解析錯誤,但在其他情況下則不然。一個例子是輸出不僅格式不正確,而且部分不完整。請考慮以下範例。
from langchain.output_parsers import OutputFixingParser
from langchain_core.exceptions import OutputParserException
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI, OpenAI
from pydantic import BaseModel, Field
API 參考:OutputFixingParser | OutputParserException | PydanticOutputParser | PromptTemplate | ChatOpenAI | OpenAI
template = """Based on the user question, provide an Action and Action Input for what step should be taken.
{format_instructions}
Question: {query}
Response:"""
class Action(BaseModel):
action: str = Field(description="action to take")
action_input: str = Field(description="input to the action")
parser = PydanticOutputParser(pydantic_object=Action)
prompt = PromptTemplate(
template="Answer the user query.\n{format_instructions}\n{query}\n",
input_variables=["query"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
prompt_value = prompt.format_prompt(query="who is leo di caprios gf?")
bad_response = '{"action": "search"}'
如果我們嘗試按原樣解析此回應,則會收到錯誤
try:
parser.parse(bad_response)
except OutputParserException as e:
print(e)
Failed to parse Action from completion {"action": "search"}. Got: 1 validation error for Action
action_input
Field required [type=missing, input_value={'action': 'search'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.9/v/missing
For troubleshooting, visit: https://langchain-python.dev.org.tw/docs/troubleshooting/errors/OUTPUT_PARSING_FAILURE
如果我們嘗試使用 OutputFixingParser
來修正此錯誤,它會感到困惑 - 也就是說,它不知道實際要為動作輸入放入什麼。
fix_parser = OutputFixingParser.from_llm(parser=parser, llm=ChatOpenAI())
fix_parser.parse(bad_response)
Action(action='search', action_input='input')
相反地,我們可以使用 RetryOutputParser,它會傳入提示(以及原始輸出)以再次嘗試獲得更好的回應。
from langchain.output_parsers import RetryOutputParser
API 參考:RetryOutputParser
retry_parser = RetryOutputParser.from_llm(parser=parser, llm=OpenAI(temperature=0))
retry_parser.parse_with_prompt(bad_response, prompt_value)
Action(action='search', action_input='leo di caprio girlfriend')
我們也可以使用自訂鏈輕鬆新增 RetryOutputParser,自訂鏈會將原始 LLM/ChatModel 輸出轉換為更可行的格式。
from langchain_core.runnables import RunnableLambda, RunnableParallel
completion_chain = prompt | OpenAI(temperature=0)
main_chain = RunnableParallel(
completion=completion_chain, prompt_value=prompt
) | RunnableLambda(lambda x: retry_parser.parse_with_prompt(**x))
main_chain.invoke({"query": "who is leo di caprios gf?"})
API 參考:RunnableLambda | RunnableParallel
Action(action='search', action_input='leo di caprio girlfriend')
尋找 RetryOutputParser 的 API 文件。