
如何快速實現(xiàn)REST API集成以優(yōu)化業(yè)務(wù)流程
在幕后,Streamlit應(yīng)用程序?qū)⑾l(fā)送給聊天機器人API,聊天機器人生成并發(fā)送響應(yīng)回Streamlit應(yīng)用程序,然后顯示給用戶。
在本教程中,你將學(xué)習(xí)如何處理每個步驟,從理解業(yè)務(wù)需求和數(shù)據(jù)到構(gòu)建Streamlit應(yīng)用程序。教程中還有很多內(nèi)容需要消化,但不會讓你感到不知所措,因為教程中會對每個引入的概念提供足夠的背景知識,以及可以為加深理解而提供的外部資源鏈接。
現(xiàn)在,是時候深入學(xué)習(xí)了!
本教程最適合希望獲得創(chuàng)建自定義聊天機器人實踐經(jīng)驗的中級Python開發(fā)人員。
★
如果沒有達到Python中級開發(fā)者的要求,請學(xué)習(xí)課程《Python自學(xué)教程》,此課程從基礎(chǔ)開始,但是能直接引導(dǎo)學(xué)習(xí)者達到中級開發(fā)者水平。課程地址鏈接:https://yantucs.com/series/XL100116xxxxxx ,且在該網(wǎng)站上學(xué)習(xí),還能使用 AI 智能問答服務(wù)。
除了中級Python知識外,還需要對以下概念和技術(shù)有必要的理解:
上述列表中沒有硬性前提條件,所以如果對它們中的任何一個不太了解,也不用擔(dān)心,在學(xué)習(xí)過程中會逐步介紹每個概念和技術(shù)。此外,在本教程中你還可以通過自己的實踐操作,掌握這些技術(shù),沒有比這更好的學(xué)習(xí)方法了。
在整個教程中,將創(chuàng)建幾個目錄,這些目錄構(gòu)成了最終的聊天機器人。以下是每個目錄的詳細說明:
langchain_intro/
建演示聊天機器人所需的工具,但不包括在最終的聊天機器人中。data/
存儲以CSV文件形式存儲的原始醫(yī)院系統(tǒng)數(shù)據(jù)。在步驟 2 中使用這些數(shù)據(jù)。在步驟 3 中,將把這些數(shù)據(jù)移動到 Neo4j 數(shù)據(jù)庫中,聊天機器人將查詢該數(shù)據(jù)庫以回答問題。hospital_neo4j_etl/
包含一個腳本,該腳本從data/
中加載原始數(shù)據(jù)到 Neo4j 數(shù)據(jù)庫中。在構(gòu)建聊天機器人之前,必須運行此腳本,在步驟 3 中會了解到有關(guān)設(shè)置 Neo4j 實例的所有方法。chatbot_api/
是 FastAPI 應(yīng)用程序,它作為REST終端為聊天機器人提供服務(wù),并且是這個項目所交付的產(chǎn)品。chatbot_api/src/agents/
和 chatbot_api/src/chains/
子目錄包含組成聊天機器人的LangChain對象,稍后會了解代理和鏈是什么,但現(xiàn)在只需要知道,聊天機器人實際上是由鏈和函數(shù)組成的LangChain代理。tests/
包括兩個腳本,用于測試聊天機器人回答一系列問題的速度。這將讓你感受到通過向像OpenAI這樣的LLM提供商發(fā)出異步請求來節(jié)省多少時間。chatbot_frontend/
是Streamlit應(yīng)用程序,它與chatbot_api/
中的聊天機器人終端交互,這是在最終產(chǎn)品中看到的UI,將在步驟 5 中構(gòu)建它。構(gòu)建和運行聊天機器人所需的所有環(huán)境變量存儲在.env
文件中,并使用Docker容器部署hospital_neo4j_etl/
、chatbot_api
和chatbot_frontend
中的代碼,這些容器由Docker Compose創(chuàng)建。
有了項目概覽和前提條件,下面就開始第一步——熟悉LangChain。
在設(shè)計和開發(fā)聊天機器人之前,需要知道如何使用LangChain。在本節(jié)中,將通過構(gòu)建醫(yī)院系統(tǒng)聊天機器人的初步版本來了解LangChain的主要內(nèi)容和功能。
創(chuàng)建一個虛擬環(huán)境,確保安裝了Python 3.10或更高版本。
★
創(chuàng)建虛擬環(huán)境的方法,請參考:https://lqpybook.readthedocs.io/en/latest/chapter11.html#id8
或者參考視頻教程:https://yantucs.com/series/XL100116xxxxxx
激活虛擬環(huán)境并安裝以下庫:
(venv) $ python -m pip install langchain==0.1.0 openai==1.7.2 langchain-openai==0.0.2 langchain-community==0.0.12 langchainhub==0.1.14
還需要安裝 python-dotenv
來管理環(huán)境變量:
(venv) $ python -m pip install python-dotenv
python-dotenv
從.env
文件中加載環(huán)境變量到 Python 環(huán)境中,這在開發(fā)聊天機器人時非常方便。然而,最終將使用 Docker 部署聊天機器人,Docker 可以處理環(huán)境變量,就不再需要 python-dotenv
了。
然后從本教程的材料或GitHub倉庫下載reviews.csv
文件。
接下來,打開項目目錄并添加以下文件夾和文件:
./
│
├── data/
│ └── reviews.csv
│
├── langchain_intro/
│ ├── chatbot.py
│ ├── create_retriever.py
│ └── tools.py
│
└── .env
data/
中的reviews.csv
文件是剛剛下載的,目錄中的其余文件應(yīng)該是空的。
現(xiàn)在已經(jīng)準備好使用 LangChain 開始構(gòu)建第一個聊天機器人了!
LangChain 的核心組件是 LLM。LangChain 為使用 LLM 提供商(如OpenAI、Cohere、HuggingFace、Anthropic、Together AI等)提供了一個模塊化接口。在大多數(shù)情況下,只需要從LLM提供商那里獲得一個API密鑰,就可以開始使用LangChain中的LLM了。LangChain還支持托管在自己機器上的LLM或其他語言模型。
本教程中使用OpenAI,但請記住,有許多優(yōu)秀的開源和閉源提供商。可以根據(jù)應(yīng)用程序的需求和成本限制測試不同的提供商并進行優(yōu)化。在繼續(xù)之前,請確保已經(jīng)注冊了OpenAI賬戶,并且擁有一個有效的API密鑰。
一旦有了OpenAI API密鑰,就將其添加到的.env
文件中:
OPENAI_API_KEY=<YOUR-OPENAI-API-KEY>
雖然可以直接與LangChain中的LLM對象交互,但更常見的抽象是聊天模型。聊天模型在底層使用LLM,它們專為對話而設(shè)計,并且它們與聊天消息而不是原始文本交互。
通過聊天消息,向LLM提供了關(guān)于你要發(fā)送的消息類型的額外詳細信息。所有消息都具有角色和內(nèi)容屬性。角色告訴LLM誰在發(fā)送消息,內(nèi)容就是消息本身。以下是最常用的消息類型:
HumanMessage
:與語言模型交互的用戶的一條消息。AIMessage
:來自語言模型的消息。SystemMessage
:告訴語言模型如何表現(xiàn)的消息。并非所有提供商都支持SystemMessage。還有其他類型的消息,如 FunctionMessage
和 ToolMessage
,當(dāng)構(gòu)建代理時,將了解更多關(guān)于它們的內(nèi)容。
在LangChain中開始使用聊天模型很簡單。要實例化一個OpenAI聊天模型,到langchain_intro
子目錄并添加以下代碼到chatbot.py
中:
# langchain_intro/chatbot.py(這一行說明的是文件路徑,不是該文件中的代碼內(nèi)容。下同。)
import dotenv
from langchain_openai import ChatOpenAI
dotenv.load_dotenv()
chat_model = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
首先導(dǎo)入 dotenv
和 ChatOpenAI
。然后調(diào)用 dotenv.load_dotenv()
,它讀取并存儲來自.env
的環(huán)境變量。默認情況下,dotenv.load_dotenv()
假定.env
位于當(dāng)前工作目錄中,但如果.env
位于其他位置,你可以傳遞其他目錄的路徑。
然后,使用 GPT 3.5 Turbo 作為基礎(chǔ)LLM實例化一個 ChatOpenAI
模型,并將溫度(temperature
)設(shè)置為 0
。OpenAI提供了具有不同價格和性能的模型,GPT 3.5 turbo 對初學(xué)者比較合適,因為它在許多用例中表現(xiàn)良好,而且比GPT 4 更便宜。
打開項目目錄后,啟動一個Python解釋器(在 Python 交互模式中),并運行以下代碼,即可以使用 chat_model
:
>>> from langchain.schema.messages import HumanMessage, SystemMessage
>>> from langchain_intro.chatbot import chat_model
>>> messages = [
... SystemMessage(
... content="""You're an assistant knowledgeable about
... healthcare. Only answer healthcare-related questions."""
... ),
... HumanMessage(content="What is Medicaid managed care?"),
... ]
>>> chat_model.invoke(messages)
AIMessage(content='Medicaid managed care is a healthcare delivery system
in which states contract with managed care organizations (MCOs) to provide
healthcare services to Medicaid beneficiaries. Under this system, MCOs are
responsible for coordinating and delivering healthcare services to enrollees,
including primary care, specialty care, hospital services, and prescription
drugs. Medicaid managed care aims to improve care coordination, control costs,
and enhance the quality of care for Medicaid beneficiaries.')
在這段代碼塊中,導(dǎo)入了 HumanMessage
和 SystemMessage
,以及 chat_model
。然后定義了一個包含一個SystemMessage
和一個HumanMessage
的列表,并通過chat_model.invoke()
運行。在底層,chat_model
向OpenAI的服務(wù)端發(fā)出請求,該服務(wù)端提供gpt-3.5-turbo-0125
,并將結(jié)果作為AIMessage
返回。
正如上述操作所見,聊天模型回答了HumanMessage
中提供的“What is Medicaid managed care?”,如果想知道聊天模型在這種情況下對SystemMessage
做了什么。注意觀察問以下問題時會發(fā)生什么:
>>> messages = [
... SystemMessage(
... content="""You're an assistant knowledgeable about
... healthcare. Only answer healthcare-related questions."""
... ),
... HumanMessage(content="How do I change a tire?"),
... ]
>>> chat_model.invoke(messages)
AIMessage(content='I apologize, but I can only provide assistance
and answer questions related to healthcare.')
正如前面所述,SystemMessage
告訴模型怎么做,上面的示例中,告訴模型只回答與醫(yī)療保健相關(guān)的問題。這就是為什么它拒絕回答如何換輪胎的原因(“How do I change a tire?”)。通過文本指令控制LLM與用戶的關(guān)系,也就是通過提示工程(prompt engineering)是創(chuàng)建定制聊天機器人的基礎(chǔ)。
聊天消息是一個很好的抽象,并且有助于確保向LLM提供了正確類型的消息,當(dāng)然, 也可以將原始字符串輸入到 chat_model
中:
>>> chat_model.invoke("What is blood pressure?")
AIMessage(content='Blood pressure is the force exerted by
the blood against the walls of the blood vessels, particularly
the arteries, as it is pumped by the heart. It is measured in
millimeters of mercury (mmHg) and is typically expressed as two
numbers: systolic pressure over diastolic pressure. The systolic
pressure represents the force when the heart contracts and pumps
blood into the arteries, while the diastolic pressure represents
the force when the heart is at rest between beats. Blood pressure
is an important indicator of cardiovascular health and can be influenced
by various factors such as age, genetics, lifestyle, and underlying medical
conditions.')
在這個代碼塊中,將字符串“What is blood pressure?”直接傳遞給chat_model.invoke()
。如果想在沒有SystemMessage
的情況下控制LLM的行為,可以在輸入字符串中包含 prompt。
接下來,將學(xué)習(xí)一種模塊化的方法來指導(dǎo)模型響應(yīng),就像用SystemMessage
做的那樣,這使得定制個性化的聊天機器人更容易。
文章轉(zhuǎn)自微信公眾號@CS創(chuàng)新實驗室