LLM及LangChain開發筆記(9)_LangChain對接OpenAI_OpenAI與ChatOpenAI兩種開發API使用

https://developer.aliyun.com/article/1218081

LangChain is a framework for developing applications powered by large language models (LLMs).




在LLM及LangChain開發筆記(3)篇章時,我們已安裝 LangChain 0.3 版本
pip install langchain==0.3.0

這邊可以透過pip list去檢閱目前版本,可發現其他langchain相依套件也一併都安裝下來。

LangChain 0.3x 以後的版本結構大改,llms.OpenAI 被拆分移到 langchain_community 套件中。
還要補安裝langchain_community

https://api.python.langchain.com/en/latest/community_api_reference.html
https://python.langchain.com/api_reference/community/index.html

pip install langchain-community




記得先執行以下套件下載
pip install langchain==0.3.0
pip install openai==0.28
pip install langchain-community
pip install langchain-openai==0.3.0

示範程式-1 LLM的OpenAI開發API使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import openai
import os

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())  # read local .env file

openai.api_key = os.getenv('OPENAI_API_KEY')

from langchain.llms import OpenAI

llm = OpenAI(model_name="gpt-3.5-turbo-instruct",max_tokens=1024)
response = llm.invoke("怎麼評價人工智慧")
print(response)

!pip show langchain


第一段OPENAI_API_KEY環境變數讀取仍為必備的,請記得先運行。





示範程式-2 聊天模型ChatOpenAI開發API使用
簡易的 LLM 聊天機器人互動迴圈,使用的是 LangChain 封裝的 OpenAI gpt-3.5-turbo 模型。


範例程式2
1
2
3
4
5
6
7
8
from langchain.schema import HumanMessage
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.0)
while True:
    my_input = input("(me): ")
    my_input = [HumanMessage(content=my_input)]
    llm_output = chat(my_input)
    print(f"(llm): {llm_output.content}")
  • HumanMessage:LangChain 的訊息類別,用來表示使用者輸入(Human)。
  • ChatOpenAI:LangChain 的聊天模型包裝器,用於呼叫 gpt-3.5-turbo 或 gpt-4。
  • input() 接收來自鍵盤的輸入。
  • 再包裝成 LangChain 所需的格式 List[BaseMessage],也就是一個 HumanMessage物件實體的 list。
  • 呼叫 chat(),把訊息發送給 GPT 模型,再去印出模型回覆的內容。
可觀察目前沒有記憶歷史的能力

示範程式-3 AIMessage與HumanMessage、批次generate使用

範例程式3-1 AIMessage與HumanMessage

1
2
3
4
5
6
7
8
9
from langchain.chat_models import ChatOpenAI
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)

chat = ChatOpenAI(temperature=0)
chat([HumanMessage(content="將這句話從中文翻譯成英文:知道妳收到上榜的通知單,我的心裡就變得很亂。不知為妳而高興還為自己憂愁,只好就放妳走。")])

使用 HumanMessage 包裝的翻譯請求,模型會輸出英文翻譯作為 AIMessage。
(temperature=0 強調準確與穩定輸出)
  • HumanMessage:表示「使用者輸入」訊息。
  • AIMessage:表示模型回應。
  • SystemMessage:可選,用來設定整體對話的系統角色或風格。



範例程式3-2 批次generate使用
使用 LangChain + OpenAI GPT 聊天模型,一次處理「多組不同語境的訊息批次」,並讓模型執行「中翻英」與「英翻中」兩項翻譯任務。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
batch_messages = [
    [
        SystemMessage(content="你是個有幫助的助手,可以將中文翻譯成英文。"),
        HumanMessage(content="將這句話從中文翻譯成英文:浸泡在十公升的瓶裡,單純想要呼吸,討厭雲裡霧裡。")
    ],
    [
        SystemMessage(content="你是個有幫助的助手,可以將英文翻譯成中文。"),
        HumanMessage(content="將這句話從英文翻譯成中文:Another sunrise, another sunset.Soon it'll all be yesterday。")
    ],
]
result = chat.generate(batch_messages)
print(result)

建立了兩筆對話紀錄:
  • 第一筆:模型被告知要把中文翻成英文,並翻譯一段抽象句。
  • 第二筆:模型被告知要把英文翻成中文,翻譯一段抒情句。
generate() 是 ChatOpenAI 支援的 批次輸入方法,可以一次處理多組對話。
它會回傳一個 LLMResult 物件,裡面包含每組對話的回覆。

LLMResult 的物件內容
通常包含:
.generations:一個 list,每組輸入對話會對應一個回應,每個回應會是 AIMessage 的object。

示範程式-4 ChatPromptTemplate使用,把提示模板化。
  • ChatPromptTemplate.from_template():將純文字轉為 LangChain 可用的 聊天提示模板。
  • format_messages():轉換成模型可接受的 BaseMessage(預設會是一則 HumanMessage)。
  • 使用 chat(prompt) 將 HumanMessage 提示送出,讓模型生成詩句。
  • response 是 AIMessage,response.content 即為模型輸出的文字內容。
範例程式4

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.0)

text = f"""
請寫一首詩,和夏天機車通勤族有關。
"""

from langchain.prompts import ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_template(text)

prompt = prompt_template.format_messages()

response = chat(prompt)
print(response.content)




https://lunary.ai/blog/langchain-humanmessage#messageclass-in-langchain
SystemMessage : 用於向 AI 系統提供指令或上下文。
HumanMessage : 表示來自人類用戶的輸入。
ChatMessage: 用於各種互動的通用消息類型。

留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header