前面的文章了不起跟大家介紹了 LangChain 的一些基本知識,沒看過的小夥伴可以點擊這裡去看下,今天了不起給大家介紹一下 LangChain 的第一個很重要的組件模型 Model。
注意這裡說的模型是指 LangChain 的模型組件,而不是指類似於 OpenAI 的語言模型,之所以 LangChain 會出現模型組件就是因為業內的語言模型太多了,除了 OpenAI 這家公司的語言模型之外,還很有很多其他家的。
LangChain 的模型元件有三種類型,分別是 LLM 大語言模型,Chat Model 聊天模型和文字嵌入模型 Text Embedding Models。
LLM 作為最基本的一種模型元件,輸入和輸出都只支援字串,在大部分的場景下就可以滿足我們的需求了。我們可以在 Colab([https://colab.research.google.com) 上面直接寫 Python 程式碼
下面是一個 case,先安裝依賴,再執行下面的代碼。
pip install openaipip install langchain
import os# 配置OpenAI 的 API KEYos.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 是基於 LLM 模型的,只不過 Chat Model 相對於 LLM 模型元件間輸入與輸出較為結構化,輸入與輸出的參數的型別都是 Chat Model,而非簡單的字串。常用的 Chat Model 類型有下列幾種
from langchain.chat_models import ChatOpenAIfrom langchain.schema import (AIMessage,HumanMessage,SystemMessage)chat = ChatOpenAI(temperature=0)messages = [SystemMessage(cnotallow="返回的数据markdown 语法进行展示,代码使用代码块包裹"),HumanMessage(cnotallow="用 Java 实现一个二分查找算法")]print(chat(messages))
產生的內容字串形式如下
折半查找演算法是一種用於在有序數組中查找特定元素的搜索演算法,也稱為二分查找演算法。此演算法的時間複雜度為 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 ChatOpenAIfrom 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()))
文本嵌入模型组件相对比较难理解,这个组件接收的是一个字符串,返回的是一个浮点数的列表。在 NLP 领域中 Embedding 是一个很常用的技术,Embedding 是将高维特征压缩成低维特征的一种方法,常用于自然语言处理任务中,如文本分类、机器翻译、推荐系统等。它将文本中的离散数据如单词、短语、句子等,映射为实数向量,以更好地进行神经网络处理和学习。通过 Embedding,文本数据可以被更好地表示和理解,提高了模型的表现力和泛化能力。
from langchain.embeddings import OpenAIEmbeddingsembeddings = 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
以上是Java 程式設計師從零開始學 LangChain —模型元件的詳細內容。更多資訊請關注PHP中文網其他相關文章!