在幕后,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í)方法了。

項(xiàng)目概覽

在整個(gè)教程中,將創(chuàng)建幾個(gè)目錄,這些目錄構(gòu)成了最終的聊天機(jī)器人。以下是每個(gè)目錄的詳細(xì)說(shuō)明:

構(gòu)建和運(yùn)行聊天機(jī)器人所需的所有環(huán)境變量存儲(chǔ)在.env文件中,并使用Docker容器部署hospital_neo4j_etl/、chatbot_apichatbot_frontend中的代碼,這些容器由Docker Compose創(chuàng)建。

有了項(xiàng)目概覽和前提條件,下面就開始第一步——熟悉LangChain。

第1步:熟悉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)容就是消息本身。以下是最常用的消息類型:

還有其他類型的消息,如 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_modelOpenAI的服務(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)室

上一篇:

國(guó)家信息 API:面向開發(fā)人員的頂級(jí) API 解決方案

下一篇:

LLM之RAG實(shí)戰(zhàn)(二十九)| 探索RAG PDF解析
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)