LangChain 是一個(gè)強(qiáng)大的框架,可以簡(jiǎn)化構(gòu)建高級(jí)語言模型應(yīng)用程序的過程。
LangChain簡(jiǎn)介
LangChain是一個(gè)強(qiáng)大的框架,旨在幫助開發(fā)人員使用語言模型構(gòu)建端到端的應(yīng)用程序。它提供了一套工具、組件和接口,可簡(jiǎn)化創(chuàng)建由大型語言模型 (LLM) 和聊天模型提供支持的應(yīng)用程序的過程。LangChain 可以輕松管理與語言模型的交互,將多個(gè)組件鏈接在一起,并集成額外的資源,例如 API 和數(shù)據(jù)庫(kù)。
LangChain的主要功能有:調(diào)用語言模型,將不同數(shù)據(jù)源接入到語言模型的交互中,允許語言模型與運(yùn)行環(huán)境交互。
LangChain中的核心概念
1. Components and Chains
**Component 是模塊化的構(gòu)建塊,可以組合起來創(chuàng)建強(qiáng)大的應(yīng)用程序。Chain 是組合在一起以完成特定任務(wù)的一系列 Components(或其他 Chain)。**例如,一個(gè) Chain 可能包括一個(gè) Prompt 模板、一個(gè)語言模型和一個(gè)輸出解析器,它們一起工作以處理用戶輸入、生成響應(yīng)并處理輸出。
2. Prompt Templates and Values
Prompt Template 負(fù)責(zé)創(chuàng)建 PromptValue,這是最終傳遞給語言模型的內(nèi)容。Prompt Template 有助于將用戶輸入和其他動(dòng)態(tài)信息轉(zhuǎn)換為適合語言模型的格式。PromptValues 是具有方法的類,這些方法可以轉(zhuǎn)換為每個(gè)模型類型期望的確切輸入類型(如文本或聊天消息)。
3. Example Selectors
當(dāng)想要在 Prompts 中動(dòng)態(tài)包含示例時(shí),Example Selectors 很有用。它們接受用戶輸入并返回一個(gè)示例列表以在提示中使用,使其更強(qiáng)大和特定于上下文。
4. Output Parsers
Output Parsers 負(fù)責(zé)將語言模型響應(yīng)構(gòu)建為更有用的格式。它們實(shí)現(xiàn)了兩種主要方法:一種用于提供格式化指令,另一種用于將語言模型的響應(yīng)解析為結(jié)構(gòu)化格式。這使得在您的應(yīng)用程序中處理輸出數(shù)據(jù)變得更加容易。
5. Indexes and Retrievers
Index 是一種組織文檔的方式,使語言模型更容易與它們交互。檢索器是用于獲取相關(guān)文檔并將它們與語言模型組合的接口。LangChain 提供了用于處理不同類型的索引和檢索器的工具和功能,例如矢量數(shù)據(jù)庫(kù)和文本拆分器。
6. Chat Message History
LangChain 主要通過聊天界面與語言模型進(jìn)行交互。ChatMessageHistory 類負(fù)責(zé)記住所有以前的聊天交互數(shù)據(jù),然后可以將這些交互數(shù)據(jù)傳遞回模型、匯總或以其他方式組合。這有助于維護(hù)上下文并提高模型對(duì)對(duì)話的理解。
7. Agents and Tookits
Agent 是在 LangChain 中推動(dòng)決策制定的實(shí)體。它們可以訪問一套工具,并可以根據(jù)用戶輸入決定調(diào)用哪個(gè)工具。Tookits 是一組工具,當(dāng)它們一起使用時(shí),可以完成特定的任務(wù)。代理執(zhí)行器負(fù)責(zé)使用適當(dāng)?shù)墓ぞ哌\(yùn)行代理。
什么是LangChain Agent?
LangChain Agent 是框架中驅(qū)動(dòng)決策制定的實(shí)體。它可以訪問一組工具,并可以根據(jù)用戶的輸入決定調(diào)用哪個(gè)工具。代理幫助構(gòu)建復(fù)雜的應(yīng)用程序,這些應(yīng)用程序需要自適應(yīng)和特定于上下文的響應(yīng)。當(dāng)存在取決于用戶輸入和其他因素的未知交互鏈時(shí),它們特別有用。
什么是LangChain model?
LangChain model 是一種抽象,表示框架中使用的不同類型的模型。LangChain 中的模型主要分為三類:
- LLM(大型語言模型):這些模型將文本字符串作為輸入并返回文本字符串作為輸出。它們是許多語言模型應(yīng)用程序的支柱。
- 聊天模型( Chat Model):聊天模型由語言模型支持,但具有更結(jié)構(gòu)化的 API。他們將聊天消息列表作為輸入并返回聊天消息。這使得管理對(duì)話歷史記錄和維護(hù)上下文變得容易。
- 文本嵌入模型(Text Embedding Models):這些模型將文本作為輸入并返回表示文本嵌入的浮點(diǎn)列表。這些嵌入可用于文檔檢索、聚類和相似性比較等任務(wù)。
LangChain的代碼結(jié)構(gòu)
langchain的repo:https://github.com/hwchase17/langchain
可以看到LangChain可以對(duì)接的LLM不止一個(gè),agents和tools同樣有很多個(gè):
1. LangChain中提供的模塊
- Modules:支持的模塊類型和集成
- Prompt:提示詞管理、優(yōu)化和序列化
- Memory:內(nèi)存是指在鏈/代理調(diào)用之間持續(xù)存在的狀態(tài)。
- Indexes:當(dāng)語言模型與特定于應(yīng)用程序的數(shù)據(jù)相結(jié)合時(shí),會(huì)變得更加強(qiáng)大——此模塊包含用于加載、查詢和更新外部數(shù)據(jù)的接口和集成。
- Chain:鏈?zhǔn)墙Y(jié)構(gòu)化的調(diào)用序列(對(duì)LLM或其他實(shí)用程序)。
- Agents:代理是一個(gè)鏈,其中LLM在給定高級(jí)指令和一組工具的情況下,反復(fù)決定操作,執(zhí)行操作并觀察結(jié)果,直到高級(jí)指令完成。
- Callbacks:回調(diào)允許記錄和流式傳輸任何鏈的中間步驟,從而輕松觀察、調(diào)試和評(píng)估應(yīng)用程序的內(nèi)部。
2. LangChain的應(yīng)用場(chǎng)景
- 文檔問答:一個(gè)常見的LangChain用例。在特定文檔上回答問題,僅利用這些文檔中的信息來構(gòu)建答案。
- 個(gè)人助理:LangChain的主要用例之一。個(gè)人助理需要采取行動(dòng),記住互動(dòng),并了解您的數(shù)據(jù)
- 查詢表格數(shù)據(jù):使用語言模型查詢庫(kù)表類型結(jié)構(gòu)化數(shù)據(jù)(CSV、SQL、DataFrame等)
- 與API交互:使語言模型與API交互非常強(qiáng)大,它允許他們?cè)L問最新信息,并允許他們采取行動(dòng)。
- 信息抽取:從文本中提取結(jié)構(gòu)化的信息。
- 文檔總結(jié):壓縮較長(zhǎng)文檔,一種數(shù)據(jù)增強(qiáng)生成。
3. LangChain 的主要特點(diǎn)
LangChain 旨在為六個(gè)主要領(lǐng)域的開發(fā)人員提供支持:
- LLM 和提示:LangChain 使管理提示、優(yōu)化它們以及為所有 LLM 創(chuàng)建通用界面變得容易。此外,它還包括一些用于處理 LLM 的便捷實(shí)用程序。
- 鏈(Chain):這些是對(duì) LLM 或其他實(shí)用程序的調(diào)用序列。LangChain 為鏈提供標(biāo)準(zhǔn)接口,與各種工具集成,為流行應(yīng)用提供端到端的鏈。
- 數(shù)據(jù)增強(qiáng)生成:LangChain 使鏈能夠與外部數(shù)據(jù)源交互以收集生成步驟的數(shù)據(jù)。例如,它可以幫助總結(jié)長(zhǎng)文本或使用特定數(shù)據(jù)源回答問題。
- Agents:Agents 讓 LLM 做出有關(guān)行動(dòng)的決定,采取這些行動(dòng),檢查結(jié)果,并繼續(xù)前進(jìn)直到工作完成。LangChain 提供了代理的標(biāo)準(zhǔn)接口,多種代理可供選擇,以及端到端的代理示例。
- 內(nèi)存:LangChain 有一個(gè)標(biāo)準(zhǔn)的內(nèi)存接口,有助于維護(hù)鏈或代理調(diào)用之間的狀態(tài)。它還提供了一系列內(nèi)存實(shí)現(xiàn)和使用內(nèi)存的鏈或代理的示例。
- 評(píng)估:很難用傳統(tǒng)指標(biāo)評(píng)估生成模型。這就是為什么 LangChain 提供提示和鏈來幫助開發(fā)者自己使用 LLM 評(píng)估他們的模型。
LangChain使用示例
LangChain 支持大量用例,例如:
- 針對(duì)特定文檔的問答:根據(jù)給定的文檔回答問題,使用這些文檔中的信息來創(chuàng)建答案。
- 聊天機(jī)器人:構(gòu)建可以利用 LLM 的功能生成文本的聊天機(jī)器人。
- Agents:開發(fā)可以決定行動(dòng)、采取這些行動(dòng)、觀察結(jié)果并繼續(xù)執(zhí)行直到完成的代理。
使用 LangChain 構(gòu)建端到端語言模型應(yīng)用程序
LangChain中有兩個(gè)核心概念:agent
和tool
安裝LangChain:
pip install openai
環(huán)境設(shè)置
現(xiàn)在由于 LangChain 經(jīng)常需要與模型提供者、數(shù)據(jù)存儲(chǔ)、API 等集成,我們將設(shè)置我們的環(huán)境。在這個(gè)例子中,將使用 OpenAI 的 API,因此需要安裝他們的 SDK:
pip install openai
設(shè)置環(huán)境變量:
import os
import openai
import warnings
warnings.filterwarnings('ignore')
# Set the OpenAI API key
os.environ['OPENAI_API_KEY'] = "sk-xxxxxxxxxxxxxxx" # get api_key from openai official website
openai.api_key = os.getenv("OPENAI_API_KEY")
構(gòu)建語言模型應(yīng)用程序:LLM
安裝好LangChain并設(shè)置好環(huán)境后,就可以開始構(gòu)建語言模型應(yīng)用程序了。LangChain 提供了一堆模塊,可以使用它們來創(chuàng)建語言模型應(yīng)用程序。可以將這些模塊組合起來用于更復(fù)雜的應(yīng)用程序,或者將它們單獨(dú)用于更簡(jiǎn)單的應(yīng)用程序。
構(gòu)建語言模型應(yīng)用程序:Chat Model
除了 LLM,還可以使用聊天模型。這些是語言模型的變體,它們?cè)诘讓邮褂谜Z言模型但具有不同的界面。聊天模型使用聊天消息作為輸入和輸出,而不是“文本輸入、文本輸出”API。聊天模型API的使用還比較新,所以大家都還在尋找最佳抽象使用方式。
要完成聊天,需要將一條或多條消息傳遞給聊天模型。LangChain 目前支持 AIMessage、HumanMessage、SystemMessage 和 ChatMessage 類型。主要使用 HumanMessage、AIMessage 和 SystemMessage。例如:
from langchain.chat_models import ChatOpenAI
from langchain.schema import (AIMessage, HumanMessage, SystemMessage)
上圖示例中表示向OpenAI傳遞一條消息。當(dāng)然,也可以傳遞多條消息:
還可以使用generate
為多組消息生成完成。這將返回一個(gè)帶有附加消息參數(shù)的 LLMResult:
還可以從 LLMResult 中提取 tokens 使用等信息:
result.llm_output['token_usage']
# -> {'prompt_tokens': 69, 'completion_tokens': 19, 'total_tokens': 88}
對(duì)于聊天模型,還可以通過使用 MessagePromptTemplate
來使用模板??梢詮囊粋€(gè)或多個(gè) MessagePromptTemplates
創(chuàng)建 ChatPromptTemplate
。ChatPromptTemplate 的方法format_prompt返回一個(gè) PromptValue,可以將其轉(zhuǎn)換為字符串或 Message 對(duì)象,具體取決于是否要使用格式化值作為 LLM 或聊天模型的輸入。例如:
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate)
還可以將代理與聊天模型一起使用。使用 AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION
作為代理類型初始化 Agent
:
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.chat_models import ChatOpenAI
from langchain.llms import OpenAI
安裝serpapi
package和設(shè)置SERPAPI_API_KEY
環(huán)境變量:
!pip install google-search-results
# Set the Search API key
os.environ['SERPAPI_API_KEY'] = "xxxxxxxxxxxxxxxxx"
在此示例中,代理將以交互的方式執(zhí)行搜索和計(jì)算以提供最終答案。
最后,探索將內(nèi)存與使用聊天模型初始化的鏈和代理一起使用。這與 Memory for LLMs 的主要區(qū)別在于可以將以前的消息保留為它們自己唯一的內(nèi)存對(duì)象,而不是將它們壓縮成一個(gè)字符串。
from langchain.prompts import (
ChatPromptTemplate,
MessagesPlaceholder,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate
)
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory
prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template("The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know."),
MessagesPlaceholder(variable_name="history"),
HumanMessagePromptTemplate.from_template("{input}")
])
llm = ChatOpenAI(temperature=0)
memory = ConversationBufferMemory(return_messages=True)
conversation = ConversationChain(memory=memory, prompt=prompt, llm=llm)
在此示例中使用ConversationChain來維護(hù)跨與 AI 的多次交互的對(duì)話上下文。
如何實(shí)現(xiàn)基于本地知識(shí)的問答?
基于單一文檔問答的實(shí)現(xiàn)原理
- 加載本地文檔
- 文檔拆分
- 根據(jù)提問匹配文本
- 構(gòu)建prompt
- LLM生成回答
基于本地知識(shí)庫(kù)問答的實(shí)現(xiàn)原理
從文檔處理角度來看,實(shí)現(xiàn)流程如下:
代碼實(shí)現(xiàn):
LangChain-ChatGLM簡(jiǎn)介
LangChain-ChatGLM是一個(gè)基于ChatGLM等大預(yù)言模型的本地知識(shí)庫(kù)問答實(shí)現(xiàn),也就是一種利用 langchain 思想實(shí)現(xiàn)的基于本地知識(shí)庫(kù)的問答應(yīng)用,目標(biāo)期望建立一套對(duì)中文場(chǎng)景與開源模型支持友好、可離線運(yùn)行的知識(shí)庫(kù)問答解決方案。
項(xiàng)目地址:基于本地知識(shí)庫(kù)的 ChatGLM 等大語言模型應(yīng)用實(shí)現(xiàn)
項(xiàng)目特點(diǎn):
- 依托ChatGLM等開源模型實(shí)現(xiàn),可離線部署
- 基于langchain實(shí)現(xiàn),可快速實(shí)現(xiàn)接入多種數(shù)據(jù)源
- 在分句、文檔讀取等方面,針對(duì)中文使用場(chǎng)景優(yōu)化
- 支持PDF、txt、md、docx等文件類型接入,具備命令行demo、webui和vue前端。
項(xiàng)目結(jié)構(gòu):文章來源:http://www.zghlxwxcb.cn/news/detail-525950.html
- models:LLM的接口類和實(shí)現(xiàn)類,針對(duì)開源模型提供流式輸出支持。
- loader:文檔加載器的實(shí)現(xiàn)類
- textsplitter:文本切分的實(shí)現(xiàn)類
- chains:工作鏈路實(shí)現(xiàn),如chains/local_doc_qa實(shí)現(xiàn)了基于本地文檔的問答實(shí)現(xiàn)
- content:用于存儲(chǔ)上傳的原始文件
- vector_store:用于存儲(chǔ)向量庫(kù)文件、即本地知識(shí)庫(kù)本體
- configs:配置文件存儲(chǔ)
項(xiàng)目?jī)?yōu)化的方向:文章來源地址http://www.zghlxwxcb.cn/news/detail-525950.html
- 模型微調(diào):對(duì)LLM和embedding基于專業(yè)領(lǐng)域數(shù)據(jù)進(jìn)行微調(diào)
- 文檔加工:在文本分段后,對(duì)每段分別進(jìn)行總結(jié),基于總結(jié)內(nèi)容語義進(jìn)行匹配
- 借助不同模型能力:在text2sql、text2cpyher場(chǎng)景下需要產(chǎn)生代碼時(shí),可借助不同模型能力
相關(guān)資料
- LangChain 完整指南:使用大語言模型構(gòu)建強(qiáng)大的應(yīng)用程序
- 注冊(cè) Serpapi
到了這里,關(guān)于【大語言模型】15分鐘快速掌握LangChain以及ChatGLM的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!