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