做測算的網(wǎng)站影視后期培訓機構(gòu)全國排名
目錄
前言
一、概述
二、Model
三、Prompt
五、Output Parsers
總結(jié)
前言
隨著人工智能技術(shù)的不斷進步,大模型的應用場景越來越廣泛。LangChain框架作為一個創(chuàng)新的解決方案,專為處理大型語言模型的輸入輸出而設(shè)計。其中,Model IO(輸入輸出)模塊扮演著至關(guān)重要的角色,負責構(gòu)建和管理數(shù)據(jù)交互的通道。本文將深入剖析ModelIO模塊的工作原理、功能特性,以及如何通過該模塊提升數(shù)據(jù)處理效率,進而加速AI大模型應用的開發(fā)。
一、概述
Model IO模塊是LangChain框架的數(shù)據(jù)交互中樞;它不僅負責準備和處理模型的輸入數(shù)據(jù),還管理模型產(chǎn)出的結(jié)果。主要包括一下3部分:
- 提示詞格式化(Input):接收原始輸入數(shù)據(jù)到將其轉(zhuǎn)換為模型可理解的格式
- 大模型調(diào)用(Model ):調(diào)用大語言模型API獲得返回結(jié)果
- 結(jié)果解析處理(Output):將大語言模型返回的結(jié)果進行解析處理。
??????
二、Model
???????1、LLMs
LLMs是LangChain 的核心組件,但LangChain并不提供自己的LLMs,它主要允許開發(fā)者使用統(tǒng)一的方式與不同的大型語言模型進行交互。這包括與OpenAI、Cohere、Hugging Face等流行的LLMs服務(wù)進行接口對接。(類似于Completion,屬于文本生成類模型API的支持)
from langchain_openai import OpenAIllm = OpenAI()llm.invoke("奧巴馬當了幾年總統(tǒng)?")
?2、Chat?Model?
對于需要復雜對話管理能力的應用,LangChain框架提供了ChatModels模塊。這個模塊利用特殊的語言模型變體,優(yōu)化了聊天場景下的信息交換和處理流程。(類似于Chat Completion,屬于聊天會話類模型API的支持)
from langchain_openai import ChatOpenAIchat_model = ChatOpenAI(model="gpt-3.5-turbo-0125")from langchain_core.messages import (AIMessage,HumanMessage,SystemMessage
)# 設(shè)置模型角色,同時設(shè)置樣例
messages = [SystemMessage(content="你是一個智能助手"),HumanMessage(content="第二十一屆世界杯在哪兒舉行的?"),AIMessage(content="在俄羅斯"),HumanMessage(content="冠軍是哪個球隊")]# chat_model.invoke(messages)chat_model.invoke(messages).content
三、Prompt
通過Prompts模塊提供了靈活的提示詞模板和處理機制,允許用戶高效地定義和格式化這些提示,以便與LLMs進行有效的交互。
?1、Prompt?Template?
用于創(chuàng)建動態(tài)的提示詞模板,可以基于一定規(guī)則插入變量。例如:
## 可以動態(tài)傳入?yún)?shù)
from langchain.prompts import PromptTemplate# 定義提示詞模板
prompt_template = PromptTemplate.from_template("Tell me a {adjective} joke about {content}."
)
# 傳入?yún)?shù),格式化提示詞模板
prompt_template.format(adjective="funny", content="chickens")## 也可以不傳參數(shù)from langchain.prompts import PromptTemplateprompt_template = PromptTemplate.from_template("Tell me a joke")prompt_template.format()
2、ChatPromptTemplate
專門用于支持聊天場景,模擬多輪對話中的上下文交換。例如:
from langchain.prompts import ChatPromptTemplatechat_template = ChatPromptTemplate.from_messages([("system", "You are a helpful AI bot. Your name is {name}."),("human", "Hello, how are you doing?"),("ai", "I'm doing well, thanks!"),("human", "{user_input}"),]
)messages = chat_template.format_messages(name="Bob", user_input="What is your name?")chat_model.invoke(messages)
3、Few-shot prompt templates
利用有限示例來豐富大型語言模型(LLMs)的知識基礎(chǔ),并指導其推理過程。向模型提供針對性的樣本集合,這些樣本作為參考點,有效地提升模型在處理新穎問題時的邏輯推理能力和答案生成的精確度;同時還增強了模型在面對未知或復雜情境下的思維連貫性和適應性。
from langchain.prompts.few_shot import FewShotPromptTemplatefrom langchain.prompts.prompt import PromptTemplateexamples ?= [{"question": "富蘭克林·德拉諾·羅斯福和亞伯拉罕·林肯中哪個擔任總統(tǒng)的時間更長?","answer":"""這里需要后續(xù)問題嗎:是。后續(xù)問題:富蘭克林·德拉諾·羅斯福擔任了幾年總統(tǒng)?中間答案:富蘭克林·德拉諾·羅斯福擔任了12年的總統(tǒng)。后續(xù)問題:亞伯拉罕·林肯則擔任了幾年總統(tǒng)?中間答案:亞伯拉罕·林肯則擔任了5年的總統(tǒng)。因此最終答案是:富蘭克林·德拉諾·羅斯福"""},{"question": "百度的創(chuàng)始人是何時出生的?","answer":"""這里需要后續(xù)問題嗎:是。后續(xù)問題:百度的創(chuàng)始人是誰?中間答案:百度的創(chuàng)始人是李彥宏。后續(xù)問題:李彥宏是什么時候出生的?中間答案:李彥宏于1968年11月17日出生。因此最終答案是:1968年11月17日"""},{"question": "特雷西·麥克格雷迪和姚明,誰在NBA打的賽季多?","answer":"""這里需要后續(xù)問題嗎:是。后續(xù)問題:特雷西·麥克格雷迪在NBA打了幾個賽季?中間答案:特雷西·麥克格雷迪在NBA打了9個賽季。后續(xù)問題:姚明在NBA打了幾個賽季?中間答案:姚明在NBA打了8個賽季。因此最終答案是:特雷西·麥克格雷迪"""}]
1)使用一個樣本
# 定義提示詞模板
example_prompt = PromptTemplate(input_variables=["question", "answer"], template="Question: {question}\n{answer}")
# 使用第一個樣例作為參數(shù) 并輸出打印
print(example_prompt.format(**examples[0]))#輸出結(jié)果
Question: 富蘭克林·德拉諾·羅斯福和亞伯拉罕·林肯中哪個擔任總統(tǒng)的時間更長?這里需要后續(xù)問題嗎:是。
后續(xù)問題:富蘭克林·德拉諾·羅斯福擔任了幾年總統(tǒng)?
中間答案:富蘭克林·德拉諾·羅斯福擔任了12年的總統(tǒng)。
后續(xù)問題:亞伯拉罕·林肯則擔任了幾年總統(tǒng)?
中間答案:亞伯拉罕·林肯則擔任了5年的總統(tǒng)。
因此最終答案是:富蘭克林·德拉諾·羅斯福
?
2)使用所有樣本
# 使用所有的樣例
prompt = FewShotPromptTemplate(examples=examples,example_prompt=example_prompt,suffix="Question: {input}",input_variables=["input"]
)print(prompt.format(input="馬云比馬化騰大幾歲?"))
Question: 富蘭克林·德拉諾·羅斯福和亞伯拉罕·林肯中哪個擔任總統(tǒng)的時間更長?這里需要后續(xù)問題嗎:是。
后續(xù)問題:富蘭克林·德拉諾·羅斯福擔任了幾年總統(tǒng)?
中間答案:富蘭克林·德拉諾·羅斯福擔任了12年的總統(tǒng)。
后續(xù)問題:亞伯拉罕·林肯則擔任了幾年總統(tǒng)?
中間答案:亞伯拉罕·林肯則擔任了5年的總統(tǒng)。
因此最終答案是:富蘭克林·德拉諾·羅斯福Question: 百度的創(chuàng)始人是何時出生的?這里需要后續(xù)問題嗎:是。
后續(xù)問題:百度的創(chuàng)始人是誰?
中間答案:百度的創(chuàng)始人是李彥宏。
后續(xù)問題:李彥宏是什么時候出生的?
中間答案:李彥宏于1968年11月17日出生。
因此最終答案是:1968年11月17日Question: 特雷西·麥克格雷迪和姚明,誰在NBA打的賽季多?這里需要后續(xù)問題嗎:是。
后續(xù)問題:特雷西·麥克格雷迪在NBA打了幾個賽季?
中間答案:特雷西·麥克格雷迪在NBA打了9個賽季。
后續(xù)問題:姚明在NBA打了幾個賽季?
中間答案:姚明在NBA打了8個賽季。
因此最終答案是:特雷西·麥克格雷迪Question: 馬云比馬化騰大幾歲?
3)調(diào)用測試
llm.invoke(prompt.format(input="特朗普的爸爸的女兒的兄弟是誰?"))
'
這里需要后續(xù)問題嗎:是。
后續(xù)問題:特朗普的爸爸是誰?
中間答案:特朗普的爸爸是弗雷德·特朗普。
后續(xù)問題:弗雷德·特朗普的女兒是誰?
中間答案:弗雷德·特朗普的女兒是瑪麗·安娜·特朗普。
后續(xù)問題:瑪麗·安娜·特朗普的兄弟是誰?
中間答案:瑪麗·安娜·特朗普的兄弟是唐納德·特朗普。
因此最終答案是:唐納德·特朗普'
五、Output Parsers
為了進一步處理和解析LLMs的輸出結(jié)果,LangChain提供了一系列的Output Parsers。這些解析器能夠?qū)⒛P偷奈谋据敵鲛D(zhuǎn)換為更加結(jié)構(gòu)化的格式,便于后續(xù)的處理和使用。
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAImodel = OpenAI()# 將輸出解析為逗號分隔的列表
parser = CommaSeparatedListOutputParser()
format_instructions = parser.get_format_instructions()prompt = PromptTemplate(template="List five {subject}.\n{format_instructions}",input_variables=["subject"],partial_variables={"format_instructions": format_instructions}
)## LCEL 鏈式表達式語言用法 (前一個的輸入,作為后一個的輸出)
chain = prompt | model | parser
chain.invoke({"subject": "ice cream flavors"})輸出:
['chocolate','vanilla','strawberry','mint chocolate chip','cookies and cream']
總結(jié)
通過以上相關(guān)的功能模塊,LangChain框架的Model IO模塊為大型語言模型的數(shù)據(jù)交互提供了強大支持。其精心設(shè)計的接口和工具讓開發(fā)者能夠更加專注于模型的實際應用,同時簡化了大模型調(diào)用數(shù)據(jù)流的管理細節(jié)。降低了大模型開發(fā)門檻,使得開發(fā)者可以便捷地實現(xiàn)高級的AI應用能力。
探索未知,分享所知;點擊關(guān)注,碼路同行,尋道人生!