AI 大模型企業應用實戰(10)-LLMs和Chat Models

公众号-JavaEdge發表於2024-06-23

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 釋出!

相關文章