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

来源:https://www.cnblogs.com/JavaEdge/p/18264042
-Advertisement-
Play Games

1 模型 來看兩種不同類型的模型--LLM 和聊天模型。然後,它將介紹如何使用提示模板來格式化這些模型的輸入,以及如何使用輸出解析器來處理輸出。 LangChain 中的語言模型有兩種類型: 1.1 Chat Models 聊天模型通常由 LLM 支持,但專門針對會話進行了調整。提供者 API 使用 ...


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 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 刷機 溫馨提示:如果你不知道root的意義在哪,建議不要解鎖和root,到時候救磚或者回鎖都挺麻煩。 刷全量包 最新版的系統沒有更新推送,所以去一加社區[0]找了個全量包來刷,。安裝方式可以看帖子里的內容,說的比較詳細,這裡截圖一部分: 解鎖bootloader 在系統與更新-》開發者選項 里勾選O ...
  • 多線程在訪問同一個共用變數時很可能會出現併發問題,特別是在多線程對共用變數進入寫入時,那麼除了加鎖還有其他方法避免併發問題嗎?本文將詳細講解 ThreadLocal 的使用及其源碼。 ...
  • 根據不同場景使用不同方案進行實現尤為必要。通常開發過程中,文件較小,直接將文件轉化為位元組流上傳到伺服器,但是文件較大時,用普通的方法上傳,顯然效果不是很好,當文件上傳一半中斷再次上傳時,發現需要重新開始,這種體驗不是很爽,下麵介紹幾種好一點兒的上傳方式。 這裡講講如何在Spring bo... ...
  • Stirling-PDF —— 一個基於 Web 的 PDF 操作工具,支持對 PDF 文件進行各種操作,包括分割、合併、轉換、重組、添加圖像、旋轉、壓縮等。 ...
  • 1 開源解析和拆分文檔 第三方工具去對文件解析拆分,將文件內容給提取出來,並將我們的文檔內容去拆分成一個小的chunk。常見的PDF word mark down, JSON、HTML。都可以有很好的一些模塊去把這些文件去進行一個東西去提取。 1.1 優勢 支持豐富的文檔類型 每種文檔多樣化選擇 與 ...
  • 正文 21 日正是周五,夏至。全年當中,白天時長最長的一天。而恰好那天也是銀行扣息的日子。所以很忙,我差點沒能走掉。 所幸最終還是有驚無險。 到斯的家裡,是晚上 9 點鐘。比我想得要早。這個周周四,他過生日。但是那天因為上班,所以移到了周末。不是法定節假日,很普通的一個周末。全年有很多個這樣的周末。 ...
  • 大模型在一定程度上去改變了我們生活生工作的思考的方式,然後也越來越多的個人還有企業在思考如何將大模型去應用到更加實際的呃生產生活中去,希望大語言模型能夠呃有一些更多企業級別生產落地的實踐,然後去幫助我們解決一些業務上的問題。目前 1 LLM的問題 1.1 幻覺 LLM因為是一個預訓練模型,它已有一些 ...
  • SingleStringMathTex是Mobjects分類中用來顯示數學公式的class。manim中有3個可以用來顯示數學公式的class,還有兩個是MathTex和Tex,後續再介紹。 從SingleStringMathTex的名稱中也可以看出,它是用來顯示只有一行的簡單公式。SingleSt ...
一周排行
    -Advertisement-
    Play Games
  • 問題 有很多應用程式在驗證JSON數據的時候用到了JSON Schema。 在微服務架構下,有時候各個微服務由於各種歷史原因,它們所生成的數據對JSON Object屬性名的大小寫規則可能並不統一,它們需要消費的JSON數據的屬性名可能需要大小寫無關。 遺憾的是,目前的JSON Schema沒有這方 ...
  • 首先下載centos07鏡像,建議使用阿裡雲推薦的地址: https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spm=a2c6h.25603864.0.0.59b5f5ad5Nfr0X 其實這裡就已經出現第一個坑了 centos 07 /u ...
  • 相信很多.NETer看了標題,都會忍不住好奇,點進來看看,並且順便準備要噴作者! 這裡,首先要申明一下,作者本人也非常喜歡Linq,也在各個項目中常用Linq。 我愛Linq,Linq優雅萬歲!!!(PS:順便吐槽一下,隔壁Java從8.0版本推出的Streams API,抄了個四不像,一點都不優雅 ...
  • 在人生的重要時刻,我站在了畢業的門檻上,望著前方的道路,心中涌動著對未來的無限憧憬與些許忐忑。面前,兩條道路蜿蜒伸展:一是繼續在職場中尋求穩定,一是勇敢地走出一條屬於自己的創新之路。儘管面臨年齡和現實的挑戰,我仍舊選擇勇往直前,用技術這把鑰匙,開啟新的人生篇章。 迴首過去,我深知時間寶貴,精力有限。 ...
  • 單元測試 前言 時隔多個月,終於抽空學習了點新知識,那麼這次來記錄一下C#怎麼進行單元測試,單元測試是做什麼的。 我相信大部分剛畢業的都很疑惑單元測試是乾什麼的?在小廠實習了6個月後,我發現每天除了寫CRUD就是寫CRUD,幾乎用不到單元測試。寫完一個功能直接上手去測,當然這隻是我個人感受,僅供參考 ...
  • 一:背景 1. 講故事 最近在分析dump時,發現有程式的卡死和WeakReference有關,在以前只知道怎麼用,但不清楚底層邏輯走向是什麼樣的,藉著這個dump的契機來簡單研究下。 二:弱引用的玩法 1. 一些基礎概念 用過WeakReference的朋友都知道這裡面又可以分為弱短和弱長兩個概念 ...
  • 最近想把ET打表工具的報錯提示直接調用win系統彈窗,好讓策劃明顯的知道表格哪裡填錯數據,彈窗需要調用System.Windows.Forms庫。操作如下: 需要在 .csproj 文件中添加: <UseWindowsForms>true</UseWindowsForms> 須將目標平臺設置為 Wi ...
  • 從C#3開始,拓展方法這一特性就得到了廣泛的應用。 此功能允許你能夠使用實例方法的語法調用某個靜態方法,以下是一個獲取/創建文件的靜態方法: public static async Task<StorageFile> GetOrCreateFileAsync(this StorageFolder f ...
  • 在Windows 11下,使用WinUI2.6以上版本的ListView長這樣: 然而到了Win10上,儘管其他控制項的樣式沒有改變,但ListViewItem變成了預設樣式(初代Fluent) 最重大的問題是,Win10上的HorizontalAlignment未被設置成Stretch,可能造成嚴重 ...
  • 前言 周六在公司加班,幹完活後越顯無聊,想著下載RabbiitMQ做個小項目玩玩。然而這一下就下載了2個小時,真讓人頭痛。 簡單的講一下如何安裝吧,網上教程和踩坑文章還是很多的,我講我感覺有用的文章放在本文末尾。 安裝地址 erlang 下載 - Erlang/OTP https://www.erl ...