Java 程序員從零開始學(xué) LangChain —模型組件
前面的文章了不起給大家介紹了 LangChain 的一些基本知識(shí),沒看過的小伙伴可以點(diǎn)擊這里去看下,今天了不起給大家介紹一下 LangChain 的第一個(gè)很重要的組件模型 Model。
注意這里說的模型是指 LangChain 的模型組件,而不是指類似于 OpenAI 的語言模型,之所以 LangChain 會(huì)出現(xiàn)模型組件就是因?yàn)闃I(yè)內(nèi)的語言模型太多了,除了 OpenAI 這家公司的語言模型之外,還很有很多其他家的。
LangChain 的模型組件有三種類型,分別是 LLM 大語言模型,Chat Model 聊天模型和文本嵌入模型 Text Embedding Models。
LLM 大語言模型
LLM 作為最基本的一種模型組件,輸入和輸出都只支持字符串,在大部分的場(chǎng)景下就可以滿足我們的需求了。我們可以在 Colab([https://colab.research.google.com) 上面直接寫 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 的模型名稱,執(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 模型的,只不過 Chat Model 相對(duì)于 LLM 模型組件間輸入和輸出更加結(jié)構(gòu)化,輸入和輸出的參數(shù)的類型都是 Chat Model,而不是簡(jiǎn)單的字符串。常用的 Chat Model 類型有如下幾種
- AIMessage:用來保存 LLM 的響應(yīng),以便在下次請(qǐng)求時(shí)把這些信息傳回給 LLM。
- HumanMessage:發(fā)送給 LLMs 的提示信息,比如“實(shí)現(xiàn)一個(gè)快速排序方法”
- SystemMessage:設(shè)置 LLM 模型的行為方式和目標(biāo)。你可以在這里給出具體的指示,比如“作為一個(gè)代碼專家”,或者“返回 json 格式”。
- ChatMessage:ChatMessage 可以接收任意形式的值,但是在大多數(shù)時(shí)間,我們應(yīng)該使用上面的三種類型。
舉個(gè)栗子
from langchain.chat_models import ChatOpenAI
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
chat = ChatOpenAI(temperature=0)
messages = [
SystemMessage(cnotallow="返回的數(shù)據(jù)markdown 語法進(jìn)行展示,代碼使用代碼塊包裹"),
HumanMessage(cnotallow="用 Java 實(shí)現(xiàn)一個(gè)二分查找算法")
]
print(chat(messages))
生成的內(nèi)容字符串形式如下
cnotallow='二分查找算法,也稱折半查找算法,是一種在有序數(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)容提取出來,用 markdown 語法展示出來是這樣的
使用這個(gè)模型組件,可以進(jìn)行一些角色的預(yù)設(shè),然后來定制個(gè)性化的問答。
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="英語", output_language="漢語", text="I love programming.")
print(messages)
chat = ChatOpenAI(temperature=0)
print(chat(messages.to_messages()))
output
messages=[SystemMessage(cnotallow='你是一個(gè)把英語翻譯成漢語的助手', 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 是將高維特征壓縮成低維特征的一種方法,常用于自然語言處理任務(wù)中,如文本分類、機(jī)器翻譯、推薦系統(tǒng)等。它將單詞、短語、句子等文本中的離散數(shù)據(jù)映射到實(shí)數(shù)域上的向量,這些向量可以被神經(jīng)網(wǎng)絡(luò)更好地處理和學(xué)習(xí)。通過 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