1 模型
來看兩種不同型別的模型--LLM 和聊天模型。然後,它將介紹如何使用提示模板來格式化這些模型的輸入,以及如何使用輸出解析器來處理輸出。
LangChain 中的語言模型有兩種型別:
1.1 Chat Models
聊天模型通常由 LLM 支援,但專門針對會話進行了調整。提供者 API 使用與純文字補全模型不同的介面。它們的輸入不是單個字串,而是聊天資訊列表,輸出則是一條人工智慧資訊。
GPT-4 和 Anthropic 的 Claude-2 都是作為聊天模型實現的。
1.2 LLM
LangChain 中的 LLM 指的是純文字補全模型。它們封裝的 API 將字串提示作為輸入,並輸出字串完成。OpenAI 的 GPT-3 就是作為 LLM 實現的。
這兩種 API 型別具有不同的輸入和輸出模式。並非所有模型都一樣。不同的模型有不同的最佳提示策略。如:
- Anthropic 模型最適合使用 XML
- OpenAI 的模型最適合使用 JSON
設計應用程式時牢記這點。示例將使用聊天模型,並提供幾種選擇:使用 Anthropic 或 OpenAI 等 API,或透過 Ollama 使用本地開源模型。
2 例項
OpenAI與ChatOpenAI
#呼叫chatmodels,以openai為例
from langchain.chat_models import ChatOpenAI
from langchain.schema.messages import HumanMessage,AIMessage
import os
api_base = os.getenv("OPENAI_PROXY")
api_key = os.getenv("OPENAI_API_KEY")
chat = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0,
openai_api_key = api_key,
openai_api_base = api_base
)
messages = [
AIMessage(role="system",content="你好,我是tomie!"),
HumanMessage(role="user",content="你好tomie,我是狗剩!"),
AIMessage(role="system",content="認識你很高興!"),
HumanMessage(role="user",content="你知道我叫什麼嗎?")
]
response = chat.invoke(messages)
print(response)
#print(chat.predict("你好"))
3 流式呼叫
為啥要流式輸出呢?
大模型都是一個個字打出來,免得讓你覺得他每次神經網路計算太慢了,讓你感覺他一直在持續輸出。
#LLM類大模型的流式輸出方法
from langchain.llms import OpenAI
import os
api_base = os.getenv("OPENAI_PROXY")
api_key = os.getenv("OPENAI_API_KEY")
#構造一個llm
llm = OpenAI(
model = "gpt-3.5-turbo-instruct",
temperature=0,
openai_api_key = api_key,
openai_api_base = api_base,
max_tokens=512,
)
for chunk in llm.stream("寫一首關於秋天的詩歌"):
print(chunk,end="",flush=False)
所以,token 就很重要了。
4 追蹤Token的使用
#LLM的toekn追蹤
from langchain.llms import OpenAI
from langchain.callbacks import get_openai_callback
import os
api_base = os.getenv("OPENAI_PROXY")
api_key = os.getenv("OPENAI_API_KEY")
#構造一個llm
llm = OpenAI(
model = "gpt-3.5-turbo-instruct",
temperature=0,
openai_api_key = api_key,
openai_api_base = api_base,
max_tokens=512,
)
with get_openai_callback() as cb:
result = llm.invoke("給我講一個笑話")
print(result)
print(cb)
#chatmodels的token追蹤
from langchain.chat_models import ChatOpenAI
from langchain.callbacks import get_openai_callback
import os
api_base = os.getenv("OPENAI_PROXY")
api_key = os.getenv("OPENAI_API_KEY")
llm = ChatOpenAI(
model = "gpt-4",
temperature=0,
openai_api_key = api_key,
openai_api_base = api_base,
max_tokens=512,
)
with get_openai_callback() as cb:
result = llm.invoke("給我講一個笑話")
print(result)
print(cb)
5 自定義輸出
- 輸出函式引數
- 輸出json
- 輸出List
- 輸出日期
講笑話機器人:希望每次根據指令,可以輸出一個這樣的笑話(小明是怎麼死的?笨死的)
from langchain.llms import OpenAI
from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import PromptTemplate
from langchain.pydantic_v1 import BaseModel,Field,validator
from typing import List
import os
api_base = os.getenv("OPENAI_PROXY")
api_key = os.getenv("OPENAI_API_KEY")
#構造LLM
model = OpenAI(
model = "gpt-3.5-turbo-instruct",
temperature=0,
openai_api_key = api_key,
openai_api_base = api_base,
)
#定義個資料模型,用來描述最終的例項結構
class Joke(BaseModel):
setup:str = Field(description="設定笑話的問題")
# 笑點
punchline:str = Field(description="回答笑話的答案")
#驗證問題是否符合要求
@validator("setup")
def question_mark(cls,field):
if field[-1] != "?":
raise ValueError("不符合預期的問題格式!")
return field
#將Joke資料模型傳入
parser = PydanticOutputParser(pydantic_object=Joke)
prompt = PromptTemplate(
template = "回答使用者的輸入.\n{format_instructions}\n{query}\n",
input_variables = ["query"],
partial_variables = {"format_instructions":parser.get_format_instructions()}
)
prompt_and_model = prompt | model
out_put = prompt_and_model.invoke({"query":"給我講一個笑話"})
print("out_put:",out_put)
parser.invoke(out_put)
LLM的輸出格式化成python list形式,類似['a','b','c']
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
import os
api_base = os.getenv("OPENAI_PROXY")
api_key = os.getenv("OPENAI_API_KEY")
#構造LLM
model = OpenAI(
model = "gpt-3.5-turbo-instruct",
temperature=0,
openai_api_key = api_key,
openai_api_base = api_base,
)
parser = CommaSeparatedListOutputParser()
prompt = PromptTemplate(
template = "列出5個{subject}.\n{format_instructions}",
input_variables = ["subject"],
partial_variables = {"format_instructions":parser.get_format_instructions()}
)
_input = prompt.format(subject="常見的小狗的名字")
output = model(_input)
print(output)
#格式化
parser.parse(output)
關注我,緊跟本系列專欄文章,咱們下篇再續!
作者簡介:魔都架構師,多家大廠後端一線研發經驗,在分散式系統設計、資料平臺架構和AI應用開發等領域都有豐富實踐經驗。
各大技術社群頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。
負責:
- 中央/分銷預訂系統效能最佳化
- 活動&券等營銷中臺建設
- 交易平臺及資料中臺等架構和開發設計
- 車聯網核心平臺-物聯網連線平臺、大資料平臺架構設計及最佳化
- LLM應用開發
目前主攻降低軟體複雜性設計、構建高可用系統方向。
參考:
- 程式設計嚴選網
本文由部落格一文多發平臺 OpenWrite 釋出!