示例中使用的公共代碼:
from langchain_deepseek import ChatDeepSeek
chat = ChatDeepSeek(model="deepseek-chat",temperature=0,api_key=API_KEY,
)
使用方法:
- 引入解析器
- 實例化解析器
- 調用解析器的
get_format_instructions()
獲得提示詞,將提示詞加入到請求的信息中 - 將實例化的解析器加入到鏈中
1. 列表
# 1. 引入解析器
from langchain.output_parsers import CommaSeparatedListOutputParser # 列表解析器
from langchain.prompts import PromptTemplate
#構造輸入模版
template = "用戶發起的提問:{question}{format_instructions}"# 2. 實例化輸出解析器
output_parser = CommaSeparatedListOutputParser()# 3. 將輸出解析器的解析格式作為提示詞模版的部分內容
prompt = PromptTemplate.from_template(template,partial_variables={"format_instructions":output_parser.get_format_instructions()},
)
# 4. 將output_parser加入到鏈中
chain = prompt | chat | output_parser
chain.invoke({"question": "列出上海的三個景點"})
# 結果:['外灘', '豫園', '上海迪士尼度假區']
2. 枚舉
from langchain.output_parsers.enum import EnumOutputParser
from langchain.prompts import PromptTemplate
from enum import Enum#定義枚舉類型
class Colors(Enum):RED = "紅色"BROWN = "棕色"BLACK = "黑色"WHITE = "白色"YELLOW = "黃色"#制定提示詞模版
promptTemplate = PromptTemplate.from_template("{person}的皮膚主要是什么顏色? {instructions}")#制定輸出解析器
parse = EnumOutputParser(enum=Colors)
# 解析器的提示詞是中英文混合,如果直接使用該提示詞則最后返回的結果不是想要的結果
# instructions = parse.get_format_instructions()
instructions = "響應結果請選擇以下選項之一:紅色、棕色、黑色、白色、黃色,注意:只返回顏色名稱,不添加任何解釋或額外內容。"prompt = promptTemplate.partial(instructions=instructions)
chain = prompt | chat | parse
chain.invoke({"person":"亞洲人"})# 結果: <Colors.YELLOW: '黃色'>
3. json
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 import BaseModel,Field
from langchain.prompts import PromptTemplate
from typing import List#定義JSON結構
class Book(BaseModel):title:str = Field(description="書名")author:str = Field(description="作者")description:str = Field(description="書的簡介")beLike:List[str] = Field(description="作者的其他書籍的名稱")parser = JsonOutputParser(pydantic_object=Book)prompt = PromptTemplate(template="{format_instructions}",input_variables=["query"],partial_variables={"format_instructions":parser.get_format_instructions()}
)chain = prompt | chat | parser
chain.invoke({"query":"請給我介紹中國最有名的科幻小說"})# 結果:
'''
{'title': '三體','author': '劉慈欣','description': '《三體》是劉慈欣創作的系列長篇科幻小說,講述了地球人類文明與三體文明的信息交流、生死搏殺及兩個文明在宇宙中的興衰歷程。作品以宏大的宇宙觀和深刻的哲學思考,探討了人類與外星文明的接觸、科技發展對社會的影響以及宇宙文明的生存法則。','beLike': ['球狀閃電', '超新星紀元', '流浪地球', '鄉村教師', '中國2185']}
'''
4. xml
使用xml解釋器時有個奇怪的問題,如果將解釋器的實例加入鏈中,則返回json格式,如果不加入鏈中,則返回xml格式
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import XMLOutputParserparser = XMLOutputParser()
prompt = PromptTemplate(template="{query},\n 要求:返回結果必須符合{format_instructions}",input_variables=["query"],partial_variables={"format_instructions": parser.get_format_instructions()},
)
chain = prompt | chat | parser
response = chain.invoke({"query": "?成周星馳1994年的電影作品列表,有電影名稱,上映時間,按照時間降序排列"})
print(response)
# 結果:
'''
{'movies': [{'movie': [{'title': '國產凌凌漆'}, {'release_date': '1994-10-13'}]}, {'movie': [{'title': '九品芝麻官'}, {'release_date': '1994-03-31'}]}, {'movie': [{'title': '破壞之王'}, {'release_date': '1994-02-03'}]}, {'movie': [{'title': '大話西游之月光寶盒'}, {'release_date': '1994-01-21'}]}]}
'''
chain1 = prompt | chat
response1 = chain1.invoke({"query": "?成周星馳1994年的電影作品列表,有電影名稱,上映時間,按照時間降序排列"})
print(response1.content)
# 結果:
'''
<?xml version="1.0" encoding="UTF-8"?>
<movies><movie><title>國產凌凌漆</title><release_date>1994-10-13</release_date></movie><movie><title>九品芝麻官</title><release_date>1994-03-31</release_date></movie><movie><title>破壞之王</title><release_date>1994-02-03</release_date></movie><movie><title>大話西游之月光寶盒</title><release_date>1994-01-21</release_date></movie>
</movies>
'''
5. 布爾
BooleanOutputParser:這個解析器專門用于解析布爾值(即對錯、真假)的輸出。例如,當模型輸出是 True 或 False 時,該解析器可以準確識別和處理。
6. 時間
DatetimeOutputParser:該解析器用于處理日期和時間的輸出。它能夠將模型生成的日期時間字符串解析為標準的日期時間格式,方便后續處理。
7. 列表對象
ListOutputParser:當輸出是一個列表時,無論是什么類型的列表,都可以使用這個解析器進行解析。它能將模型生成的列表字符串轉換為實際的列表對象。
8. Pydantic
PydanticOutputParser:如果你的輸出需要符合 Pydantic 的要求(Pydantic 是一個用于數據驗證和轉換的庫),那么這個解析器就能派上用場。它可以確保輸出數據符合預定義的數據模型和驗證規則。
9. StructuredOutputParser
StructuredOutputParser:對于具有特定結構的輸出,這個解析器可以大顯身手。它能夠處理復雜的結構,并將模型生成的結構化數據解析為易于使用的格式。
10. 自定義
from typing import Iterator
from langchain_core.messages import AIMessage,AIMessageChunk#自定義輸出解析器
def parse(ai_message:AIMessage)->str:return ai_message.content.swapcase()
# 鏈式調用chat,返回的結果作為下一個鏈的參數,也就是ai_message,調用parse方法
chain = chat | parse
response = chain.invoke("用英語回答,你是誰")
response
# 結果: 'i AM dEEPsEEK-v3, AN ai ASSISTANT CREATED BY dEEPsEEK. mY PURPOSE IS TO HELP ANSWER YOUR QUESTIONS, PROVIDE INFORMATION, AND ASSIST WITH VARIOUS TASKS. fEEL FREE TO ASK ME ANYTHING! 😊'
11. 字符串
StrOutputParser