我們?nèi)绾卧O(shè)計利用異構(gòu)數(shù)據(jù)源的LLM聊天界面
構(gòu)建有用的 LLM 聊天界面并非沒有復(fù)雜性和挑戰(zhàn)。Deepak Jayablalan 向我們展示了如何做到這一點。
譯自Designing LLM Chat Interfaces to Leverage Heterogeneous Data Sources,作者 Deepak Jayablalan。
大型語言模型(LLM)近年來改變了自然語言處理的游戲規(guī)則,使開發(fā)人員能夠構(gòu)建能夠像人類一樣對話的復(fù)雜聊天界面。這些界面的潛力涵蓋了客戶服務(wù)、虛擬助手、培訓(xùn)和教育,以及娛樂平臺。但是,構(gòu)建有用的 LLM 聊天界面并非沒有其復(fù)雜性和挑戰(zhàn)。
我一直致力于整合 AI 功能,并研究如何構(gòu)建聊天界面以使用 LLM 和代理來導(dǎo)航和利用各種數(shù)據(jù)源。對于這個概念驗證,我使用了 Azure OpenAI 和 Azure 中的其他 AI 功能。它展示了各種用例、設(shè)計模式和實現(xiàn)選項。
目標(biāo)是為架構(gòu)師和 AI 愛好者提供一個基礎(chǔ),讓他們探索 Azure AI 的潛力,并對解決方案方法做出明智的決定。這些用例利用了各種數(shù)據(jù)源,例如 SQL DB、Cosmos DB、CSV 文件、多個數(shù)據(jù)源等。該項目的首要目標(biāo)不僅是展示不同的用例,而且是探索各種實現(xiàn)選項。
先決條件:
如果您還沒有設(shè)置Azure帳戶,您可以在這里使用一些免費積分設(shè)置一個帳戶。
與 CSV 聊天:
以下是一個示例,展示了如何使用 LLM 和代理在任何 CSV 文件上構(gòu)建自然語言界面。通過利用示例代碼,用戶可以上傳預(yù)處理的 CSV 文件,詢問有關(guān)數(shù)據(jù)的問題,并從 AI 模型中獲得答案。
您可以在此處找到 chat_with_CSV 的完整文件。
第 1 步:定義所需的變量,例如 API 密鑰、API 端點、加載格式等
我使用了環(huán)境變量。您可以將它們放在配置文件中,也可以在同一個文件中定義它們。
file_formats = {
"csv": pd.read_csv,
"xls": pd.read_excel,
"xlsx": pd.read_excel,
"xlsm": pd.read_excel,
"xlsb": pd.read_excel,
}
aoai_endpoint = os.environ["AZURE_OPENAI_ENDPOINT" ]
aoai_api_key = os.environI "AZURE_OPENAI_API_KEY" ]
deployment_name = os.environ["AZURE_OPENAI_DEPLOYMENT_NAME" ]
aoai_api_version = os.environ[ "AZURE_OPENAI_API_VERSION" ] #"2023-05-15"
aoai_api_type = os.environ["AZURE_OPENAI_API_TYPE"]
第 2 步:上傳文件并創(chuàng)建數(shù)據(jù)幀
uploaded_file = st. file_uploader(
"Upload a Data file",
type=list (file_formats. keys()),
help="Supports CSV and Excel files!",
on_change=clear_submit,
}
if uploaded_file:
df = load_data(uploaded_file)
第 3 步:使用 AzureChatOpenAI 創(chuàng)建 LLM
為此,我們需要從 langchain_openai 導(dǎo)入AzureChatOpenAI,并使用以下參數(shù),
llm = AzureChatOpenAI (azure_endpoint=aoai_endpoint,
openai_api_key = aoai_api_key,
temperature=0,
azure_deployment=deployment_name,
openai_api_version=aoai_api_version,
streaming=True)
- azure_endpoint:Azure 端點,包括資源。
- openai_api_key:這是一個用于驗證和控制對 OpenAI API 訪問的唯一標(biāo)識符。
- openai_api_version:服務(wù) API 使用 API 版本查詢參數(shù)進行版本控制。所有版本都遵循 YYYY-MM-DD 日期結(jié)構(gòu)。
- streaming:默認(rèn)情況下,此布爾值為 False,表示流是否具有結(jié)果。
- Temperature:溫度是一個參數(shù),用于控制 AI 模型生成的輸出的隨機性。較低的溫度會導(dǎo)致更可預(yù)測和更保守的輸出。較高的溫度允許在響應(yīng)中具有更多創(chuàng)造力和多樣性。這是一種微調(diào)模型輸出中隨機性和確定性之間平衡的方法。
- deployment_name:模型部署。如果給出,則將基本客戶端 URL 設(shè)置為包含 /deployments/{azure_deployment}。注意:這意味著您將無法使用非部署端點。
如果需要,您可以添加更多參數(shù);詳細(xì)信息請參見此鏈接。
第 4 步:使用 CSV 和 LLM 創(chuàng)建代理
為此,我們需要從 langchain_experimental.agents 中導(dǎo)入create_pandas_dataframe_agent,并從 langchain.agent 中導(dǎo)入AgentType。
pandas_df_agent = create_pandas_dataframe_agent(
llm,
df,
verbose=True,
agent_type=AgentType.OPENAI_FUNCTIONS,
handle_parsing_errors=True,
number_of_head_rows=df.shape[0] #send all the rows to LLM
)
pandas 代理是一個使用 create_pandas_dataframe_agent 函數(shù)創(chuàng)建的LangChain代理,它接受以下輸入和參數(shù),
- 一個語言模型 (LLM)作為輸入。
- 一個pandas 數(shù)據(jù)幀 (CSV 數(shù)據(jù))包含數(shù)據(jù)作為輸入。
- Verbose: 如果代理返回 Python 代碼,檢查此代碼以了解問題所在可能會有所幫助。您可以通過在創(chuàng)建代理時設(shè)置 verbose=True 來做到這一點,這應(yīng)該會打印出生成的 Python 代碼。
- agent_Type: 這顯示了如何使用 OPENAI_FUNCTIONS 代理類型初始化代理。這將創(chuàng)建一個使用 OpenAI 函數(shù)調(diào)用來傳達其關(guān)于采取哪些操作的決定的代理。
- handle_parsing_error: 偶爾,LLM 無法確定要采取的步驟,因為其輸出格式不正確,無法由輸出解析器處理。在這種情況下,默認(rèn)情況下,代理會出錯。但是,您可以使用 handle_parsing_errors 輕松控制此功能。
第 5 步:與代理聊天
為此,我們需要使用從langchain.callbacks中導(dǎo)入StreamlitCallbackHandler。
當(dāng)在 panda 代理上調(diào)用 run 方法時,它會使用來自提示的輸入消息和回調(diào)參數(shù),它會經(jīng)過一系列步驟來生成答案。
with st.chat_message("assistant"):
st_cb = StreamlitCallbackHandler (st.container(), expand_new_thoughts=False)
response = pandas_df_agent.run(st. session_state.messages, callbacks=[st_cb])
st.session_state.messages.append({"role": "assistant", "content": response})
st.write (response)
if __name__ == "__main__":
main()
最初,代理會識別任務(wù)并選擇適當(dāng)?shù)牟僮鲝臄?shù)據(jù)幀中檢索所需信息。之后,它會觀察輸出,組合觀察結(jié)果,并生成最終答案。
與數(shù)據(jù)庫聊天:
以下示例代碼展示了如何在結(jié)構(gòu)化數(shù)據(jù)(如 SQL DB 和 NoSQL,如 Cosmos DB)上構(gòu)建自然語言界面,并利用 Azure OpenAI 的功能。這可以用作 SQL 程序員助手。目標(biāo)是生成 SQL 代碼(SQL Server)以檢索對自然語言查詢的答案。
您可以在此處找到與 chat_with_DB 相關(guān)的完整文件。
結(jié)構(gòu)化數(shù)據(jù),如 SQL DB:
第 1 步:加載 Azure 和數(shù)據(jù)庫連接變量
我使用了環(huán)境變量;您可以將其作為配置文件或在同一個文件中定義。
#Load environment variables
load_dotenv ("credentials.env")
aoai_endpoint = os.environ["AZURE_OPENAI_ENDPOINT"]
aoai_api_key = os.environ["AZURE_OPENAI_API_KEY"]
deployment_name = os.environ["AZURE_OPENAI_DEPLOYMENT_NAME"]
aoai_api_version = os.environ["AZURE_OPENAI_API_VERSION"]
aoai_api_version_For_COSMOS = "2023-08-01-preview" #### for cosmos other API versio
aoai_embedding_deployment = os.environ["AZURE_EMBEDDING_MODEL" ]
sql_server_name = os.environ["SQL_SERVER_NAME"]
sal_server_db = os.environ["SQL_SERVER_DATABASE"]
sal_server_username = os.environ["SQL_SERVER_USERNAME"]
sal_Server_pwd = os.environ["SQL_SERVER_PASSWORD"]
SQL_ODBC_DRIVER_PATH = os.environ["SQL_ODBC_DRIVER_PATH"]
COSMOS_MONGO_CONNECTIONSTRING = os.environ["COSMOS_MONGO_CONNECTIONSTRING"]
COSMOS_MONGO_DBNAME = os.environ["COSMOS_MONGO_DBNAME"]
COSMOS_MONGO_CONTAINER = os.environ["COSMOS_MONGO_CONTAINER"]
COSMOS_MONGO_API = os.environ["COSMOS_MONGO_API"]
第 2 步:創(chuàng)建 Azure OpenAI 客戶端和聊天對話的模型響應(yīng)
為此,我們需要 python 庫 openai。安裝完成后,您可以通過導(dǎo)入 openai 和您的 api 密鑰來運行以下操作:
為了創(chuàng)建客戶端,我們利用 Openai 中的AzureOpenAI。
- api-version: 有效的 Azure OpenAI API 版本,例如您在導(dǎo)入 API 時選擇的 API 版本。
- api_key: 用于對 OpenAI 的 API 進行身份驗證和控制訪問的唯一標(biāo)識符。
client = openai.AzureOpenAI(
base_url=f"{aoai_endpoint}/openai/deployments/{deployment_name}/",
api_key=aoai_api_key,
api_version="2023-12-01-preview"
)
response = client.chat.completions.create(
model=deployment_name, # The deployment name you chose when you deployed the ChatGPT or GPT-4 model.
messages=messages,
temperature=0,
max_tokens=2000
)
獲取客戶端后,APIChatCompletions獲取用戶提示并為自然語言查詢生成 SQL 查詢
- model: OpenAI 使用模型關(guān)鍵字參數(shù)來指定要使用的模型。Azure OpenAI 具有獨特的模型部署的概念。當(dāng)您使用 Azure OpenAI 時,模型應(yīng)引用您在部署模型時選擇的底層部署名稱。有關(guān)哪些模型適用于 Chat API 的詳細(xì)信息,請參閱模型端點兼容性表。
- max_tokens: 在聊天完成中可以生成的令牌的最大數(shù)量。輸入令牌和生成令牌的總長度受模型上下文長度的限制。
- temperature: 應(yīng)該使用什么采樣溫度?介于 0 和 2 之間。較高的值(如 0.8)將使輸出更加隨機,而較低的值(如 0.2)將使輸出更加集中和確定性。我們通常建議更改此值或 top_p,但不要同時更改兩者。
- messages: 包含迄今為止對話的一系列消息。
如果需要,您可以根據(jù)要求添加更多參數(shù)。
第 3 步:使用 Panda 讀取 sql 以獲取查詢結(jié)果
利用panda 讀取 sql(pandas.read_sql( sql, con)) 將 sql 查詢或數(shù)據(jù)庫表讀入數(shù)據(jù)幀,并返回包含查詢運行結(jié)果的 pandas 數(shù)據(jù)幀。
def run_sql_query(aoai_sqlquery):
'''
Function to run the
generated SQL Query on SQL server and retrieve output.
Input: AOAI completion (SQL Query)
Output: Pandas dataframe containing results of the query run
'''
conn = connect_sql_server ()
df = pd.read_sql(aoai_sqlquery, conn)
return df
像 COSMOS DB 這樣的 NO SQL:
第 1 步:創(chuàng)建 Azure OpenAI 客戶端
要創(chuàng)建客戶端,我們利用 Openai 的AzureOpenAI。
- api-version: 有效的 Azure OpenAI API 版本,例如您在導(dǎo)入 API 時選擇的 API 版本。
- api_key: 用于對 OpenAI 的 API 進行身份驗證和控制訪問的唯一標(biāo)識符。
client = openai.AzureOpenAI(
base_url=f"{aoai_endpoint}/openai/deployments/{deployment_name}/extensions/",
api_key=aoai_api_key,
api_version=aoai_api_version_For_COSMOS
)
第 2 步:為聊天對話創(chuàng)建模型響應(yīng)
獲取客戶端后,APIChatCompletions獲取用戶提示并為自然語言查詢生成查詢以及響應(yīng)。根據(jù)要求添加參數(shù)詳細(xì)信息。
請確保在使用 Cosmos 作為數(shù)據(jù)源時包含“extra_body”參數(shù)。
return client. chat.completions.create(
model=deployment_name,
messages=[
{"role": m["role"], "content": m["content"]}
for m in messages
],
stream=True,
extra_body={
"dataSources": [
{
"type": "AzureCosmosDB",
"parameters": {
"connectionString": COSMOS._MONGO_CONNECTIONSTRING,
"indexName" : index_name,
"containerName": COSMOS_MONGO_CONTAINER,
"databaseName": COSMOS_MONGO_DBNAME,
"fieldsMapping": {
"contentFieldsSeparator": "\n",
"contentFields": ["text"],
"filepathField": "id",
"titleField": "description",
"urlField": None,
"vectorFields": ["embedding"],
},
"inScope": "true",
"roleInformation": "You are an AI assistant that helps people find information from retrieved data",
"embeddingEndpoint": f"{aoai_endpoint}/openai/deployments/{aoai_embedding_deployment}/embeddings/",
"embeddingKey": aoai_api_key,
"strictness": 3,
" topNDocuments": 5,
}
通過多種數(shù)據(jù)源進行聊天:
此 POC 展示了用于使用 Azure AI 服務(wù)和編排器通過多種數(shù)據(jù)源構(gòu)建聊天界面的多種實現(xiàn)模式。
您可以在此處找到通過多種數(shù)據(jù)源進行聊天的完整文件。
第 1 步:定義 Azure 和連接變量
load_dotenv("credentials.env")
aoai_endpoint = os.environ["AZURE_OPENAI_ENDPOINT"]
aoai_api_key = os.environ["AZURE_OPENAI_API_KEY"]
deployment_name = os.environI "AZURE_OPENAI_DEPLOYMENT_NAME"]
aoai_api_version = os.environI "AZURE_OPENAI_API_VERSION"]
sal_server_name = os.environ "SQL_SERVER_NAME"]
sal_server_db = os.environ "SQL_SERVER_DATABASE"]
sql_server_username = os. environ[" SQL_SERVER_USERNAME"]
sql_Server_pwd = os.environ "SQL_SERVER_PASSWORD"]
blob_connection_string = os.environI "BLOB_CONNECTION_STRING"]
blob_sas_token = os.environ["BLOB_SAS_TOKEN"]
azure_cosmos_endpoint = os.environ["AZURE_COSMOSDB_ENDPOINT"]
azure_cosmos_db = os.environ["AZURE_COSMOSDB_NAME"]
azure_cosmos_container = os.environ["AZURE_COSMOSD_CONTAINER"]
azure_cosmos_connection = os.environ["AZURE_COSMOSDB_CONNECTION_STRING"]
第 2 步:使用 AzureChatOpenAI 創(chuàng)建 LLM
為此,我們需要從 langchain_openai 導(dǎo)入 AzureChatOpenAI 并使用以下參數(shù),
# Set LLM
llm = AzureChatOpenAI(azure_endpoint=aoai_endpoint,
openai_api_key = aoai_api_key,
azure_deployment=deployment_name,
openai._api_version=aoai_api_version,
streaming=False,
temperature=0.5,
max_tokens=1000
,callback_manager=cb_manager
)
第 3 步:工具方法
所有方法 DocSearchAgent、BingSearchAgent、SQLSearchAgent 和 ChatGPTTool 都在 utils 調(diào)用中。
# Initialize our Tools/Experts
text_indexes = [azure_search_covid_index] #, "cogsrch-index-csv"]
doc_search = DocSearchAgent(llm=llm, indexes=text_indexes,
k=10, similarity_k=4, reranker_th=1,
sas_token=blob_sas_token, name="docsearch",
verbose=False) #callback_manager=cb_manager
www_search = BingSearchAgent(llm=llm, k=5,verbose=False)
sal_search = SQLSearchAgent(llm=llm, k=10,verbose=False)
chatgpt_search = ChatGPTTo01(llm=llm) #callback_manager=cb_manager
tools = [www_search, sql_search, doc_search, chatgpt_search] #csv_search,
第 4 步: 創(chuàng)建代理并執(zhí)行它
為此,我們需要從 langchain.agents 導(dǎo)入 AgentExecutor,create_openai_tools_agent。
此外,為了運行代理,從 langchain_core.runnables.history 導(dǎo)入 RunnableWithMessageHistory
agent = create_openai_tools_agent(llm, tools, CUSTOM_CHATBOT_PROMPT)
agent_executor = AgentExecutor(agent=agent, tools=tools)
brain_agent_executor = RunnableWithMessageHistory(
agent_executor,
get_session_history,
input_messages_key="question",
history_messages_key="history",
history_factory_config=[
ConfigurableFieldSpec(
id="user_id",
annotation=str,
name="User ID",
description="Unique identifier for the user.",
default="",
is_shared=True,
),
ConfigurableFieldSpec(
id="session_id",
annotation=str,
name="Session ID",
description="Unique identifier for the conversation.",
default="",
is_shared=True,
),
],
)
使用 create_openai_tools_agent 創(chuàng)建使用 OpenAItools 和
- LLM(BaseLanguageModel):用作代理的 LLM。
- tools(Sequence[BaseTool]):此代理可訪問的工具。
- prompt(ChatPromptTemplate):要使用的提示。
在此處引用文件。通過傳入代理和工具來創(chuàng)建代理執(zhí)行器,并使用 RunnableWithMessageHistory 運行代理。必須始終使用包含聊天消息歷史記錄工廠的適當(dāng)參數(shù)的配置來調(diào)用 RunnableWithMessageHistory。
第 5 步:使用提示和配置調(diào)用代理執(zhí)行器
response = brain_agent_executor.invoke({"question": prompt},config=config)[ "output"]