
如何快速實(shí)現(xiàn)REST API集成以優(yōu)化業(yè)務(wù)流程
在幕后,Streamlit應(yīng)用程序?qū)⑾l(fā)送給聊天機(jī)器人API,聊天機(jī)器人生成并發(fā)送響應(yīng)回Streamlit應(yīng)用程序,然后顯示給用戶。
在本教程中,你將學(xué)習(xí)如何處理每個(gè)步驟,從理解業(yè)務(wù)需求和數(shù)據(jù)到構(gòu)建Streamlit應(yīng)用程序。教程中還有很多內(nèi)容需要消化,但不會(huì)讓你感到不知所措,因?yàn)榻坛讨袝?huì)對(duì)每個(gè)引入的概念提供足夠的背景知識(shí),以及可以為加深理解而提供的外部資源鏈接。
現(xiàn)在,是時(shí)候深入學(xué)習(xí)了!
本教程最適合希望獲得創(chuàng)建自定義聊天機(jī)器人實(shí)踐經(jīng)驗(yàn)的中級(jí)Python開發(fā)人員。
★
如果沒(méi)有達(dá)到Python中級(jí)開發(fā)者的要求,請(qǐng)學(xué)習(xí)課程《Python自學(xué)教程》,此課程從基礎(chǔ)開始,但是能直接引導(dǎo)學(xué)習(xí)者達(dá)到中級(jí)開發(fā)者水平。課程地址鏈接:https://yantucs.com/series/XL100116xxxxxx ,且在該網(wǎng)站上學(xué)習(xí),還能使用 AI 智能問(wèn)答服務(wù)。
除了中級(jí)Python知識(shí)外,還需要對(duì)以下概念和技術(shù)有必要的理解:
上述列表中沒(méi)有硬性前提條件,所以如果對(duì)它們中的任何一個(gè)不太了解,也不用擔(dān)心,在學(xué)習(xí)過(guò)程中會(huì)逐步介紹每個(gè)概念和技術(shù)。此外,在本教程中你還可以通過(guò)自己的實(shí)踐操作,掌握這些技術(shù),沒(méi)有比這更好的學(xué)習(xí)方法了。
在整個(gè)教程中,將創(chuàng)建幾個(gè)目錄,這些目錄構(gòu)成了最終的聊天機(jī)器人。以下是每個(gè)目錄的詳細(xì)說(shuō)明:
langchain_intro/
建演示聊天機(jī)器人所需的工具,但不包括在最終的聊天機(jī)器人中。data/
存儲(chǔ)以CSV文件形式存儲(chǔ)的原始醫(yī)院系統(tǒng)數(shù)據(jù)。在步驟 2 中使用這些數(shù)據(jù)。在步驟 3 中,將把這些數(shù)據(jù)移動(dòng)到 Neo4j 數(shù)據(jù)庫(kù)中,聊天機(jī)器人將查詢?cè)摂?shù)據(jù)庫(kù)以回答問(wèn)題。hospital_neo4j_etl/
包含一個(gè)腳本,該腳本從data/
中加載原始數(shù)據(jù)到 Neo4j 數(shù)據(jù)庫(kù)中。在構(gòu)建聊天機(jī)器人之前,必須運(yùn)行此腳本,在步驟 3 中會(huì)了解到有關(guān)設(shè)置 Neo4j 實(shí)例的所有方法。chatbot_api/
是 FastAPI 應(yīng)用程序,它作為REST終端為聊天機(jī)器人提供服務(wù),并且是這個(gè)項(xiàng)目所交付的產(chǎn)品。chatbot_api/src/agents/
和 chatbot_api/src/chains/
子目錄包含組成聊天機(jī)器人的LangChain對(duì)象,稍后會(huì)了解代理和鏈?zhǔn)鞘裁?,但現(xiàn)在只需要知道,聊天機(jī)器人實(shí)際上是由鏈和函數(shù)組成的LangChain代理。tests/
包括兩個(gè)腳本,用于測(cè)試聊天機(jī)器人回答一系列問(wèn)題的速度。這將讓你感受到通過(guò)向像OpenAI這樣的LLM提供商發(fā)出異步請(qǐng)求來(lái)節(jié)省多少時(shí)間。chatbot_frontend/
是Streamlit應(yīng)用程序,它與chatbot_api/
中的聊天機(jī)器人終端交互,這是在最終產(chǎn)品中看到的UI,將在步驟 5 中構(gòu)建它。構(gòu)建和運(yùn)行聊天機(jī)器人所需的所有環(huán)境變量存儲(chǔ)在.env
文件中,并使用Docker容器部署hospital_neo4j_etl/
、chatbot_api
和chatbot_frontend
中的代碼,這些容器由Docker Compose創(chuàng)建。
有了項(xiàng)目概覽和前提條件,下面就開始第一步——熟悉LangChain。
在設(shè)計(jì)和開發(fā)聊天機(jī)器人之前,需要知道如何使用LangChain。在本節(jié)中,將通過(guò)構(gòu)建醫(yī)院系統(tǒng)聊天機(jī)器人的初步版本來(lái)了解LangChain的主要內(nèi)容和功能。
創(chuàng)建一個(gè)虛擬環(huán)境,確保安裝了Python 3.10或更高版本。
★
創(chuàng)建虛擬環(huán)境的方法,請(qǐng)參考:https://lqpybook.readthedocs.io/en/latest/chapter11.html#id8
或者參考視頻教程:https://yantucs.com/series/XL100116xxxxxx
激活虛擬環(huán)境并安裝以下庫(kù):
(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
來(lái)管理環(huán)境變量:
(venv) $ python -m pip install python-dotenv
python-dotenv
從.env
文件中加載環(huán)境變量到 Python 環(huán)境中,這在開發(fā)聊天機(jī)器人時(shí)非常方便。然而,最終將使用 Docker 部署聊天機(jī)器人,Docker 可以處理環(huán)境變量,就不再需要 python-dotenv
了。
然后從本教程的材料或GitHub倉(cāng)庫(kù)下載reviews.csv
文件。
接下來(lái),打開項(xiàng)目目錄并添加以下文件夾和文件:
./
│
├── data/
│ └── reviews.csv
│
├── langchain_intro/
│ ├── chatbot.py
│ ├── create_retriever.py
│ └── tools.py
│
└── .env
data/
中的reviews.csv
文件是剛剛下載的,目錄中的其余文件應(yīng)該是空的。
現(xiàn)在已經(jīng)準(zhǔn)備好使用 LangChain 開始構(gòu)建第一個(gè)聊天機(jī)器人了!
LangChain 的核心組件是 LLM。LangChain 為使用 LLM 提供商(如OpenAI、Cohere、HuggingFace、Anthropic、Together AI等)提供了一個(gè)模塊化接口。在大多數(shù)情況下,只需要從LLM提供商那里獲得一個(gè)API密鑰,就可以開始使用LangChain中的LLM了。LangChain還支持托管在自己機(jī)器上的LLM或其他語(yǔ)言模型。
本教程中使用OpenAI,但請(qǐng)記住,有許多優(yōu)秀的開源和閉源提供商??梢愿鶕?jù)應(yīng)用程序的需求和成本限制測(cè)試不同的提供商并進(jìn)行優(yōu)化。在繼續(xù)之前,請(qǐng)確保已經(jīng)注冊(cè)了OpenAI賬戶,并且擁有一個(gè)有效的API密鑰。
一旦有了OpenAI API密鑰,就將其添加到的.env
文件中:
OPENAI_API_KEY=<YOUR-OPENAI-API-KEY>
雖然可以直接與LangChain中的LLM對(duì)象交互,但更常見的抽象是聊天模型。聊天模型在底層使用LLM,它們專為對(duì)話而設(shè)計(jì),并且它們與聊天消息而不是原始文本交互。
通過(guò)聊天消息,向LLM提供了關(guān)于你要發(fā)送的消息類型的額外詳細(xì)信息。所有消息都具有角色和內(nèi)容屬性。角色告訴LLM誰(shuí)在發(fā)送消息,內(nèi)容就是消息本身。以下是最常用的消息類型:
HumanMessage
:與語(yǔ)言模型交互的用戶的一條消息。AIMessage
:來(lái)自語(yǔ)言模型的消息。SystemMessage
:告訴語(yǔ)言模型如何表現(xiàn)的消息。并非所有提供商都支持SystemMessage。還有其他類型的消息,如 FunctionMessage
和 ToolMessage
,當(dāng)構(gòu)建代理時(shí),將了解更多關(guān)于它們的內(nèi)容。
在LangChain中開始使用聊天模型很簡(jiǎn)單。要實(shí)例化一個(gè)OpenAI聊天模型,到langchain_intro
子目錄并添加以下代碼到chatbot.py
中:
# langchain_intro/chatbot.py(這一行說(shuō)明的是文件路徑,不是該文件中的代碼內(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()
,它讀取并存儲(chǔ)來(lái)自.env
的環(huán)境變量。默認(rèn)情況下,dotenv.load_dotenv()
假定.env
位于當(dāng)前工作目錄中,但如果.env
位于其他位置,你可以傳遞其他目錄的路徑。
然后,使用 GPT 3.5 Turbo 作為基礎(chǔ)LLM實(shí)例化一個(gè) ChatOpenAI
模型,并將溫度(temperature
)設(shè)置為 0
。OpenAI提供了具有不同價(jià)格和性能的模型,GPT 3.5 turbo 對(duì)初學(xué)者比較合適,因?yàn)樗谠S多用例中表現(xiàn)良好,而且比GPT 4 更便宜。
打開項(xiàng)目目錄后,啟動(dòng)一個(gè)Python解釋器(在 Python 交互模式中),并運(yùn)行以下代碼,即可以使用 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
。然后定義了一個(gè)包含一個(gè)SystemMessage
和一個(gè)HumanMessage
的列表,并通過(guò)chat_model.invoke()
運(yùn)行。在底層,chat_model
向OpenAI的服務(wù)端發(fā)出請(qǐng)求,該服務(wù)端提供gpt-3.5-turbo-0125
,并將結(jié)果作為AIMessage
返回。
正如上述操作所見,聊天模型回答了HumanMessage
中提供的“What is Medicaid managed care?”,如果想知道聊天模型在這種情況下對(duì)SystemMessage
做了什么。注意觀察問(wèn)以下問(wèn)題時(shí)會(huì)發(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)的問(wèn)題。這就是為什么它拒絕回答如何換輪胎的原因(“How do I change a tire?”)。通過(guò)文本指令控制LLM與用戶的關(guān)系,也就是通過(guò)提示工程(prompt engineering)是創(chuàng)建定制聊天機(jī)器人的基礎(chǔ)。
聊天消息是一個(gè)很好的抽象,并且有助于確保向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.')
在這個(gè)代碼塊中,將字符串“What is blood pressure?”直接傳遞給chat_model.invoke()
。如果想在沒(méi)有SystemMessage
的情況下控制LLM的行為,可以在輸入字符串中包含 prompt。
接下來(lái),將學(xué)習(xí)一種模塊化的方法來(lái)指導(dǎo)模型響應(yīng),就像用SystemMessage
做的那樣,這使得定制個(gè)性化的聊天機(jī)器人更容易。
文章轉(zhuǎn)自微信公眾號(hào)@CS創(chuàng)新實(shí)驗(yàn)室
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)