LangChain(0.0.339)官方文檔一:快速入門

LangChain官網、LangChain官方文檔 、langchain Github、langchain API文檔、llm-universe

文章目錄

    • 一、LangChain簡介(v0.0.338)
      • 1.1 整體框架
      • 1.2 主要組件
        • 1.2.1 Model I/O
        • 1.2.2 Retrieval
          • 1.2.2.1 RAG
          • 1.2.2.2 Retrieval
        • 1.2.3 Chain
      • 1.3 其它組件
        • 1.3.1 Meomory
        • 1.3.2 Agents
        • 1.3.3 Callback
      • 1.4 資源
      • 1.5 安裝
    • 二、快速開始(zhipu)
      • 2.1 環境準備
      • 2.2 直接調用openai API
      • 2.3 使用 LangChain 調用OpenAI API(LCEL)
        • 2.3.1 最簡示例
        • 2.3.2 Prompt templates
        • 2.3.3 Output parsers
        • 2.3.4 使用LCEL組合成鏈
      • 2.4 使用 LangChain 調用OpenAI(Chain)
      • 2.5 使用 LangSmith 進行跟蹤
      • 2.6 使用 LangServe進行部署
      • 2.7 playground
      • 2.8 Client

一、LangChain簡介(v0.0.338)

1.1 整體框架

LangChain是一個用于開發由語言模型驅動的應用程序的框架。它使得應用程序具備以下特點:

  1. 上下文感知(context-aware):連接語言模型與上下文來源(提示說明、少量示例、用于構建響應的內容等)。
  2. 推理(Reason):依賴語言模型進行推理(根據提供的上下文考慮如何回答,采取什么行動等)。

該框架包括幾個部分:

  • LangChain庫:Python和JavaScript庫。包含用于各種組件的接口和集成,用于將這些組件組合成鏈和代理的基本運行時,以及鏈和代理的現成實現。
  • LangChain Templates:提示模板,一系列易于部署的參考體系結構,適用于各種任務。
  • LangServe:一個用于將LangChain鏈部署為REST API的庫。
  • LangSmith:一個開發者平臺,允許您在任何LLM框架上調試、測試、評估和監視構建在LangChain上的鏈,并與LangChain無縫集成。

在這里插入圖片描述
這些產品共同簡化整個應用程序生命周期:

  • 開發:使用LangChain/LangChain.js編寫您的應用程序。通過使用Templates進行參考,迅速入門。
  • 投產:使用LangSmith檢查、測試和監控您的鏈,以便您可以不斷改進并放心地部署。
  • 部署:使用LangServe將任何鏈轉化為API。

下面開始介紹LangChain的主要組件,每一個都有標準的、可擴展的接口和集成。

1.2 主要組件

1.2.1 Model I/O

??任何語言模型應用的核心要素就是模型,LangChain為您提供了與任何語言模型進行接口的構建模塊 Model I/O。

  1. Prompts:模板化、動態選擇和管理模型輸入。

  2. Chat models:由語言模型支持,但接受聊天消息列表作為輸入并返回聊天消息的模型。

  3. LLMs:接受文本字符串作為輸入并返回文本字符串的模型。

  4. Output parsers:輸出解析器,從模型輸出中提取信息。
    在這里插入圖片描述

??在LangChain框架中LLMs是指純文本模型,其API接受一個字符串提示并生成一個字符串完成。Chat models指的是在LLMs上專門經過對話微調的聊天模型,輸入不是單個字符串,而是一個包含聊天消息列表的結構,通常帶有說話者的標簽,而輸出是一個AI聊天消息。

1.2.2 Retrieval

參考《Kaggle - LLM Science Exam(二):Open Book QA&debertav3-large詳解》、《NLP(廿一):從 RAG 到 Self-RAG —— LLM 的知識增強》、《How do domain-specific chatbots work? An Overview of Retrieval Augmented Generation (RAG)》

1.2.2.1 RAG

??大語言模型(Large Language Model, LLM),比如 ChatGPT ,可以回答許多不同的問題。但是大語言模型的知識來源于其訓練數據集,并沒有用戶的信息(比如用戶的個人數據,公司的自有數據),也沒有最新發生時事的信息(在大模型數據訓練后發表的文章或者新聞)。因此大模型能給出的答案比較受限。

??RAG(Retrieval Augmented Generation, 檢索增強生成),即 LLM 在回答問題或生成文本時,先會從大量文檔中檢索出相關的信息,然后基于這些信息生成回答或文本,從而提高預測質量。RAG 方法使得開發者不必為每一個特定的任務重新訓練整個大模型,只需要外掛上知識庫,即可為模型提供額外的信息輸入,提高其回答的準確性。RAG模型尤其適合知識密集型的任務。

在 LLM 已經具備了較強能力的基礎上,仍然需要 RAG ,主要有以下幾點原因:

  • 幻覺問題:LLM 文本生成的底層原理是基于概率的 token by token 的形式,因此會不可避免地產生“一本正經的胡說八道”的情況。RAG基于知識源的事實內容,可減少幻覺。
  • 時效問題:LLM 的規模越大,大模型訓練的成本越高,周期也就越長。那么具有時效性的數據也就無法參與訓練,所以也就無法直接回答時效性相關的問題,例如“幫我推薦幾部熱映的電影?”。RAG可以輕松擴展知識,減少模型大小和訓練成本。
  • 數據安全問題:通用的 LLM 沒有企業內部數據和用戶數據,那么企業想要在保證安全的前提下使用 LLM,最好的方式就是把數據全部放在本地,企業數據的業務計算全部在本地完成。而在線的大模型僅僅完成一個歸納的功能。
  • 可擴展性:RAG 可以針對多種任務進行微調和定制,包括QA、文本摘要、對話系統等。
  • 可解釋性 (Interpretability):檢索到的項目作為模型預測中來源的參考

整個RAG pipeline可以表示為:
在這里插入圖片描述

  1. 為知識庫構建索引

    • 獲取知識源(knowledge base),使用一個加載器(loader)將其轉化為單獨的文檔(Document
    • 使用分割器(splitters )將其分成易于處理的小塊或片段(document snippets)。
    • 將這些片段傳遞給嵌入式機器(embedding machine),將其轉化為可用于語義搜索的向量。
    • 將這些片段的embedding保存在我們的矢量數據庫中(vector database),同時保留它們的文本片段。
  2. 檢索
    將 問題/任務 輸入相同的嵌入式機器得到其嵌入表示,并傳遞到我們的矢量數據庫。然后通過檢索得到最匹配的片段,這些片段就是問題最相關的上下文(context),可用于增強LLM生成的回答或響應。

  3. 加強型的答案生成(augmented answer generation)
    將獲取的相關知識片段,與自定義系統提示和問題進行合并,然后一起格式化,并最終得到基于相關上下文的問題答案。

1.2.2.2 Retrieval

??為了支持上述應用的構建,LangChain 的Retrieval模塊通過以下方式提供組件來加載、轉換、存儲和查詢數據,實現數據連接(Data connection)Document loadersDocument transformersText embedding modelsVector stores 以及 Retrievers。數據連接模塊部分的基本框架如下圖所示。
在這里插入圖片描述
Document loaders:LangChain提供了超過100種不同的文檔加載器,可加載所有類型的文檔(HTML、PDF、代碼)。

Document transformers:文檔變換的主要部分是Text splitters,此外還有去除冗余內容、翻譯、添加元數據等功能。
在RAG中,原始的文檔可能涵蓋很多內容,內容越多,整個文檔的embedding就越“不具體”(unspecific),檢索算法就越難檢索到到最相似的結果。通常情況下,用戶提問的主題只是和頁面中的某些文本相匹配,所以我們需要將文檔拆分成embeddable chunks,便于搜索。另外文檔拆分也是一門技術, 拆分后的snippets太大不能很好地匹配查詢,太小會沒有足夠有用的上下文來生成答案。此外還涉及如何拆分(通常有標題時按標題進行拆分)等等問題。一旦我們有了文檔片段,我們就將它們保存到我們的矢量數據庫中,下面是為知識庫編制索引的完整圖片:
在這里插入圖片描述

Text embedding models:檢索的另一個關鍵部分是為文檔創建嵌入。LangChain提供與超過25種不同的embedding providers and methods,從開源到專有API。

Vector stores:LangChain集成了超過50種不同的vectorstores,從開源的本地存儲到云端專有存儲,以支持數據庫的高效存儲和檢索。

Retrievers:LangChain支持許多不同的檢索算法,這也是LangChain最有價值的地方之一。基本方法有簡單的語義搜索,此外還有一些改進算法,包括:

  • Parent Document Retriever:父文檔檢索器。允許您為每個父文檔創建多個嵌入,使您能夠查找較小的塊但返回較大的上下文。
  • Self Query Retriever:自查詢檢索器。用戶的問題通常包含對某些不僅僅是語義的內容的引用,而是表達某種邏輯的元數據過濾器。自查詢允許您從查詢中提取出查詢的語義部分,而不包括其他存在于查詢中的元數據過濾器。
  • Ensemble Retriever:組合檢索器。有時您可能希望從多個不同的來源或使用多個不同的算法中檢索文檔。組合檢索器使您能夠輕松實現此目標。
1.2.3 Chain

??在簡單的應用中,單獨使用LLM是可以的,但在更復雜的應用中,可能需要將多個大型語言模型進行鏈式組合,或與其他組件進行鏈式調用,以對多個輸入同時進行處理。Chain允許將多個組件組合在一起,創建一個單一的、連貫的應用程序。例如,可以創建一個鏈,接受用戶輸入,使用 PromptTemplate 對其進行格式化,然后將格式化后的提示詞傳遞給大語言模型。你也可以通過將多個鏈組合在一起或將鏈與其他組件組合來構建更復雜的鏈。

??我們支持許多有用的內置 Chain,比如LLMChain(基本的鏈類型)、SequentialChain(處理單個輸入且單個輸出的情況)、Router Chain(同一輸入router到不同的輸出)。

??除了使用傳統的Chain接口,LangChain還提供了最新的LCEL(LangChain Expression Language)框架來實現chaining,詳見其文檔。

1.3 其它組件

1.3.1 Meomory

??在 LangChain 中,記憶(Memory)指的是大語言模型(LLM)的短期記憶。為什么是短期記憶?那是因為LLM訓練好之后 ,獲得了一些長期記憶,它的參數便不會因為用戶的輸入而發生改變。當用戶與訓練好的LLM進行對話時,LLM 會暫時記住用戶的輸入和它已經生成的輸出,以便預測之后的輸出。而模型輸出完畢后,它便會“遺忘”之前用戶的輸入和它的輸出。因此,之前的這些信息只能稱作為 LLM 的短期記憶。

??Chains和Agents默認是無狀態的,它們并不記憶你之前的交流內容,但在某些應用中,如聊天機器人,記住先前的互動很重要。為此,LangChain提供了memory組件,以管理和操作先前的聊天消息。這些組件可以靈活地嵌入Chains中,并通過獨立函數或Chains方式使用。

??memory類型可以返回字符串或消息列表,用于提取信息,比如最近的N條消息或所有先前消息的摘要。最簡單的內存類型是buffer memory,用來保留先前的所有消息。

在這里插入圖片描述

1.3.2 Agents

??大型語言模型(LLMs)非常強大,但它們缺乏“最笨”的計算機程序可以輕松處理的特定能力。LLM 對邏輯推理、計算和檢索外部信息的能力較弱,這與最簡單的計算機程序形成對比。例如,語言模型無法準確回答簡單的計算問題,還有當詢問最近發生的事件時,其回答也可能過時或錯誤,因為無法主動獲取最新信息。這是由于當前語言模型僅依賴預訓練數據,與外界“斷開”。要克服這一缺陷, LangChain 框架提出了 “代理”( Agent ) 的解決方案。代理作為語言模型的外部模塊,可提供計算、邏輯、檢索等功能的支持,使語言模型獲得異常強大的推理和獲取信息的超能力

在這里插入圖片描述

1.3.3 Callback

??LangChain提供了一個Callbacks(回調系統),允許您連接到LLM應用程序的各個階段。這對于日志記錄、監視、流式處理和其他任務非常有用

Callback 模塊扮演著記錄整個流程運行情況的角色,充當類似于日志的功能。在每個關鍵節點,它記錄了相應的信息,以便跟蹤整個應用的運行情況。例如,在 Agent 模塊中,它記錄了調用 Tool 的次數以及每次調用的返回參數值。Callback 模塊可以將收集到的信息直接輸出到控制臺,也可以輸出到文件,甚至可以傳輸到第三方應用程序,就像一個獨立的日志管理系統一樣。通過這些日志,可以分析應用的運行情況,統計異常率,并識別運行中的瓶頸模塊以進行優化。

Callback 模塊的具體實現包括兩個主要功能:

  • CallbackHandler :記錄每個應用場景(如 Agent、LLchain 或 Tool )的日志,它是單個日志處理器,主要記錄單個場景的完整日志信息。
  • CallbackManager:封裝和管理所有的 CallbackHandler ,包括單個場景的處理器,也包括整個運行時鏈路的處理器。"

1.4 資源

  1. 常見示例:
    • 文檔問答:Retrieval-augmented generation(RAG)
    • 聊天機器人:Chatbots
    • 分析結構化數據:SQL
  2. prompt-engineering-for-developers:基于基于吳恩達老師的五門課程打造,包括《ChatGPT Prompt Engineering for Developers》、《Building Systems with the ChatGPT API》、《LangChain for LLM Application Development》等。
  3. 社區:
  4. 博客:優秀文章,例如《LangChain Templates》

1.5 安裝

  1. pip安裝

    pip install langchain
    
  2. conda安裝

    conda install langchain -c conda-forge
    
  3. 源碼安裝

    git clone https://github.com/langchain-ai/langchain.git
    cd langchain
    pip install -e .
    

另外還有一些擴展功能,需要單獨安裝依賴:

  • langchain-experimental:包含實驗性 LangChain 代碼,旨在用于研究和實驗用途

    pip install langchain-experimental
    
  • LangServe:幫助開發人員將 LangChain 可運行對象和鏈部署為 REST API。 LangServe由LangChain CLI自動安裝,如果不使用 LangChain CLI,請運行:

    pip install "langserve[all]"
    
  • LangChain CLI :對于使用 LangChain 模板和其他 LangServe 項目非常有用

    pip install langchain-cli
    

二、快速開始(zhipu)

參考《LangChain:LLM應用程序開發(上)——Models、Prompt、Parsers、Memory、Chains》、LangChain文檔《Quickstart》

2.1 環境準備

??本次代碼演示還是按照官方文檔一樣使用openai API,畢竟文檔示例很多地方都是使用這個,改成別的API太麻煩。

??我之前注冊chatgpt送的額度已經用完了,不過可以在x-api注冊,免費贈送10000額度,其api_key一樣可用于openai API的調用。另外在kaggle notebook中寫代碼,這樣注冊和代碼執行都不需要魔法。

注冊完之后,在notebook上方Add-ons中添加API key,就不用直接寫在代碼中了。

??在使用 LangChain 構建的應用程序中,隨著復雜性的增加,了解鏈或代理內部發生了什么變得非常重要。最佳方法是使用 LangSmith 來檢查。首先在 LangSmith官網進行注冊,然后設置環境變量以開始記錄跟蹤:

export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY=...

??LangServe 幫助開發者將 LangChain 鏈部署為 REST API,本章中,我們也將展示如何使用 LangServe 部署應用。

2.2 直接調用openai API

參考《ChatLLM API分發》

!pip install -q langchain==0.0.339
!pip install  -q openai==0.28   		# 使用此分發的必須是openai舊版本
import openai,os
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()
openai.api_key = user_secrets.get_secret("openai") 
openai.api_base = "https://api.chatllm.vip/v1"
messages = [{"role": "user","content": '你是誰',},]
openai.ChatCompletion.create(model="gpt-3.5-turbo-0301", messages=messages)
<OpenAIObject chat.completion id=chatcmpl-8O9BYKPsEXTVjmCx5GEg7rDFolKPt at 0x7ef2702d3b50> JSON: {"id": "chatcmpl-8O9BYKPsEXTVjmCx5GEg7rDFolKPt","object": "chat.completion","created": 1700765872,"model": "gpt-3.5-turbo-0301","choices": [{"index": 0,"message": {"role": "assistant","content": "\u6211\u662f\u8fd9\u4e2a\u5e73\u53f0\u4e0a\u7684AI\u865a\u62df\u52a9\u624b\u3002"},"finish_reason": "stop"}],"usage": {"prompt_tokens": 12,"completion_tokens": 17,"total_tokens": 29}
}

2.3 使用 LangChain 調用OpenAI API(LCEL)

2.3.1 最簡示例

LangChain實現其功能最主要的三個組件是:

  • LLM/Chat Model:LangChain核心推理引擎。
  • Prompt Template:為語言模型提供說明,控制語言模型的輸出內容。
  • Output Parser:將來自語言模型的原始響應轉換為更可行的格式,從而便于在下游使用輸出

??之前說過,LLM 輸入和輸出都是字符串,而Chat Model輸入聊天消息列表,輸出AI消息。在langchain中,消息接口由 BaseMessage 定義,它有兩個必需屬性:

  • content :消息的內容。通常為字符串。
  • role :消息來源(BaseMessage)的實體類別,比如:
    • HumanMessage:來自人類/用戶的BaseMessage。
    • AIMessage:來自AI/助手的BaseMessage。
    • SystemMessage:來自系統的BaseMessage。
    • FunctionMessage / ToolMessage:包含函數或工具調用輸出的BaseMessage。
    • ChatMessage:如果上述角色都不合適,可以自定義角色。

??調用 LLM 或 ChatModel 的最簡單方法是使用 .invoke() 方法,這是 LangChain 表達式語言(LCEL)所有對象的通用同步調用方法:

  • LLM.invoke:接收字符串,返回字符串。
  • ChatModel.invoke:接收 BaseMessage 列表,返回 BaseMessage。

??這些方法的輸入類型實際上比這更通用,但為了簡單起見,我們可以假設 LLM 只接受字符串,而聊天模型只接受消息列表。下面,讓我們先導入一個 LLM 和一個 ChatModel。

# 將openai.api_key和openai.api_base配置到環境變量中import openai,os
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()os.environ["OPENAI_API_KEY"] = user_secrets.get_secret("openai") 
os.environ["OPENAI_API_BASE"] = "https://api.chatllm.vip/v1"
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAIllm = OpenAI()
chat_model = ChatOpenAI()

開始調用:

from langchain.schema import HumanMessagetext = "What would be a good company name for a company that makes colorful socks?"
messages = [HumanMessage(content=text)]
llm.invoke(text)                           # 輸出:Feetful of Funchat_model.invoke(messages)			       # 輸出:AIMessage(content="Socks O'Color")
2.3.2 Prompt templates

??大語言模型(LLM)的應用程序通常不會直接將用戶輸入傳入模型,相反,它們會將用戶輸入添加提示模板中,以便為當前任務提供額外上下文。

??在上一個例子中,我們向模型傳遞輸入是生成公司名稱的完整指示,如果簡化這一輸入,用戶只需要提供公司/產品的描述,而不需要編寫完整的指令,會更方便。

from langchain.prompts import PromptTemplateprompt = PromptTemplate.from_template("What is a good name for a company that makes {product}?")
prompt.format(product="colorful socks")
What is a good name for a company that makes colorful socks?

??PromptTemplate還可用于生成消息列表。在這種情況下,提示不僅包含有關內容的信息,還包括每條消息的角色和其在消息列表中的位置。最常見的實現方式是使用ChatPromptTemplate,它是一個包含多條ChatPromptTemplate的列表。每個ChatPromptTemplate都包含如何格式化該聊天消息的指示,包括其角色和內容。通過這種方式,可以方便地生成包含多個消息的列表。

from langchain.prompts.chat import ChatPromptTemplatetemplate = "You are a helpful assistant that translates {input_language} to {output_language}."
human_template = "{text}"chat_prompt = ChatPromptTemplate.from_messages([("system", template),("human", human_template),
])chat_prompt.format_messages(input_language="English", output_language="French", text="I love programming.")
[SystemMessage(content="You are a helpful assistant that translates English to French.", additional_kwargs={}),HumanMessage(content="I love programming.")
]

??以上這些任務模板可以重復使用,加入更多的變量來進行組合控制,還可以適應更多的任務。有關此部分更詳細的內容,請查看Prompt templates。

from langchain.schema import HumanMessagetext = "What would be a good company name for a company that makes colorful socks?"
messages = [HumanMessage(content=text)]
zhipuai_model.invoke(messages)
'" A good company name for a company that makes colorful socks could be \\"Sockscape\\". This name conveys the idea of a vibrant and diverse world of socks while also incorporating the word \\"scape\\", which implies a lively and picturesque environment."'
2.3.3 Output parsers

OutputParser 主要有幾種類型,包括:

  • 將LLM輸出的文本轉換為結構化信息(如 JSON)
  • 將 ChatMessage 轉換為僅包含文本的字符串
  • 將message之外的其他返回信息(如 OpenAI 函數調用)轉換為字符串

更多內容詳見Output Parser。下面只是簡單地編寫一個輸出解析器,將LLM輸出的字符串轉換為列表(逗號分割)

from langchain.schema import BaseOutputParserclass CommaSeparatedListOutputParser(BaseOutputParser):"""Parse the output of an LLM call to a comma-separated list."""def parse(self, text: str):"""Parse the output of an LLM call."""return text.strip().split(", ")CommaSeparatedListOutputParser().parse("hi, bye")  # 輸出['hi', 'bye']
2.3.4 使用LCEL組合成鏈

??我們現在可以將所有這些組合成一個鏈條。這個鏈條將接受輸入變量,將這些變量傳遞給提示模板以創建提示,然后將提示傳遞給語言模型,最后將輸出通過(可選)輸出解析器進行解析。

from typing import Listfrom langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema import BaseOutputParserclass CommaSeparatedListOutputParser(BaseOutputParser[List[str]]):"""Parse the output of an LLM call to a comma-separated list."""def parse(self, text: str) -> List[str]:"""Parse the output of an LLM call."""return text.strip().split(", ")template = """You are a helpful assistant who generates comma separated lists.
A user will pass in a category, and you should generate 5 objects in that category in a comma separated list.
ONLY return a comma separated list, and nothing more."""
human_template = "{text}"chat_prompt = ChatPromptTemplate.from_messages([("system", template),("human", human_template),
])
chain = chat_prompt | ChatOpenAI() | CommaSeparatedListOutputParser()
chain.invoke({"text": "colors"})
['red', 'blue', 'green', 'yellow', 'orange']

??上述代碼中,我們使用語法 | 將這些組件連接在一起。此 | 語法由 LangChain 表達式語言 (LCEL) 提供支持,并依賴于其通用的 Runnable 接口。

2.4 使用 LangChain 調用OpenAI(Chain)

參考《Chains》、《LangChain:LLM應用程序開發(上)——Models、Prompt、Parsers、Memory、Chains》

??在1.2.3節中講過,鏈的實現有兩種方式:Chain和LCEL。下面使用傳統的Chain方式實現一遍。LLMChain是最基本的鏈類型,會經常使用。它接收一個提示模板,用于將用戶輸入進行格式化,然后從LLM返回響應。

from langchain.chains import LLMChainchain = LLMChain(llm=chat_model, prompt=chat_prompt, output_parser=CommaSeparatedListOutputParser())
chain.run(text="colors")

??此外還有SequentialChainRouter Chain等,以及 Prompt templatesOutput parsers更多使用示例,可參考《LangChain:LLM應用程序開發(上)——Models、Prompt、Parsers、Memory、Chains》。

2.5 使用 LangSmith 進行跟蹤

??在2.1節中,我們已經設置好環境變量,那么運行時所有模型和鏈調用都將自動記錄到 LangSmith 中。隨后,我們可以使用LangSmith添加鏈接描述來調試和注釋我們的應用程序跟蹤,并將它們轉換為評估未來應用程序版本的數據集。點擊此處,可以查看上述鏈的跟蹤結果。

在這里插入圖片描述

2.6 使用 LangServe進行部署

??現在我們已經構建了一個應用程序,我們需要將其部署為服務。LangServe 幫助開發人員將 LCEL 鏈部署為 REST API。該庫與 FastAPI 集成,并使用 pydantic 進行數據驗證。

??要為我們的應用程序創建一個服務器,我們首先需要創建一個serve.py文件,其中包含以下三個部分:

  1. 我們的鏈的定義(與上述相同)
  2. 我們的FastAPI應用
  3. 通過langserve.add_routes定義一個路線,用于提供鏈的服務。
#!/usr/bin/env python
from typing import Listfrom fastapi import FastAPI
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema import BaseOutputParser
from langserve import add_routes# 1. Chain definitionclass CommaSeparatedListOutputParser(BaseOutputParser[List[str]]):"""Parse the output of an LLM call to a comma-separated list."""def parse(self, text: str) -> List[str]:"""Parse the output of an LLM call."""return text.strip().split(", ")template = """You are a helpful assistant who generates comma separated lists.
A user will pass in a category, and you should generate 5 objects in that category in a comma separated list.
ONLY return a comma separated list, and nothing more."""
human_template = "{text}"chat_prompt = ChatPromptTemplate.from_messages([("system", template),("human", human_template),
])
category_chain = chat_prompt | ChatOpenAI() | CommaSeparatedListOutputParser()# 2. App definition
app = FastAPI(title="LangChain Server",version="1.0",description="A simple api server using Langchain's Runnable interfaces",
)# 3. Adding chain route
add_routes(app,category_chain,path="/category_chain",
)if __name__ == "__main__":import uvicornuvicorn.run(app, host="localhost", port=8000)

現在執行這個文件:

python serve.py

這將在 localhost:8000 上提供服務

2.7 playground

??每個LangServe服務都自帶一個簡單的內置UI,用于配置和調用帶有流式輸出和中間步驟可視化的應用程序。前往 http://localhost:8000/category_chain/playground/ 嘗試一下

2.8 Client

??現在,讓我們設置一個客戶端,以便通過編程方式與我們的服務進行交互,使用langserve.RemoteRunnable可以輕松實現這一點。

from langserve import RemoteRunnableremote_chain = RemoteRunnable("http://localhost:8000/category_chain/")
remote_chain.invoke({"text": "colors"})
 ['red', 'blue', 'green', 'yellow', 'orange']

在環境中配置OpenAI API key,有幾種方式:

  • 將OPENAI_API_KEY配置為環境變量

    #pip install openai
    import openai
    export OPENAI_API_KEY="..."
    
  • 如果您不想設置環境變量,可以在啟動OpenAI() 類時直接通過openai.api_key參數傳遞密鑰:

    from langchain.llms import OpenAIllm = OpenAI(openai.api_key="...")
    
  • 最后一種方式是自動導入。在項目根目錄下創建.env文件(如果沒有),然后使用 load_dotenv, find_dotenv來導入(推薦)

    vim .env                                    # linux/Mac
    type nul > .env					    		# Windows# 文件中寫入OPENAI_API_KEY = "xxx"
    
    import os
    import openaifrom dotenv import load_dotenv, find_dotenv
    _ = load_dotenv(find_dotenv()) # read local .env file
    openai.api_key =os.environ['OPENAI_API_KEY']
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165714.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165714.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165714.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32筆記---RTC

目錄 一、RTC簡介 二、主要特性 三、功能描述 3.1 讀RTC寄存器 3.2 配置RTC寄存器 四、BKP簡介 五、RTC_Init() 1. 函數BKP_ReadBackupRegister 2.RCC_LSEConfig設置外部低速晶振&#xff08;LSE&#xff09; 3.RTC基本結構 5.RTC_Init()實現 6.time.h 一、R…

九州未來聯合聯通智網科技發布白皮書,促進車聯網融合發展

2023年11月21日&#xff0c;由2023中國5G工業互聯網大會組委會、工業和信息化部主辦&#xff0c;聯通智網科技承辦的2023中國5G工業互聯網大會——5G車聯網與智慧交通創新發展平行會議&#xff0c;在武漢成功舉辦。 九州未來作為中國聯通車聯網創新聯合體成員單位&#xff0c;受…

【Sql】sql server還原數據庫的時候,提示:因為數據庫正在使用,所以無法獲得對數據庫的獨占訪問權。

【問題描述】 sql server 還數據庫的時候&#xff0c;提示失敗。 點擊左下角進度位置&#xff0c;可以得到詳細信息&#xff1a; 因為數據庫正在使用&#xff0c;所以無法獲得對數據庫的獨占訪問權。 【解決方法】 針對數據庫先后執行下述語句&#xff0c;獲得獨占訪問權后&a…

【Leetcode合集】2824. 統計和小于目標的下標對數目

2824. 統計和小于目標的下標對數目 2824. 統計和小于目標的下標對數目 代碼倉庫地址&#xff1a; https://github.com/slience-me/Leetcode 個人博客 &#xff1a;https://slienceme.xyz 給你一個下標從 0 開始長度為 n 的整數數組 nums 和一個整數 target &#xff0c;請你…

線性空間(也叫向量空間)、線性運算

線性空間、線性運算 線性空間&#xff0c;也稱向量空間。 假設是一個非空集合&#xff0c;是一個實數域。 在中定義了一個加法&#xff1a;即對中任何兩個元素和&#xff0c;總有中另外一個元素與它們相對應&#xff0c;稱為和的和&#xff0c;記作&#xff1a; 在定義了一個…

mac電腦系統活動監控:iStat Menus 中文 for Mac

iStat Menus是一款Mac操作系統上的系統監控工具&#xff0c;它提供了實時的系統狀態和性能數據&#xff0c;讓用戶可以方便地監控和管理自己的電腦。iStat Menus以菜單欄圖標的形式顯示各種系統指標&#xff0c;用戶可以輕松訪問和查看這些信息。 以下是iStat Menus軟件的一些…

debian 設置系統默認以命令行方式啟動,關閉x windows

debian 設置系統默認以命令行方式啟動&#xff0c;關閉x windows 2021-01-02 tech linux 設置 grub啟動設置在/etc/default/grub中&#xff0c;打開 default grub 配置: $ sudo vim /etc/default/grub修改以下配置&#xff1a; 更新grub&#xff0c;設置多用戶啟動: …

針對MySql知識的回顧

MySql雖然是一個相對簡單的關系型數據庫&#xff0c;但也是一個最常用的數據庫&#xff0c;也是一個非常經典的數據庫&#xff0c;很多云產品也是基于MySql做了二開&#xff0c;從而變得非常強大&#xff0c;其中MySql最常用的是Innodb引擎&#xff0c;因為該引擎支持事務&…

第14章 多線程三 (線程同步)

目錄 內容說明 章節內容 1、為什么需要多線程同步? 2、Java如何實現多線程同步?

CUDA學習筆記9——CUDA 共享內存 / Shared Memory

由于共享內存擁有僅次于寄存器的讀寫速度&#xff0c;比全局內存快得多。因此&#xff0c;能夠用共享內存訪問替換全局內存訪問的場景都可以考慮做對應的優化。 不利用共享內存的矩陣乘法 不利用共享內存的矩陣乘法的直接實現。每個線程讀取A的一行和B的一列&#xff0c;并計…

『Linux升級路』基礎開發工具——gcc/g++篇

&#x1f525;博客主頁&#xff1a;小王又困了 &#x1f4da;系列專欄&#xff1a;Linux &#x1f31f;人之為學&#xff0c;不日近則日退 ??感謝大家點贊&#x1f44d;收藏?評論?? 目錄 一、快速認識gcc/g 二、預處理 &#x1f4d2;1.1頭文件展開 &#x1f4d2;1…

java字符串的常見用法

java字符串的常見用法 Java中的字符串是一個非常常用的對象&#xff0c;它屬于Java的內置類String類的實例。字符串在Java中是不可變的&#xff0c;即一旦創建了一個字符串對象&#xff0c;就不能修改它的值。 下面是一些關于Java字符串的詳細用法&#xff1a; 1&#xff09;創…

從零開始,用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交給時間 &#x1f3e0; &#xff1a;小破站 "從零開始&#xff0c;用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合 前言準備工作編寫docker-compose.yml文件為什么使用本機ip為什么skywa…

代碼隨想錄-刷題第六天

242. 有效的字母異位詞 題目鏈接&#xff1a;242. 有效的字母異位詞 思路&#xff1a;哈希法。利用數組來記錄出現的字母個數&#xff0c;然后判斷是否為字母異位詞。 時間復雜度&#xff1a;O(n) class Solution {public boolean isAnagram(String s, String t) {int[] co…

【云備份】第三方庫的認識與使用

文章目錄 json庫粗略認識詳細認識writer 類reader類jsoncpp序列化實現jsoncpp反序列化實現 bundle文件壓縮庫簡單認識bundle庫實現文件壓縮bundle庫實現文件解壓縮 httplib庫Request類Response類Server類Client類 json庫 粗略認識 json是一種數據交換格式&#xff0c;采用完全…

激光切割設備中模組的作用有哪些?

激光切割設備是一種高精度的自動化加工設備&#xff0c;用于對金屬、非金屬等材料進行精確切割。直線模組作為激光切割設備的重要組成部分&#xff0c;在激光切割設備中起著重要的作用&#xff0c;為設備的運動系統提供了高精度、高穩定性和高效率的運動控制。 1、高精度的位置…

excel單元格加背景顏色不生效?

如果在 Excel 中設置單元格背景顏色而發現不生效&#xff0c;可能有幾個原因。以下是一些常見的解決方法&#xff1a; 1. **單元格鎖定&#xff1a;** 檢查所在單元格是否被鎖定。如果單元格被鎖定&#xff0c;并且工作表被保護&#xff0c;你可能無法更改其背景顏色。在工作表…

mysql 優化器的AST樹是啥

from ChatGPT: MySQL中的優化器&#xff08;optimizer&#xff09;使用AST&#xff08;Abstract Syntax Tree&#xff0c;抽象語法樹&#xff09;來表示查詢的語法結構。AST是一種樹狀結構&#xff0c;它反映了查詢語句的語法層次&#xff0c;是一個抽象表示&#xff0c;用于更…

Linux - 文件系統 - 理解目錄 - 理解 軟/硬鏈接

前言 在上篇博客當中&#xff0c;我們對 文件系統 和 inode 做了初步了解&#xff0c;本博客將在上篇博客的基礎之上&#xff0c;對于 文件系統當中的目錄進行進步一闡述。 Linux - 進一步理解 文件系統 - inode - 機械硬盤-CSDN博客 目錄 一個文件有一個 inode&#xff0c;…

Redis打包事務,分批提交

一、需求背景 接手一個老項目&#xff0c;在項目啟動的時候&#xff0c;需要將xxx省整個省的所有區域數據數據、以及系統字典配置逐條保存在Redis緩存里面&#xff0c;這樣查詢的時候會更快; 區域數據字典數據一共大概20000多條,&#xff0c;前同事直接使用 list.forEach…