LangChain 提供了簡化的 API 互動和工作流程管理,讓開發者更容易使用大語言模型(LLM)。它支援批次請求和非同步處理,有效提升 API 呼叫效率。透過提示範本和 LangChain Expression Language (LCEL),開發者可以更彈性地控制 LLM 互動流程,簡化複雜應用程式的開發。文章也示範瞭如何使用 LangChain 建立商業名稱生成器,結合 ChatOpenAI 生成創意名稱,展現 LangChain 在實際應用中的價值。此方法可應用於其他需要動態內容生成的場景,例如社群媒體文案或產品描述。

ChatOpenAI 的使用

要使用 ChatOpenAI,首先需要匯入相關的類別,包括 ChatOpenAIAIMessageHumanMessageSystemMessage。然後,建立一個 ChatOpenAI 例項,並設定其溫度引數(randomness)為 0.5。

chat = ChatOpenAI(temperature=0.5)

接下來,建立一個訊息列表,包含一個 SystemMessage 物件,定義了 LLM 的角色,以及一個 HumanMessage 物件,要求一個與軟體工程師相關的笑話。

messages = [SystemMessage(content='''Act as a senior software engineer
at a startup company.'''),
HumanMessage(content='''Please can you provide a funny joke
about software engineers?''')]

然後,呼叫 chat.invoke() 方法,傳入訊息列表作為輸入引數,以獲得 LLM 的回應。

response = chat.invoke(input=messages)

或者,也可以使用 legacy 方法直接呼叫 chat 物件:

response = chat(messages=messages)

流式聊天模型

流式聊天模型(Streaming Chat Models)是一種可以實時生成文字的模型,它可以一字元一字元地傳回文字,從而提高聊天應用的效能。

for chunk in chat.stream(messages):
    print(chunk)

流式聊天模型可以減少使用者等待時間,提高使用者互動性和降低延遲。然而,它也帶來了一些挑戰,例如解析輸出結果和適當地回應訊息。

建立多個 LLM 生成

在某些情況下,建立多個 LLM 生成可能是有用的,例如建立動態內容,如社交媒體帖子。這可以透過提供訊息列表的列表來實作。

synchronous_llm_result = chat.batch([messages]*2)
print(synchronous_llm_result)

這將傳回一個包含多個 LLM 回應的列表,每個回應對應於輸入訊息列表中的每個訊息。

使用 LangChain 進行批次請求和非同步處理

在 LangChain 中,批次請求和非同步處理是兩個重要的功能,可以幫助您提高 API 請求的效率和減少延遲時間。下面,我們將探討如何使用 batch() 方法進行批次請求和非同步處理。

使用 batch() 方法進行批次請求

batch() 方法允許您將多個 API 請求合併成一個請求,這樣可以減少 API 請求的數量和延遲時間。以下是使用 batch() 方法的範例:

config = RunnableConfig(max_concurrency=5)
results = chat.batch([messages, messages], config=config)

在這個範例中,我們建立了一個 RunnableConfig 物件,並設定 max_concurrency 引數為 5。然後,我們使用 batch() 方法將兩個 messages 列表合併成一個請求。

使用非同步處理進行 API 請求

LangChain 中的非同步處理功能允許您同時傳送多個 API 請求,而不需要等待前一個請求完成。以下是使用非同步處理的範例:

results = chat.ainvoke([messages, messages])

在這個範例中,我們使用 ainvoke() 方法將兩個 messages 列表合併成一個請求。ainvoke() 方法會傳回一個非同步結果,您可以使用 await 關鍵字等待結果。

LangChain 提示範本

LangChain 提示範本是一種方便的方式,用於生成可重複使用的提示。以下是使用 LangChain 提示範本的範例:

from langchain_core.prompts import SystemMessagePromptTemplate

template = SystemMessagePromptTemplate(
    template="What is the best way to learn coding in {language}?",
    input_variables=["language"]
)

prompt = template.format(language="Python")
print(prompt)  # What is the best way to learn coding in Python?

在這個範例中,我們建立了一個 SystemMessagePromptTemplate 物件,並定義了一個提示範本。然後,我們使用 format() 方法將 language 變數替換為 “Python”。

LangChain Expression Language (LCEL)

LCEL 是 LangChain 中的一種表示式語言,允許您將不同的元件連結起來,形成一個複雜的資料處理管道。以下是使用 LCEL 的範例:

chain = prompt | model

在這個範例中,我們使用 | 運算子將 promptmodel 元件連結起來。prompt 元件的輸出將作為 model 元件的輸入。

商業名稱生成器

以下是使用 LangChain 提示範本和 LCEL 的商業名稱生成器範例:

from langchain_openai.chat_models import ChatOpenAI
from langchain_core.prompts import (SystemMessagePromptTemplate, ChatPromptTemplate)

template = SystemMessagePromptTemplate(
    template="Generate {num} business names for a company that {description}",
    input_variables=["num", "description"]
)

prompt = template.format(num=5, description="provides AI solutions")
chain = prompt | ChatOpenAI()
results = chain.invoke()
print(results)  # ["AI Solutions Inc.", "AI Tech Corp.",...]

在這個範例中,我們建立了一個 SystemMessagePromptTemplate 物件,並定義了一個提示範本。然後,我們使用 format() 方法將 numdescription 變數替換為 5 和 “provides AI solutions”。最後,我們使用 LCEL 將 promptChatOpenAI 元件連結起來,並呼叫 invoke() 方法生成商業名稱。

  1. MedAIx
  2. HealthGenie
  3. CureHub
  4. AIcarePro
  5. MedMindLab

使用LangChain進行商業名稱生成

LangChain是一個強大的工具,能夠幫助我們生成商業名稱。以下是使用LangChain進行商業名稱生成的步驟:

步驟1:匯入必要的模組

首先,我們需要匯入必要的模組,包括ChatOpenAISystemMessagePromptTemplateChatPromptTemplate

步驟2:定義提示範本

接下來,我們需要定義一個提示範本,該範本包含特定的指導方針,指示LLM生成商業名稱。例如:

template = '''
您是一個創意顧問,正在為一家新公司想出名稱。
請生成5-7個吸引人的名稱選擇。
'''

步驟3:建立聊天物件

然後,我們需要建立一個聊天物件,使用ChatOpenAI()初始化聊天物件。

步驟4:建立提示範本

接下來,我們需要建立一個提示範本,使用SystemMessagePromptTemplate.from_template(template)ChatPromptTemplate.from_messages([system_prompt])

步驟5:呼叫LLM

然後,我們需要呼叫LLM,使用invoke()方法替換提示範本中的佔位符。

步驟6:提取LLM的回應

最後,我們需要提取LLM的回應,使用.content屬性存取結果變數。

ChatOpenAI 與 LangChain 使用總結與展望

從底層 API 呼叫到高階應用框架的全面檢視顯示,ChatOpenAI 與 LangChain 的結合為開發者提供了強大的自然語言處理能力。本文深入探討了 ChatOpenAI 的基本使用方法,包括訊息傳遞、流式輸出和批次生成,並進一步闡述瞭如何利用 LangChain 進行批次請求、非同步處理、提示範本設計和 LCEL 表示式語言的應用,甚至展示了商業名稱生成器的實務案例。

透過多維度效能指標的實測分析,LangChain 的批次請求和非同步處理機制顯著提升了 API 呼叫效率,降低了延遲,尤其在處理大量請求時效果更為明顯。然而,提示範本設計的精細度直接影響生成結果的品質,需要開發者根據實際需求不斷調整和最佳化。LCEL 的引入簡化了複雜工作流程的構建,但其靈活性也伴隨著一定的學習成本。商業名稱生成器的案例則展現了 LangChain 在實際應用中的巨大潛力,但仍需考量生成結果的多樣性和獨特性。

展望未來,隨著模型的持續進化和 LangChain 功能的日益豐富,自然語言處理技術的應用場景將更加廣闊。預計未來3-5年,根據提示工程的開發模式將成為主流,而 LangChain 作為重要的開發框架,其生態系統也將日趨完善。同時,LCEL 的表達能力將進一步提升,更複雜、更精細的自然語言處理任務將得以實作。密切關注這些新興使用案例,它們很可能重新定義整個技術領域的價值。玄貓認為,LangChain 已展現出足夠的成熟度,值得關注效率和開發體驗的團隊深入研究和應用。