零基礎langchain實戰一:模型、提示詞和解析器-CSDN博客
書接上文
大模型輸出格式化
在下面例子中:我們需要將大模型的輸出格式化成json。
import os
from dotenv import load_dotenvload_dotenv() # 加載 .env 文件
api_key = os.getenv("DEEPSEEK_API_KEY")from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="deepseek-chat",temperature=0.0,max_tokens=None,timeout=None,max_retries=2,base_url="https://api.deepseek.com",api_key=api_key,
)
?調用ResponseSchema定義輸出格式json:
最后生成的json格式為:
from langchain.output_parsers import ResponseSchema
from langchain.output_parsers import StructuredOutputParseraffection_schema = ResponseSchema(name="affection", description="評價這段話總體的情感是積極的還是消極的,并為其打分,輸出為-1.0 至 1.0 的一位小數")
positive_content_schema = ResponseSchema(name="positive", description="總結這段話評價了物品的哪些優點,列舉出物品的優點。如果沒有輸出 None")
negative_content_schema = ResponseSchema(name="negative", description="總結這段話評價了物品的哪些缺點,列舉出物品的缺點。如果沒有輸出 None")response_schema = [affection_schema, positive_content_schema, negative_content_schema]
因此實例化三個ResponseSchema,一個相當于json中的一個key。
并將三個實例添加到列表中。
output_parser = StructuredOutputParser.from_response_schemas(response_schema)
format_instructions = output_parser.get_format_instructions()
StructuredOutputParser:創建一個 結構化輸出解析器,用于將 LLM 的文本輸出解析為預定義的結構化格式。
format instructions:生成?格式化指令,這些指令會直接插入到提示模板中,指導 LLM 如何按結構化格式輸出結果。
按照之前的方法定義system_prompt:
from langchain.prompts import ChatPromptTemplateprompt = """下面這段話是用戶評價商品的一段話 \請你幫忙判斷這段話總體來說為“好評”還是“差評” \告訴我用戶為物品的哪些特征打“好評” \哪些特征打差評text:{comment}{format_instructions}
"""prompt_template = ChatPromptTemplate.from_template(prompt)prompt_template.messages[0].prompt
comment = """尺碼正常買就行,不用買太大。 \鞋底非常高~鞋楦較寬,高腳背胖腳也能穿。 \鞋底非常軟彈,很容易踩開,確實超出預期。 \鞋子非常輕,真的很輕哈哈哈~差不多和競訓碳板鞋一樣輕了[愛心_blue][愛心_blue]。 \因為是防潑水鞋面嘛,所以鞋面有點不透氣,室外溫度30度穿這鞋會有點熱,可以秋天再入手。 \補充一下哈,因為是全黑的鞋,所以剛開始看起來會有點怪怪的,時間長了就更耐看了 """
messages = prompt_template.format_messages(comment = comment,format_instructions = format_instructions)print(messages[0].content)
輸出如下:
調用大模型:
response = llm.invoke(messages)
print(response.content)
輸出如下:
最后調用先前的?結構化輸出解析器 將大模型輸出結果解析成json格式:
output_dict = output_parser.parse(response.content)
最后的結果為:
總結:
LangChain 中的 Output Parser(輸出解析器) 和 Prompt Template(提示模板) 相當于在調用大模型的輸入前和輸出后添加了兩個中間層,它們共同作用,確保大模型的輸出符合預定義的格式規范。這種設計的核心目標是讓大模型的輸出更結構化、可解析、可驗證,從而滿足實際應用的需求。
Q&A:
- ????????為什么需要這兩個中間層?
1, 解決自由文本的不確定性
大模型默認輸出是自由文本,但實際應用中需要結構化數據(如 JSON、表格)。例如,智能客服需要提取訂單號、價格、物流信息等字段。
示例:如果用戶問“我的訂單什么時候到貨?”,模型需要從回答中提取字段,而不是返回一段話。
?2,提高開發效率和可維護性
通過預定義格式,開發者無需手動處理自由文本的解析邏輯,框架自動完成字段提取和類型校驗。
優勢:
????????減少代碼量(如 50% 以上的開發效率提升)。
????????錯誤隔離性強(格式校驗失敗時拋出明確異常,如 OutputParserException)。
3,適配復雜業務場景
對于需要多步驟推理的任務(如旅行規劃、數據分析),模型需要按步驟調用工具(如天氣查詢、航班搜索),每一步的輸出都需要結構化。