1. LangChain
少量示例提示模板
在與 LLM
的對話中,提供少量的示例被稱為 少量示例,這是一種簡單但強大的指導生成的方式,在某些情況下可以顯著提高模型性能(與之對應的是零樣本),少量示例可以降低 Prompt
的復雜度,快速告知 LLM
生成內容的規范。
資料推薦
- 💡大模型中轉API推薦
- ?中轉使用教程
- ?模型優惠查詢
在 LangChain
中,針對少量示例也封裝對應的提示模板——FewShotPromptTemplate
,這個提示模板只需要傳遞 示例列表 與 示例模板 即可快速構建 少量示例提示模板,使用示例如下:
import dotenv
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
from langchain_openai import ChatOpenAIdotenv.load_dotenv()# 1.構建示例模板與示例
examples = [{"question": "幫我計算下2+2等于多少?", "answer": "4"},{"question": "幫我計算下2+3等于多少?", "answer": "5"},{"question": "幫我計算下20*15等于多少?", "answer": "300"},
]
example_prompt = ChatPromptTemplate.from_messages([("human", "{question}"),("ai", "{answer}"),
])# 2.構建少量示例提示模板
few_shot_prompt = FewShotChatMessagePromptTemplate(example_prompt=example_prompt,examples=examples,
)
print("少量示例模板:", few_shot_prompt.format())# 3.構建最終提示模板
prompt = ChatPromptTemplate.from_messages([("system", "你是一個可以計算復雜數學問題的聊天機器人"),few_shot_prompt,("human", "{question}"),
])# 4.創建大語言模型與鏈
llm = ChatOpenAI(model="gpt-3.5-turbo-16k", temperature=0)
chain = prompt | llm | StrOutputParser()# 5.調用鏈獲取結果
print(chain.invoke("幫我計算下14*15等于多少"))
輸出內容:
少量示例模板: Human: 幫我計算下2+2等于多少?
AI: 4
Human: 幫我計算下2+3等于多少?
AI: 5
Human: 幫我計算下20*15等于多少?
AI: 300
210
少量示例提示模板 在底層會根據傳遞的 示例模板 與 示例 格式化對應的 消息列表 或者 字符串,從而將對應的示例參考字符串信息添加到完整的提示模板中,簡化了 Prompt
編寫的繁瑣程度。
對于聊天模型可以使用 FewShotChatMessagePromptTemplate
,而文本補全基座模型可以使用 FewShotPromptTemplate
。
2. Step-Back
回答回退策略的優點
對于一些復雜的問題,除了使用 問題分解 來得到子問題亦或者依賴問題,還可以為復雜問題生成一個前置問題,通過前置問題來執行相應的檢索,這就是 Setp-Back
回答回退策略(后退提示),這是一種用于增強語言模型的推理和問題解決能力的技巧,它鼓勵 LLM
從一個給定的問題或問題后退一步,提出一個更抽象、更高級的問題,涵蓋原始查詢的本質。
概念來源:
https://arxiv.org/pdf/2310.06117.pdf
后退提示背后的概念是,許多復雜的問題或任務包含很多復雜的細節和約束,這使 LLM
難以直接檢索和應用相關信息。通過引入一個后退問題,這個問題通常更容易回答,并且圍繞一個更廣泛的概念或原則,讓 LLM
可以更有效地構建它們的推理。
資料推薦
- 💡大模型中轉API推薦
- ?中轉使用教程
- ?模型優惠查詢
Step-Back
回答回退策略的運行流程也非常簡單,構建一個 少量示例提示模板,讓 LLM
根據傳遞的問題生成一個后退問題,使用 后退問題 執行相應的檢索,利用檢索到的文檔+原始問題執行 RAG
索引增強生成,運行流程如下:
在 LangChain
中并沒有封裝好的 回答回退策略檢索器,所以可以執行相應的封裝,實現一個自定義檢索器,實現代碼如下:
from typing import Listimport dotenv
import weaviate
from langchain_core.callbacks import CallbackManagerForRetrieverRun
from langchain_core.documents import Document
from langchain_core.language_models import BaseLanguageModel
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate
from langchain_core.retrievers import BaseRetriever
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_weaviate import WeaviateVectorStore
from weaviate.auth import AuthApiKeydotenv.load_dotenv()class StepBackRetriever(BaseRetriever):"""回答回退檢索器"""retriever: BaseRetrieverllm: BaseLanguageModeldef _get_relevant_documents(self, query: str, *, run_manager: CallbackManagerForRetrieverRun) -> List[Document]:"""根據傳遞的query執行問題回退并檢索"""# 1.構建少量提示模板examples = [{"input": "慕課網上有關于AI應用開發的課程嗎?", "output": "慕課網上有哪些課程?"},{"input": "慕小課出生在哪個國家?", "output": "慕小課的個人經歷是怎樣的?"},{"input": "司機可以開快車嗎?", "output": "司機可以做什么?"},]example_prompt = ChatPromptTemplate.from_messages([("human", "{input}"),("ai", "{output}")])few_show_prompt = FewShotChatMessagePromptTemplate(examples=examples,example_prompt=example_prompt,)# 2.構建生成回退問題提示system_prompt = "你是一個世界知識的專家。你的任務是回退問題,將問題改述為更一般或者前置問題,這樣更容易回答,請參考示例來實現。"prompt = ChatPromptTemplate.from_messages([("system", system_prompt),few_show_prompt,("human", "{question}")])# 3.構建生成回退問題的鏈chain = ({"question": RunnablePassthrough()}| prompt| self.llm| StrOutputParser()| self.retriever)return chain.invoke(query)# 1.構建向量數據庫與檢索器
db = WeaviateVectorStore(client=weaviate.connect_to_wcs(cluster_url="https://mbakeruerziae6psyex7ng.c0.us-west3.gcp.weaviate.cloud",auth_credentials=AuthApiKey("ZltPVa9ZSOxUcfafelsggGyyH6tnTYQYJvBx"),),index_name="DatasetDemo",text_key="text",embedding=OpenAIEmbeddings(model="text-embedding-3-small"),
)
retriever = db.as_retriever(search_type="mmr")# 2.創建回答回退檢索器
step_back_retriever = StepBackRetriever(retriever=retriever,llm=ChatOpenAI(model="gpt-3.5-turbo-16k", temperature=0),
)# 3.檢索文檔
documents = step_back_retriever.invoke("人工智能會讓世界發生翻天覆地的變化嗎?")
print(documents)
print(len(documents))
輸出內容:
[Document(metadata={'source': './項目API文檔.md', 'start_index': 5818.0}, page_content='json { "code": "success", "data": { "list": [ { "id": "1550b71a-1444-47ed-a59d-c2f080fbae94", "conversation_id": "2d7d3e3f-95c9-4d9d-ba9c-9daaf09cc8a8", "query": "能詳細講解下LLM是什么嗎?", "answer": "LLM 即 Large Language Model,大語言模型,是一種基于深度學習的自然語言處理模型,具有很高的語言理解和生成能力,能夠處理各式各樣的自然語言任務,例如文本生成、問答、翻譯、摘要等。它通過在大量的文本數據上進行訓練,學習到語言的模式、結構和語義知識'), Document(metadata={'source': './項目API文檔.md', 'start_index': 6359.0}, page_content='1.7 [todo]刪除特定的調試消息\n\n接口說明:用于刪除 AI 應用調試對話過程中指定的消息,該刪除會在后端執行軟刪除操作,并且只有當會話 id 和消息 id 都匹配上時,才會刪除對應的調試消息。\n\n接口信息:授權+POST:/apps/:app_id/messages/:message_id/delete\n\n接口參數:\n\n請求參數:\n\napp_id -> uuid:路由參數,需要刪除消息歸屬的應用 id,格式為 uuid。\n\nmessage_id -> uuid:路由參數,需要刪除的消息 id,格式為 uuid。\n\n請求示例:\n\njson { "app_id": "1550b71a-1444-47ed-a59d-c2f080fbae94", "message_id": "2d7d3e3f-95c9-4d9d-ba9c-9daaf09cc8a8" }\n\n響應示例:\n\njson { "code": "success", "data": {}, "message": "刪除調試信息成功" }'), Document(metadata={'source': './項目API文檔.md', 'start_index': 490.0}, page_content='帶有分頁數據的接口會在 data 內固定傳遞 list 和 paginator 字段,其中 list 代表分頁后的列表數據,paginator 代表分頁的數據。\n\npaginator 內存在 4 個字段:current_page(當前頁數) 、page_size(每頁數據條數)、total_page(總頁數)、total_record(總記錄條數),示例數據如下:'), Document(metadata={'source': './項目API文檔.md', 'start_index': 2042.0}, page_content='dialog_round -> int:攜帶上下文輪數,類型為非負整型。\n\nmemory_mode -> string:記憶類型,涵蓋長記憶 long_term_memory 和 none 代表無。\n\nstatus -> string:應用配置的狀態,drafted 代表草稿、published 代表已發布配置。\n\nupdated_at -> int:應用配置的更新時間。\n\ncreated_at -> int:應用配置的創建時間。\n\nupdated_at -> int:應用的更新時間。\n\ncreated_at -> int:應用的創建時間。\n\n響應示例:')]
4
對比 問題分解策略,回答回退策略 僅僅多調用一次 LLM
,所以相應速度更快,性能更高,并且復雜度更低,對于一些參數量較小的模型,也可以實現不錯的效果,對于 問題分解策略-迭代式回答,再一些極端的情況下,模型輸出了有偏差的內容,每次都在有偏差的 問題+答案 生成新內容,很有可能會導致最后的輸出完全偏離開始的預設。
就像早些年很火的 谷歌翻譯將同一句話翻譯20次,輸出的內容就完全偏離了原來的預設:
原文:呂布拜義父。
使用谷歌翻譯20次后:在這個世界上,還有很多兒子等著我去當。
本質上就是因為無論是 谷歌翻譯 還是 LLM
大語言模型,執行轉換操作時,信息產生了丟失,并且隨著迭代的增加,信息丟失得越來越多。
資料推薦
- 💡大模型中轉API推薦
- ?中轉使用教程
- ?模型優惠查詢