Java 程序員從零開始學 LangChain —模型組件
前面的文章了不起給大家介紹了 LangChain 的一些基本知識,沒看過的小伙伴可以點擊這里去看下,今天了不起給大家介紹一下 LangChain 的第一個很重要的組件模型 Model。
注意這里說的模型是指 LangChain 的模型組件,而不是指類似于 OpenAI 的語言模型,之所以 LangChain 會出現模型組件就是因為業內的語言模型太多了,除了 OpenAI 這家公司的語言模型之外,還很有很多其他家的。
LangChain 的模型組件有三種類型,分別是 LLM 大語言模型,Chat Model 聊天模型和文本嵌入模型 Text Embedding Models。
LLM 大語言模型
LLM 作為最基本的一種模型組件,輸入和輸出都只支持字符串,在大部分的場景下就可以滿足我們的需求了。我們可以在 Colab([https://colab.research.google.com) 上面直接寫 Python 代碼
舉個栗子
下面是一個 case,先安裝依賴,再執行下面的代碼。
pip install openai
pip install langchain
import os
# 配置OpenAI 的 API KEY
os.environ["OPENAI_API_KEY"] ="sk-xxx"
# 從 LangChain 中導入 OpenAI 的模型
from langchain.llms import OpenAI
# 三個參數分別代表OpenAI 的模型名稱,執行的次數和隨機性,數值越大越發散
llm = OpenAI(model_name="text-davinci-003", n=2, temperature=0.3)
llm.generate(["給我講一個故事", "給我講一個笑話"])
運行的結果如下
Chat Model 聊天模型
Chat Model 是基于 LLM 模型的,只不過 Chat Model 相對于 LLM 模型組件間輸入和輸出更加結構化,輸入和輸出的參數的類型都是 Chat Model,而不是簡單的字符串。常用的 Chat Model 類型有如下幾種
- AIMessage:用來保存 LLM 的響應,以便在下次請求時把這些信息傳回給 LLM。
- HumanMessage:發送給 LLMs 的提示信息,比如“實現一個快速排序方法”
- SystemMessage:設置 LLM 模型的行為方式和目標。你可以在這里給出具體的指示,比如“作為一個代碼專家”,或者“返回 json 格式”。
- ChatMessage:ChatMessage 可以接收任意形式的值,但是在大多數時間,我們應該使用上面的三種類型。
舉個栗子
from langchain.chat_models import ChatOpenAI
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
chat = ChatOpenAI(temperature=0)
messages = [
SystemMessage(cnotallow="返回的數據markdown 語法進行展示,代碼使用代碼塊包裹"),
HumanMessage(cnotallow="用 Java 實現一個二分查找算法")
]
print(chat(messages))
生成的內容字符串形式如下
cnotallow='二分查找算法,也稱折半查找算法,是一種在有序數組中查找特定元素的搜索算法。該算法的時間復雜度為 O(log n)。\n\n以下是 Java 實現二分查找算法的代碼:\n\njava\npublic class BinarySearch {\n public static int binarySearch(int[] arr, int target) {\n int left = 0;\n int right = arr.length - 1;\n while (left <= right) {\n int mid = (left + right) / 2;\n if (arr[mid] == target) {\n return mid;\n } else if (arr[mid] < target) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n return -1;\n }\n\n public static void main(String[] args) {\n int[] arr = {1, 3, 5, 7, 9};\n int target = 5;\n int index = binarySearch(arr, target);\n if (index != -1) {\n System.out.println("目標元素 " + target + " 在數組中的下標為 " + index);\n } else {\n System.out.println("目標元素 " + target + " 不在數組中");\n }\n }\n}\n\n\n在上述代碼中,binarySearch 方法接收一個有序數組和一個目標元素,返回目標元素在數組中的下標,如果目標元素不在數組中,則返回 -1。\n\n在 binarySearch 方法中,使用兩個指針 left 和 right 分別指向數組的左右兩端,然后在一個 while 循環中不斷縮小查找范圍,直到找到目標元素或者查找范圍為空。在每次循環中,計算中間位置 mid,然后將目標元素與中間位置的元素進行比較,如果相等,則返回中間位置的下標;如果目標元素比中間位置的元素大,則將左指針移到中間位置的右邊;如果目標元素比中間位置的元素小,則將右指針移到中間位置的左邊。' additional_kwargs={} example=False
將 content 里面的內容提取出來,用 markdown 語法展示出來是這樣的
使用這個模型組件,可以進行一些角色的預設,然后來定制個性化的問答。
Prompts template
from langchain.chat_models import ChatOpenAI
from langchain.prompts import (
ChatPromptTemplate,
PromptTemplate,
SystemMessagePromptTemplate,
AIMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
system_template="你是一個把{input_language}翻譯成{output_language}的助手"
system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)
human_template="{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
messages = chat_prompt.format_prompt(input_language="英語", output_language="漢語", text="I love programming.")
print(messages)
chat = ChatOpenAI(temperature=0)
print(chat(messages.to_messages()))
output
messages=[SystemMessage(cnotallow='你是一個把英語翻譯成漢語的助手', additional_kwargs={}), HumanMessage(cnotallow='I love programming.', additional_kwargs={}, example=False)] cnotallow='我喜歡編程。' additional_kwargs={} example=False
文本嵌入模型 Text Embedding Models
文本嵌入模型組件相對比較難理解,這個組件接收的是一個字符串,返回的是一個浮點數的列表。在 NLP 領域中 Embedding 是一個很常用的技術,Embedding 是將高維特征壓縮成低維特征的一種方法,常用于自然語言處理任務中,如文本分類、機器翻譯、推薦系統等。它將單詞、短語、句子等文本中的離散數據映射到實數域上的向量,這些向量可以被神經網絡更好地處理和學習。通過 Embedding,文本數據可以被更好地表示和理解,提高了模型的表現力和泛化能力。
舉個栗子
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
text = "hello world"
query_result = embeddings.embed_query(text)
doc_result = embeddings.embed_documents([text])
print(query_result)
print(doc_result)
output
[-0.01491016335785389, 0.0013780705630779266, -0.018519161269068718, -0.031111136078834534, -0.02430146001279354, 0.007488010451197624,0.011340680532157421, 此處省略 .......
總結
今天給大家介紹了一下 LangChain 的模型組件,有了模型組件我們就可以更加方便的跟各種 LLMs 進行交互了。
參考資料
官方文檔:https://python.langchain.com/en/latest/modules/models.html