最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

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

2023-08-18 17:08 作者:張文平__  | 我要投稿

為什么選擇這三個組合

  • 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ā)流程:

從圖中可以看到,大致可以分為如下步驟:

  1. 文檔處理:將pdf、docx、數(shù)據(jù)庫中的數(shù)據(jù)轉(zhuǎn)換成文本內(nèi)容。目前openai的chat模型接收的都是文本數(shù)據(jù)。

  2. 數(shù)據(jù)切分:將處理過后的文本內(nèi)容進(jìn)行切分。切分的目的是方便語義化檢索,讓檢索內(nèi)容更精確,另外也是為了適配AI接口的限制。gpt-3.5-turbo的最大tokens數(shù)量是4k,gpt-3.5-turbo-16k也只有16k,因此文檔切分是必需的步驟。

  3. 向量化:openai提供了embedding模型,專門用來將文本轉(zhuǎn)換成向量化數(shù)據(jù),向量化的目的是方便后續(xù)根據(jù)用戶的輸入來檢索相似度高的知識。這里就需要用到向量數(shù)據(jù)庫來存儲embedding模型的輸出。 以上是知識庫處理步驟,這一部分通常是運(yùn)行在應(yīng)用的后臺,需要持續(xù)不斷的獲取最新的知識(比如最新的產(chǎn)品文檔、技術(shù)手冊),并更新向量數(shù)據(jù)庫中的數(shù)據(jù)。

接下來是用戶問答的處理流程:

  1. 知識檢索:將用戶的問題向量化,然后到向量化數(shù)據(jù)庫中檢索相似度最高的知識(可以根據(jù)需要選取相似度高的前n項(xiàng))。

  2. 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. 方式1: 需要記錄不斷迭代的摘要信息。因?yàn)閠oken數(shù)量限制,你不能一次性獲得所有歷史對話的摘要,因此需要不停的疊加歷史摘要和最新對話數(shù)據(jù),生成新的摘要并以會話id為標(biāo)識,記錄到數(shù)據(jù)庫中。

  2. 方式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)用URLservice_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的封裝)


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

分享到微博請遵守國家法律
陇西县| 江门市| 高陵县| 凤城市| 理塘县| 黑水县| 乐清市| 秦安县| 伊宁市| 黄山市| 玛沁县| 新密市| 灵石县| 福海县| 永福县| 海安县| 海门市| 福泉市| 大姚县| 射阳县| 江津市| 东乌| 平果县| 清河县| 长沙市| 汉阴县| 乐至县| 定陶县| 贡嘎县| 同江市| 延川县| 兰坪| 仁寿县| 安仁县| 海伦市| 略阳县| 紫金县| 巴里| 临夏县| 吉首市| 疏附县|