Hello folks,我是 Luga,今天我們繼續來聊一下人工智能(AI)生態領域相關的技術 - LangChain ,本文將繼續聚焦在針對 LangChain 的技術進行剖析,使得大家能夠了解 LangChain 實現機制以便更好地對利用其進行應用及市場開發。
在日新月異的人工智能領域,語言模型已經成為舞臺主角,重新定義了人機交互的方式。ChatGPT 的廣泛認可以及 google 等科技巨頭紛紛推出類似產品,使語言模型,尤其是 LLM,成為科技界矚目焦點。
從某種意義上來講,LLM 代表了人工智能理解、解釋和生成人類語言能力的重大飛躍,經過海量文本數據的訓練,能夠掌握復雜的語言模式和語義細微差別。憑借前所未有的語言處理能力,LLM 可以幫助用戶以卓越的準確性和效率生成高質量內容。
而 LangChain 作為一個圍繞 LLM 構建的框架,為自然語言處理方面開辟了一個充滿可能性的新世界,可以創建各種應用程序,并能夠有效解決文本生成、情感分析以及語言翻譯等難題,極大地釋放了 LLM 的潛力。
一、什么是 LangChain ?
作為一款開源的 Python/ target=_blank class=infotextkey>Python 框架,LangChain 旨在促進基于 LLM 的應用程序開發。基于所提供了一套工具、組件和接口等套件,LangChain 簡化了以 LLM 為核心的應用程序的構建過程。通過 LangChain,開發人員能夠輕松管理與語言模型的交互,無縫連接不同的組件,并集成 API 和數據庫等資源。
此外,借助 LangChain 技術,我們能夠構建出一系列應用程序,這些應用程序能夠生成創新性且與上下文相關的內容。無論是撰寫博客文章、產品描述,與聊天機器人對話,還是生成問答(GQA)和摘要等,利用 LLM 的應用程序開發變得更加簡便高效。
圖:LangChain Github Star 歷史(由 star-history.com 生成)
從另一角度而言,這種基于 LangChain 的技術應用使得開發人員可以利用 LangChain 提供的強大語言模型能力,快速開發出符合用戶需求的應用,從而提升用戶體驗并節約開發時間和成本。
二、LLM 的局限性與 LangChain 的解決方案
在實際的場景中,LLM 擅長在常規上下文下對提示做出響應,但在未接受過訓練的特定領域卻會遇到挑戰。Prompts 則是人們用來引導 LLM 生成回復的查詢。為了讓 LLM 在特定領域發揮更佳效果,機器學習工程師需要將其與組織內部數據來源整合,并應用提示工程技術。
LangChain 的出現簡化了開發數據響應式應用程序的中間步驟,并提高了 Prompt Engineering 的效率。同時,提供了一套易用、直觀的工具和界面,使開發人員能夠輕松地將 LLM 與數據源和提示工程技術進行整合。
作為一項重要技術,那么,LangChain 具備哪些核心的優勢呢?
1.重新發揮語言模型的作用
借助 LangChain,組織可以將 LLM 的能力重新用于特定領域的應用程序,而無需重新培訓或微調。開發團隊可以構建引用專有信息的復雜應用程序,從而增強模型的響應能力。舉例來說,我們可以利用 LangChain 構建應用程序,從存儲的內部文檔中檢索數據,并將其整合為對話響應。我們還可以創建 RAG (檢索增強生成) 工作流程,在提示期間向語言模型引入新信息。通過實施 RAG 和其他上下文感知工作流程,可以減少模型產生的幻覺,提高響應的準確性。
2.簡化人工智能開發
LangChain 通過簡化數據源集成的復雜性并快速提煉,簡化了 AI 開發過程。開發人員可以自定義序列,快速構建復雜的應用程序。軟件團隊可以修改 LangChain 提供的模板和庫,以減少開發時間,而不必從頭編寫業務邏輯。
3.開發者支持
LangChain 為 AI 開發者提供了連接語言模型和外部數據源的工具。畢竟,它是開源的,并得到活躍社區的支持。組織可以免費使用 LangChain,并獲得其他熟悉該框架的開發人員的支持。
三、LangChain 的核心組件解析
LangChain 的獨特之處之一便是其靈活性和模塊化。通過將自然語言處理管道分解為單獨的組件,開發人員可以輕松混合和匹配這些構建塊,以創建滿足其特定需求的自定義工作流程,從而使得 LangChain 成為一個高度適應性的框架,可用于為廣泛的用例和行業構建對話式人工智能應用程序。
LangChain 是提供了一組模塊,能夠構建完整的 LLM(Language Model)應用程序管道,并與各種數據加載器、向量存儲和 LLM 提供程序等進行廣泛的集成。LangChain的主要核心組件可參考如下圖所示:
LangChain 關鍵組件
1.Model I/O
LangChain 的核心是強大的語言模型(LLM),使應用程序能夠理解和生成類似人類的文本。通過 LangChain,開發人員能夠出色地完成各種與語言相關的任務。無論是理解用戶查詢、生成響應,還是執行復雜的語言任務,LangChain 的模型都是語言處理能力的支柱。
Models 模塊負責管理與語言模型的交互。LangChain 支持一系列 LLM,包括 GPT-3、OpenAI 等。開發者可以使用 Models 模塊來管理 LLM 的配置,例如設置溫度、top-p 等參數。模型模塊對于提高 LLM 的能力并使開發人員能夠構建可生成創意和上下文相關內容的應用程序至關重要。
from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003")
# The LLM takes a prompt as an input and outputs a completion
prompt = "When can I achieve financial freedom?"
completion = llm(prompt)
2.Chains
Chains 模塊在應用程序中負責鏈接不同的組件,開發人員可以利用 Chains 模塊創建鏈式結構,將提示、模型和其他應用程序組件有機地連接在一起。這種鏈式結構對于構建需要多個組件協同工作的復雜應用程序至關重要。
通過 Chains 模塊,開發人員可以靈活組合和配置不同的組件,形成一個完整的應用程序管道,實現高度定制化的功能和邏輯。
chain = LLMChain(llm = llm,
prompt = prompt)
chain.run("ai")
3.Agents
Agents 模塊在應用程序中承擔了管理應用程序與外界之間交互的重要角色。通過使用 Agents 模塊,開發人員可以構建各種類型的應用程序,如個人助理、智能聊天機器人等。這些應用程序可以基于語音或文本輸入進行交互,并通過分析和理解輸入數據來提供相應的響應和服務。
Agents 模塊為開發人員提供了一個靈活、可擴展的工具,使他們能夠輕松構建具有交互功能的應用程序,為用戶提供個性化、智能化的體驗。
class Agent:
def __init__(self, config):
self.config = config
self.chain = Chain(config)
self.proxy = Proxy(config)
self.memory = Memory(config)
self.callback = Callback(config)
def parse_input(self, input):
# 解析用戶的輸入和上下文信息
...
4.Memory
LangChain 的 Memory 模塊承擔了數據存儲的管理任務。通過使用 Memory 模塊,開發人員可以輕松地存儲和檢索各種類型的數據,如文本、圖像、音頻等。
Memory 模塊提供了高度可擴展的存儲機制,可以適應不同規模和類型的數據存儲需求。開發人員可以根據應用程序的需要,靈活地組織和管理存儲的數據,以滿足應用程序的要求。
conversation = ConversationChain(llm=llm, verbose=True)
conversation.predict(input="I am the last one.")
conversation.predict(input="he is first.")
conversation.predict(input="She is third from the bottom")
5.Retrieval
以 Indexes 組件為例,Indexs 模塊在應用程序中承擔了數據索引的管理任務。開發人員可以利用 Indexs 模塊創建用于搜索和檢索數據的索引結構。Indexs 模塊對于構建需要進行數據搜索和檢索的應用程序至關重要。
使用 Indexs 模塊,開發人員可以根據應用程序的需求創建不同類型的索引,如文本索引、關鍵詞索引等。這些索引結構可以針對特定的數據屬性或特征進行優化,以實現更快速和精確的數據搜索和檢索。開發人員可以根據數據的特點和應用程序的需求,靈活地配置和管理索引結構。
retriever = db.as_retriever()
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True)
query = "Forgive me for my unruly, indulgent love of freedom in this life?"
result = qa({"query": query})
print(result['result'])
6.Calbacks
LangChain 提供了一個回調系統,使的我們能夠連接到 LLM 請求的不同階段。這個回調系統對于日志記錄、監控、流傳輸和其他任務非常有用。
通過使用這些回調函數,我們可以靈活地控制和管理 LLM 請求的各個階段。同時,還可以根據應用程序的需求,自定義回調函數的行為,以實現特定的功能和邏輯。
class BaseCallbackHandler:
"""Base callback handler that can be used to handle callbacks from langchain."""
def on_llm_start(
self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any
) -> Any:
"""Run when LLM starts running."""
def on_chat_model_start(
self, serialized: Dict[str, Any], messages: List[List[BaseMessage]], **kwargs: Any
) -> Any:
"""Run when Chat Model starts running."""
def on_llm_new_token(self, token: str, **kwargs: Any) -> Any:
"""Run on new LLM token. Only available when streaming is enabled."""
通過對上述關鍵組件的解析,我們可以大致了解 LangChain 的工作原理和流程,即將 Agents、Memory、Indexs 和回調系統等關鍵組件結合起來,實現應用程序與外界的交互、數據的存儲和索引,以及自定義操作的執行。
這種組合使得 LangChain 能夠構建出強大、靈活的應用程序,為用戶提供個性化、智能化的體驗。具體可參考如下工作流:
LLM LangChain 工作流程
四、使用 LangChain 進行 LLM 應用程序構建
在開始之前,我們需要確保正確安裝 LangChain 的軟件包,并按照指南進行設置和配置。這包括安裝所需的編程語言環境(如Python)、安裝 LangChain 的相關庫和依賴項,并進行必要的配置和設置,以確保 LangChain 可以正常運行。
一旦安裝和設置完成,我們可以開始導入和使用 LLM。為了有效使用 LLM,我們需要導入適當的庫和依賴項,以便在應用程序中能夠調用和使用 LLM 的功能。
1.設置 LangChain
這里,主要為 LangChain 環境設置相關的依賴庫,具體可參考如下:
import langchain
import openai
import os
import IPython
from langchain.llms import OpenAI
from dotenv import load_dotenv
from langchain.chat_models import ChatOpenAI
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import LLMChain
from langchain.chains import RetrievalQA
from langchain import ConversationChain
load_dotenv()
# API configuration
openai.api_key = os.getenv("OPENAI_API_KEY")
2.初始化 LLM
要在 LangChain 中初始化 LLM,首先需要導入必要的庫和依賴項。如果大家使用 Python 編程語言,我們可以導入名為 "langchain" 的庫,并指定要使用的語言模型。
以下是一個示例代碼片段,展示了如何導入 "langchain" 庫和初始化 LLM,具體可參考:
# 導入必要的庫和依賴項
import langchain
# 指定要使用的語言模型
language_model = "gpt3.5-turbo" # 這里使用 GPT-3.5 Turbo 模型作為示例
# 初始化 LLM
llm = langchain.LLM(language_model)
# 接下來,可以使用 llm 對象來調用和使用 LLM 的各種功能和方法
# 例如,可以使用 llm.generate() 方法生成文本,或使用 llm.complete() 方法進行自動補全等
# 示例:使用 LLM 生成文本
prompt = "Hello, LangChain!"
response = llm.generate(prompt)
print(response)
3.輸入 Prompts
初始化 LLM 后,我們可以通過輸入提示來生成文本或獲取響應。Prompts 是語言模型生成文本的起點。根據需求,我們可以提供單個或多個 Prompts。以下是一個簡單的示例:
# 初始化 LLM
llm = langchain.LLM(language_model)
# 提供單個提示
prompt = "Once upon a time"
response = llm.generate(prompt)
print(response)
# 提供多個提示
prompts = [
"The sun is shining",
"In a galaxy far, far away",
"Once upon a time"
]
responses = llm.generate(prompts)
for response in responses:
print(response)
4.檢索生成的文本或響應
輸入 Prompts 后,我們可以從 LLM 中檢索生成的文本或響應。生成的文本或響應將基于所提供的 Prompts,以及語言模型所具備的上下文理解和語言生成的功能。
當我們提供一個或多個 Prompts 時,LLM 會使用這些 Prompts 作為起點,并借助語言模型的能力來生成相關的文本。語言模型會考慮 Prompts 中的上下文信息,以及其在訓練數據中學習到的語言規律和概率分布。這樣,生成的文本將會在一定程度上與 Prompts 相關,并且具備一定的語法合理性和連貫性。
# Print the generated text
print(generated_text)
# Print the responses
for response in responses:
print(response)
總而言之,通過遵循上述步驟并實現相應的代碼,我們可以無縫地使用 LangChain 和預訓練的 LLM,充分利用它們在文本生成和理解任務上的能力。這為我們解決各種自然語言處理問題提供了一種高效且靈活的方法。無論是開發智能對話系統、構建文本生成應用,還是進行文本理解和分析,LangChain 和預訓練的 LLM 都將成為有力的工具和技術基礎。
綜上所述,在構建支持 LLM 的應用程序方面,LangChain 為我們開辟了一個充滿無限可能性的世界。如果大家對文本完成、語言翻譯、情感分析、文本摘要或命名實體識別等領域感興趣,LangChain 提供了直觀易用的平臺和強大的 API,讓我們的想法轉化為現實。
借助 LangChain 和 LLM 的強大能力,我們可以創建出具備理解和生成類人文本能力的智能應用程序,從而徹底改變我們與語言交互的方式。
Reference :
- [1] https://python.langchain.com/
- [2] https://machinehack.com/story/langchain-to-build-llm-powered-Applications