【代碼實(shí)踐】使用FastAPI+Supabase+LangChain開發(fā)AI應(yīng)用

為什么選擇這三個組合
OpenAI官方SDK是Python,此開發(fā)語言首選Python
FastAPI是Python語言編寫的高性能的現(xiàn)代化Web框架
LangChain是AI應(yīng)用開發(fā)的主流框架,能方便的組合各種AI技術(shù)進(jìn)行應(yīng)用開發(fā)
MemFire Cloud提供Supabase托管,LangChain原生支持Supabase API
MemFire Cloud提供向量數(shù)據(jù)庫支持,向量數(shù)據(jù)庫是開發(fā)知識庫應(yīng)用的必選項(xiàng)
FastAPI介紹
FastAPI 是一個用于構(gòu)建 API 的現(xiàn)代、快速(高性能)的 web 框架,使用 Python 3.6+ 開發(fā)。
關(guān)鍵特性:
快速:可與 NodeJS 和 Go 并肩的極高性能。最快的 Python web 框架之一。
高效編碼:提高功能開發(fā)速度約 200% 至 300%。
更少 bug:減少約 40% 的人為(開發(fā)者)導(dǎo)致錯誤。
智能:極佳的編輯器支持。處處皆可自動補(bǔ)全,減少調(diào)試時間。
簡單:設(shè)計的易于使用和學(xué)習(xí),閱讀文檔的時間更短。
簡短:使代碼重復(fù)最小化。通過不同的參數(shù)聲明實(shí)現(xiàn)豐富功能。bug 更少。
健壯:生產(chǎn)可用級別的代碼。還有自動生成的交互式文檔。
標(biāo)準(zhǔn)化:基于(并完全兼容)API 的相關(guān)開放標(biāo)準(zhǔn):OpenAPI(以前被稱為 Swagger) 和 JSON Schema。
官方文檔:https://fastapi.tiangolo.com/zh/
ChatGPT介紹
準(zhǔn)確來說ChatGPT只是openai基于GPT模型開發(fā)的一個應(yīng)用,只不過這個詞更流行,更廣為人知。對于開發(fā)者來說,更準(zhǔn)確的說法是GPT模型。目前openai提供的模型包括:

每個模型下面又分別有很多細(xì)分的模型,在文本和代碼生成場景,官方推薦使用兩個模型:gpt-3.5-turbo
or gpt-4
,本文使用目前成本更優(yōu)的gpt-3.5-turbo
。相對應(yīng)的, gpt-4
能理解更復(fù)雜的指令,也會盡可能不胡言亂語,但是 gpt-4
成本要高一些,推理速度要慢一些。
GPT模型的應(yīng)用場景:
編寫各種類型的文檔,包括學(xué)術(shù)論文
生成代碼
基于知識庫進(jìn)行問題回答
分析文本,包括閱讀論文、解讀代碼等都能勝任
對話工具,比如客服
為軟件提供自然語言接口
教學(xué)導(dǎo)師
翻譯
游戲角色AI
openai的更多資源請參考:
https://platform.openai.com/docs
https://github.com/openai/openai-cookbook
MemFire Cloud介紹
本文主要使用了MemFire Cloud的BaaS服務(wù)提供的數(shù)據(jù)庫自動生成API以及向量數(shù)據(jù)庫能力,用以存儲和檢索embedding之后的向量數(shù)據(jù)。MemFire Cloud的BaaS服務(wù)還提供了其他一些方便開發(fā)者進(jìn)行應(yīng)用開發(fā)的功能:
完整的用戶注冊、登錄、權(quán)限管理API,web前端和App開發(fā)人員可以直接調(diào)用,幾行代碼完成用戶注冊登錄功能。
微信小程序、手機(jī)短信驗(yàn)證碼、github、apple等第三方用戶接入支持。
最流行的postgres關(guān)系數(shù)據(jù)庫支持,自動生成增刪查改API接口,支持向量化插件pgvector。
提供對象存儲接口,方便應(yīng)用開發(fā)者上傳下載圖片、文檔等。
靜態(tài)托管和自定義域名服務(wù),可以讓開發(fā)者不需要為部署前端代碼專門購買云服務(wù)器。
云函數(shù)可以方便處理復(fù)雜和敏感的業(yè)務(wù)邏輯,也可以用來托管完整的api服務(wù)。
MemFire Cloud更多信息,請參考:https://memfiredb.com
GPT初體驗(yàn)
下面是openai官方的一個例子:
```
import os
import openai
openai.organization = "org-kjUiGhsu6S3CI2MUch25dMOF"
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.ChatCompletion.create(
? model="gpt-3.5-turbo",
? messages=[
? ? ? ? {"role": "system", "content": "You are a helpful assistant."},
? ? ? ? {"role": "user", "content": "Who won the world series in 2020?"},
? ? ? ? {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
? ? ? ? {"role": "user", "content": "Where was it played?"}
? ? ]
)
```
參數(shù)必填項(xiàng):
model:模型選擇,這里用的是gpt-3.5-turbo
messages:信息,可以只包含一個問題,也可以包含更多上下文,以幫助AI更準(zhǔn)確的回答問題。
AI開發(fā)的最主要的工作就是組裝合適的messages,以達(dá)到更精確的回答用戶問題的目的。一條message包含role和content兩個元素。其中role包含:
system:相當(dāng)于系統(tǒng)設(shè)定,一般用來告訴ai他要扮演什么角色,如何回答問題等。
assistant:輔助信息,幫助AI更好的理解用戶的當(dāng)前問題。通常用于包含多輪對話的上下文信息,也可以用來給出一些問答樣例。
user:用戶的提問內(nèi)容。
FastAPI編寫后端服務(wù)
如果你使用過FastAPI,可以跳過本節(jié)內(nèi)容。
如果你有flask或django的基礎(chǔ),強(qiáng)烈建議閱讀官方的這兩個教程,可以幫助你快速了解fastapi的使用方法。
https://fastapi.tiangolo.com/zh/tutorial/sql-databases/
https://fastapi.tiangolo.com/zh/tutorial/bigger-applications/
如果你是web服務(wù)的新手,建議從頭閱讀fastapi的教程文檔,寫的非常好。
https://fastapi.tiangolo.com/zh/tutorial/first-steps/
我們先以上面openai的官方示例,來看一下如何使用fastapi來編寫服務(wù)端代碼,完成與openai的交互,并暴露接口給你的web或app客戶端使用。為了方便,我們將所有代碼放在一個main.py中演示,如果你要實(shí)現(xiàn)一個完整的應(yīng)用,建議參考大型應(yīng)用開發(fā)這篇教程,模塊化組織你的代碼。
接口定義
一個簡單的可運(yùn)行的接口定義:
```
from fastapi import FastAPI
app = FastAPI()
@app.get("/hello")
async def hello():
? ? return {"message": "你好"}
```
安裝下列依賴就可以運(yùn)行了:
```
# 安裝依賴
pip install "uvicorn[standard]==0.23.1" "fastapi[all]==0.99.1"
# 運(yùn)行服務(wù)
uvicorn main:app --reload
```
訪問接口:
```
curl http://127.0.0.1:8000/hello
```
封裝openai調(diào)用接口
了解了fastapi的接口定義方法,我們就能很快將openai的官方示例封裝成接口:
```
from fastapi import FastAPI
import openai
app = FastAPI()
openai.organization = "org-kjUiGhsu6S3CI2MUch25dMOF"
openai.api_key = os.getenv("OPENAI_API_KEY")
@app.get("/openai")
async def openai():
? ? return openai.ChatCompletion.create(
? ? ? model="gpt-3.5-turbo",
? ? ? messages=[
? ? ? ? ? ? {"role": "system", "content": "You are a helpful assistant."},
? ? ? ? ? ? {"role": "user", "content": "Who won the world series in 2020?"},
? ? ? ? ? ? {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
? ? ? ? ? ? {"role": "user", "content": "Where was it played?"}
? ? ? ? ]
? ? )
```
錯誤處理
在調(diào)用openai的接口時,如果發(fā)生錯誤,openai會拋出異常。在FastAPI的服務(wù)代碼中,如果我們不處理openai的異常,F(xiàn)astAPI會將異常拋出,并返回客戶端500 Internal Server Error。通常我們需要以更結(jié)構(gòu)化的方式將具體的錯誤信息返回給接口調(diào)用者。
FastAPI提供了異常處理的回調(diào)接口,以openai的異常為例,可以通過如下方式注冊異常處理函數(shù),以更友好、統(tǒng)一的結(jié)構(gòu)返回錯誤信息:
```
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
from openai import OpenAIError
app = FastAPI()
# 捕獲異常,并返回JSON格式的錯誤信息
@app.exception_handler(OpenAIError)
async def openai_exception_handler(request: Request, exc: OpenAIError):
? ? return JSONResponse(
? ? ? ? status_code=exc.http_status,
? ? ? ? content={'code': exc.code, 'message': exc.error},
? ? )
```
了解了FastAPI的api定義方法和錯誤處理方法,我們基本上可以完成一個簡單的web服務(wù)程序了。
基于openai開發(fā)知識庫應(yīng)用的基本原理
LangChain的文檔中對QA場景的AI應(yīng)用開發(fā)有比較具體的講解,感興趣的可以深入閱讀:
https://python.langchain.com/docs/use_cases/question_answering/
下圖是知識庫類AI應(yīng)用的基本開發(fā)流程:

從圖中可以看到,大致可以分為如下步驟:
文檔處理:將pdf、docx、數(shù)據(jù)庫中的數(shù)據(jù)轉(zhuǎn)換成文本內(nèi)容。目前openai的chat模型接收的都是文本數(shù)據(jù)。
數(shù)據(jù)切分:將處理過后的文本內(nèi)容進(jìn)行切分。切分的目的是方便語義化檢索,讓檢索內(nèi)容更精確,另外也是為了適配AI接口的限制。gpt-3.5-turbo的最大tokens數(shù)量是4k,gpt-3.5-turbo-16k也只有16k,因此文檔切分是必需的步驟。
向量化:openai提供了embedding模型,專門用來將文本轉(zhuǎn)換成向量化數(shù)據(jù),向量化的目的是方便后續(xù)根據(jù)用戶的輸入來檢索相似度高的知識。這里就需要用到向量數(shù)據(jù)庫來存儲embedding模型的輸出。 以上是知識庫處理步驟,這一部分通常是運(yùn)行在應(yīng)用的后臺,需要持續(xù)不斷的獲取最新的知識(比如最新的產(chǎn)品文檔、技術(shù)手冊),并更新向量數(shù)據(jù)庫中的數(shù)據(jù)。
接下來是用戶問答的處理流程:
知識檢索:將用戶的問題向量化,然后到向量化數(shù)據(jù)庫中檢索相似度最高的知識(可以根據(jù)需要選取相似度高的前n項(xiàng))。
AI輔助解答:將檢索到的知識以及設(shè)定好的prompt信息一起發(fā)送給ai模型,ai模型會結(jié)合自己已有的知識以及知識庫中檢索到的知識進(jìn)行最終的答案生成。
LangChain基本用法
根據(jù)上面的流程,我們完全可以自主的實(shí)現(xiàn)一個ai應(yīng)用了,為什么要引入LangChain呢?
如果你通讀了LangChain的文檔(https://python.langchain.com/docs/use_cases/question_answering/),對于如何借助LangChain完成知識庫應(yīng)用應(yīng)該有了基本的認(rèn)識。結(jié)合上面的基本原理,我們來看下LangChain能為我們提供哪些能力。
1. 數(shù)據(jù)加載能力
在上面的步驟中,我們首先要完成的是將已有的知識文檔處理成文本數(shù)據(jù)。LangChain目前已經(jīng)內(nèi)置類非常多的文檔類型處理能力,包括常見的pdf、docx、markdown、html、json、csv等,同時兼容了一百多種數(shù)據(jù)源,幾乎囊括了市面上所有最常用的服務(wù),包括S3、Bilibili、EverNote、Github、Hacker News、Slack、Telegram等等。
下面是加載Web數(shù)據(jù)的WebBaseLoader的使用方法:
```
from?langchain.document_loaders?import?WebBaseLoader
loader?=?WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
data?=?loader.load()
```
2. 數(shù)據(jù)切分能力
LangChain提供了文本切分工具,可以方便的將加載后的文本進(jìn)行切分處理。上面將網(wǎng)頁內(nèi)容加載到data對象之后,可以使用RecursiveCharacterTextSplitter進(jìn)行文本切分:
```
from?langchain.text_splitter?import?RecursiveCharacterTextSplitter
text_splitter?=?RecursiveCharacterTextSplitter(chunk_size?=?500,?chunk_overlap?=?0)
all_splits?=?text_splitter.split_documents(data)
```
3.? 向量化能力
LangChain支持常見的向量化數(shù)據(jù)庫以及embedding模型接入能力,以MemFire Cloud托管的SupaBase和openai embedding模型為例(參考https://python.langchain.com/docs/integrations/vectorstores/supabase):
```
import?os
from?supabase.client?import?Client,?create_client
from?langchain.vectorstores?import?SupabaseVectorStore
from?langchain.embeddings?import?OpenAIEmbeddings
supabase_url?=?os.environ.get("SUPABASE_URL")
supabase_key?=?os.environ.get("SUPABASE_SERVICE_KEY")
client:?Client?=?create_client(supabase_url,?supabase_key)
vector_store?=?SupabaseVectorStore.from_documents(
????all_splits,?OpenAIEmbeddings(),?client=client)
```
要使用LangChain + pgvector的向量化數(shù)據(jù)庫能力,需要在MemFire Cloud上創(chuàng)建應(yīng)用,并開啟vector擴(kuò)展,然后創(chuàng)建documents表和函數(shù)??梢允褂肧QL語句完成這些操作:
```
--?Enable?the?pgvector?extension?to?work?with?embedding?vectors
create?extension?vector;
--?Create?a?table?to?store?your?documents
create?table?documents?(
????id?bigserial?primary?key,
????content?text,?--?corresponds?to?Document.pageContent
????metadata?jsonb,?--?corresponds?to?Document.metadata
????embedding?vector(1536)?--?1536?works?for?OpenAI?embeddings,?change?if?needed
);
CREATE?FUNCTION?match_documents(query_embedding?vector(1536),?match_count?int)
???RETURNS?TABLE(
???????id?uuid,
???????content?text,
???????metadata?jsonb,
???????--?we?return?matched?vectors?to?enable?maximal?marginal?relevance?searches
???????embedding?vector(1536),
???????similarity?float)
???LANGUAGE?plpgsql
???AS?$$
???#?variable_conflict?use_column
BEGIN
???RETURN?query
???SELECT
???????id,
???????content,
???????metadata,
???????embedding,
???????1?-(documents.embedding?<=>?query_embedding)?AS?similarity
???FROM
???????documents
???ORDER?BY
???????documents.embedding?<=>?query_embedding
???LIMIT?match_count;
END;
$$;
```
4. 知識檢索
上面介紹LangChain組合openai embedding 和 pgvector進(jìn)行向量化處理和存儲,LangChain的vectorstore可以直接實(shí)現(xiàn)向量化檢索功能,將用戶的問題轉(zhuǎn)換為最切近的知識庫數(shù)據(jù):
```
query?=?"How?to?build?llm?auto?agent"
matched_docs?=?vector_store.similarity_search(query)
```
matched_docs就是與用戶提問相關(guān)性最高的的知識庫內(nèi)容。
接下來就可以將matched_docs + 用戶的提問打包提交給AI,讓AI幫我們生成最終的答案了。
如何將知識庫和用戶問題打包提交給openai
在GPT初體驗(yàn)章節(jié),我們已經(jīng)介紹了GPT接口的使用方法和參數(shù)含義,這里我們可以使用assistant角色將我們的知識庫打包成messages,然后將用戶的問題以user角色打包到messages中,最后調(diào)用openai的接口:
```
messages=[
???{"role":?"assistant",?"content":?doc.page_content}?for?doc?in?matched_docs
]
messages.append({"role":?"user",?"content":?query})
response?=?openai.ChatCompletion.create("gpt-3.5-turbo",?messages=messages)
```
你也可以將文檔和問題全部打包成user角色的message,大概的格式:
```
content?=?'\n'.join[doc.page_content?for?doc?in?matched_docs]
content?+=?f'\n問題:{query}'
messages=[
???{"role":?"user",?"content":?content?}
]
response?=?openai.ChatCompletion.create("gpt-3.5-turbo",?messages=messages)
```
如何讓AI生成更符合預(yù)期的結(jié)果
我們都知道,ChatGPT有的時候會胡言亂語,一般會發(fā)生在GPT模型中沒有相關(guān)的知識的時候。為了讓AI回答的更嚴(yán)謹(jǐn),我們可以給AI一些明確的指令,比如:
```
docs?=?'\n'.join[doc.page_content?for?doc?in?matched_docs]
content?=?f"'''{docs}'''"
content?+=?f'\n問題:{query}'
messages?=?[
????{"role":?"system",?"content":?"我會將文檔內(nèi)容以三引號(''')引起來發(fā)送給你,如果你無法從我提供的文檔內(nèi)容中找到答案,請回答:\"我無法找到該問題的答案\"。請使用中文回答問題。"},
????{"role":?"user",?"content":?content?}
]
response?=?openai.ChatCompletion.create("gpt-3.5-turbo",?messages=messages)
```
這里有一份GPT的最佳實(shí)踐(https://platform.openai.com/docs/guides/gpt-best-practices)可以參考。
使用MemFire Cloud作為AI的記憶體
openai的GPT模型本身是沒有記憶力的,如果我們希望知識庫應(yīng)用能像ChatGPT一樣跟使用者進(jìn)行連續(xù)的對話,需要讓我們的應(yīng)用有記憶能力,并將記憶的信息在下一次對話時發(fā)送給openai的模型,以便模型了解前面跟用戶聊了些什么。
另外openai的接口是有token限制的,當(dāng)連續(xù)對話的內(nèi)容超出了一次api調(diào)用的token限制時,需要壓縮歷史對話信息。有兩種壓縮方式:
方式1:讓openai提煉歷史對話的概要信息,然后使用概要信息加最新問題進(jìn)行問答;
方式2:從歷史對話中檢索與最新問題相關(guān)性比較高的內(nèi)容,發(fā)送給openai; 不論哪種方式,你都需要對當(dāng)前會話的歷史數(shù)據(jù)進(jìn)行記錄:
方式1: 需要記錄不斷迭代的摘要信息。因?yàn)閠oken數(shù)量限制,你不能一次性獲得所有歷史對話的摘要,因此需要不停的疊加歷史摘要和最新對話數(shù)據(jù),生成新的摘要并以會話id為標(biāo)識,記錄到數(shù)據(jù)庫中。
方式2: 需要將歷史對話的信息通過embedding模型向量化,要并為每個會話構(gòu)建上下文知識庫索引,檢索的時候,只檢索當(dāng)前會話的相似內(nèi)容。
Supabase SDK提供了非常方便的操作數(shù)據(jù)庫的接口,以下為記錄會話歷史消息的表以及基本的操作方法:
```
--?歷史消息表定義
create?table?history_messages?(
????id?bigserial?primary?key,
????session_id?text,?--?會話id
????role?text,?--?會話角色(user?or?ai)
????message?text,?--?會話信息
????create_at?timestamp?default(now())?--?創(chuàng)建時間
)
```
操作歷史消息表的方法:
```
import?os
from?supabase.client?import?Client,?create_client
from?langchain.vectorstores?import?SupabaseVectorStore
#?初始化客戶端
url?=?os.environ.get("SUPABASE_URL")
key?=?os.environ.get("SUPABASE_SERVICE_KEY")
client:?Client?=?create_client(url,?key)
#?往會話xxxxx插入一條歷史消息
client.table("history_messages").insert({"session_id":?"xxxxx",?"role":?"user",?"message":?"你好"}).execute()
#?查詢會話id是xxxxx的所有歷史消息
client.table("history_messages").select("*").eq("session_id",?"xxxxx").execute()
```
完整代碼
前面我們講解了使用FastAPI+SupaBase+LangChain進(jìn)行GPT知識庫開發(fā)的基本原理和關(guān)鍵路徑的代碼實(shí)現(xiàn)。完整的實(shí)現(xiàn)代碼已經(jīng)上傳到了github,感興趣的可以自己玩一下:
GitHub - iswarezwp/supabase-qa: 使用FastAPI+Supabase+LangChain開發(fā)GPT應(yīng)用(地址:https://github.com/iswarezwp/supabase-qa)
代碼主要完成了如下一些基本功能:
使用FastAPI作為Web服務(wù)端框架完成了基本的Web服務(wù)端開發(fā)
使用MemFire Cloud作為向量數(shù)據(jù)和個人文檔數(shù)據(jù)存儲
使用LangChain進(jìn)行AI應(yīng)用開發(fā),加載本地磁盤目錄上的文檔,計算embedding、存儲到向量數(shù)據(jù)庫
使用OpenAI的GPT模型,完成問答功能實(shí)現(xiàn)
使用Next.js開發(fā)了一個簡單的UI界面用于問答演示
下面主要介紹一下如何部署使用該代碼。
準(zhǔn)備工作
1. 首先我們需要一個SupaBase應(yīng)用
MemFire Cloud提供了SupaBase應(yīng)用的托管,因此可以先在MemFire Cloud上創(chuàng)建應(yīng)用,后面需要用到應(yīng)用的API URL和Service Role Key??梢栽趹?yīng)用的應(yīng)用設(shè)置->API頁面找到相應(yīng)的配置。

2. 創(chuàng)建應(yīng)用后,在應(yīng)用的SQL執(zhí)行器頁面執(zhí)行如下腳本
```
--?Enable?the?pgvector?extension?to?work?with?embedding?vectors
create?extension?vector;
--?Create?a?table?to?store?your?documents
create?table?documents?(
????id?uuid?primary?key,
????content?text,?--?corresponds?to?Document.pageContent
????metadata?jsonb,?--?corresponds?to?Document.metadata
????embedding?vector(1536)?--?1536?works?for?OpenAI?embeddings,?change?if?needed
);
CREATE?FUNCTION?match_documents(query_embedding?vector(1536),?match_count?int)
???RETURNS?TABLE(
???????id?uuid,
???????content?text,
???????metadata?jsonb,
???????--?we?return?matched?vectors?to?enable?maximal?marginal?relevance?searches
???????embedding?vector(1536),
???????similarity?float)
???LANGUAGE?plpgsql
???AS?$$
???#?variable_conflict?use_column
BEGIN
???RETURN?query
???SELECT
???????id,
???????content,
???????metadata,
???????embedding,
???????1?-(documents.embedding?<=>?query_embedding)?AS?similarity
???FROM
???????documents
???ORDER?BY
???????documents.embedding?<=>?query_embedding
???LIMIT?match_count;
END;
$$;
```
3. 準(zhǔn)備好用來測試的文檔目錄
默認(rèn)需要將文檔放到app/docs
下,可以通過環(huán)境變量指定其他目錄
4. 準(zhǔn)備好openai的賬號 請參考網(wǎng)上教程申請一個openai賬號,后面代碼運(yùn)行需要用到openai的API KEY
如何運(yùn)行
linux 下運(yùn)行
安裝依賴
```
pip?install?-r?app/requirements.txt
```
設(shè)置參數(shù)
SUPABASE_URL/SUPABASE_KEY分別對應(yīng)
應(yīng)用URL
和service_role
密鑰。注意service_role秘鑰具有比較高的數(shù)據(jù)庫操作權(quán)限,只能用于服務(wù)端配置,不要泄漏。
```
export?DOCS_PATH=./docs
export?SUPABASE_URL="your-api-url"
export?SUPABASE_KEY="your-service-role-key"
export?OPENAI_API_KEY="your-openai-api-key"
```
運(yùn)行
```
uvicorn?main:app?--reload?--host?0.0.0.0
```
docker運(yùn)行
```
docker?build?-t?memfirecloud-qa:v1?.
docker?run?-p?8000:80?\
????-e?SUPABASE_URL="your-api-url"?\
????-e?SUPABASE_KEY="your-service-role-key"?\
????-e?OPENAI_API_KEY="your-openai-api-key"?\
????-v?./docs:/docs?\
????memfirecloud-qa:v1
```
windows下運(yùn)行
與linux類似,設(shè)置相關(guān)環(huán)境變量,然后運(yùn)行:
```
uvicorn?main:app?--reload?--host?0.0.0.0
```
如何訪問
用瀏覽器訪問: http://your-ip:8000/
可以顯示一個簡陋的問答頁面
支持的參數(shù)配置
```
#?本地文檔路徑
export?DOCS_PATH=./docs
#?memfire?cloud?應(yīng)用的API?URL和Service?role?key
export?SUPABASE_URL="your-api-url"
export?SUPABASE_KEY="your-service-role-key"
#?使用openai?/?baidu?的大模型
export?QA_BACKEND="openai"?#?默認(rèn)值
#?openai?相關(guān)配置(QA_BACKEND=openai是需要)
export?OPENAI_ORGANIZATION="your-openai-organization"
export?OPENAI_API_KEY="your-openai-api-key"
export?OPENAI_MODEL="gpt-3.5-turbo"??#?默認(rèn)值
#?百度相關(guān)配置(QA_BACKEND=baidu時需要)
export?BAIDU_API_KEY="your-baidu-api-key"
export?BAIDU_API_SECRET="your-baidu-api-secret"
export?BAIDU_MODEL="ERNIE-Bot-turbo"?#?默認(rèn)值
```
接下來可以做的事情
過濾掉重復(fù)文檔,避免應(yīng)用重啟或者添加重復(fù)文檔是重新計算embedding
程序運(yùn)行中支持增量添加新文檔,實(shí)時更新知識庫
支持對話(chat),目前只是問答(QA),不能連續(xù)對話
支持百度文心一言接口(已完成api的封裝)