我正在使用PDF项目进行流行的聊天。我的设置方式是将所有LLM代码放在Python脚本中,并使用Flask将其设置为可以从前端调用的API。现在,当我启动应用程序时,我会执行正常的“npm run dev”,然后我还必须执行“python llmpython.py“来启动我的Python脚本。有什么有效的方法可以做到这一点,以便当我的应用程序如果我在网上做这个,它将如何工作?
以下是我的llmpython.py文件:
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain.chains.question_answering import load_qa_chain
from flask import Flask, jsonify, request
from flask_cors import CORS, cross_origin
#Setting Environment variables
from dotenv import load_dotenv
import os
load_dotenv()
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
# app instance
app = Flask(__name__)
CORS(app)
@cross_origin()
@app.route("/api/home", methods=['POST'])
def chat_document():
data = request.get_json()
pdfUrl = data['url']
query = data['chat']
#Load PDF
#The url should be coming from the front end through a post request
loader = PyPDFLoader(pdfUrl)
if loader:
data = loader.load_and_split()
else:
return "Error loading PDF"
#Text Splitting
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(data)
#Embedding and vector storage
embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY)
vectorstore = FAISS.from_documents(texts, embeddings)
#query
# query = "What's the main point of the document?"
docs = vectorstore.similarity_search(query)
#Load LLM and chatchain
llm = ChatOpenAI(temperature=0, openai_api_key=OPENAI_API_KEY)
chain = load_qa_chain(llm, chain_type="stuff")
llmresponse = chain.run(input_documents=docs, question=query)
response = jsonify({
'message': llmresponse,
'role': 'ai'
})
response.headers.add('Access-Control-Allow-Origin', '*')
return response
@app.route("/api/guest", methods=['POST'])
def guest_document():
data = request.get_json()
pdfUrl = data['url']
query1 = data['chat1']
query2 = data['chat2']
#Load PDF
#The url should be coming from the front end through a post request
loader = PyPDFLoader(pdfUrl)
if loader:
data = loader.load_and_split()
else:
return "Error loading PDF"
#Text Splitting
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(data)
#Embedding and vector storage
embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY)
vectorstore = FAISS.from_documents(texts, embeddings)
#query
# query = "What's the main point of the document?"
docs1 = vectorstore.similarity_search(query1)
docs2 = vectorstore.similarity_search(query2)
#Load LLM and chatchain
llm = ChatOpenAI(temperature=0, openai_api_key=OPENAI_API_KEY)
chain = load_qa_chain(llm, chain_type="stuff")
llmresponse1 = chain.run(input_documents=docs1, question=query1)
llmresponse2 = chain.run(input_documents=docs2, question=query2)
response = jsonify({
'message1': llmresponse1,
'message2': llmresponse2,
'role': 'ai'
})
response.headers.add('Access-Control-Allow-Origin', '*')
return response
if __name__ == "__main__":
app.run(debug=True, port=8080)
字符串
这是我调用flask应用程序的组件之一:
import { fileName, guestpdfUrl } from "@/components/Hero";
import { Button } from "@/components/ui/button";
import { useState } from "react";
import TabsSec from "./TabsSec";
const Guest = () => {
const [summary, setSummary] = useState<string>(""); // <-- specify type here
const [bulletSummary, setBulletSummary] = useState<string>(""); // <-- specify type here
const [isLoading, setIsLoading] = useState<boolean>(false); // <-- specify type here
const processDocument = (event: React.FormEvent) => {
event.preventDefault();
setIsLoading(true);
fetch("http://localhost:8080/api/guest", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
url: guestpdfUrl,
chat1: "Create a summary of this text",
chat2: "Create a 10 bullet point summary of this text",
}),
})
.then((response) => response.json())
.then((data) => {
console.log(data.message2);
setSummary(data.message1);
setBulletSummary(data.message2);
setIsLoading(false);
});
};
return (
<div className="flex items-center justify-center flex-col">
<div className=" text-[#202942] mb-4 text-4xl md:text-5xl tracking-tight font-extrabold">
Welcome Guest
</div>
<div className=" text-[#202942] my-4 text-center text-xl md:text-2xl tracking-tight font-extrabold">
You've uploaded a PDF called {fileName}
</div>
<div className="mb-8">
<Button
className="rounded-full bg-[#202942] text-[#dfeff4]
hover:bg-[#3a435e]
font-bold text-sm md:text-base py-2 px-3"
onClick={processDocument}
>
Process Document
</Button>
</div>
<div></div>
<TabsSec
summary={summary}
bulletSummary={bulletSummary}
isLoading={isLoading}
/>{" "}
</div>
);
};
export default Guest;
型
你会建议我如何实现这一点.我正在考虑使用一个exec子进程运行“python llmpython.py“在useEffect,但它看起来像是不可能的.我会感谢任何建议
1条答案
按热度按时间tvokkenx1#
有一个叫supervisor的工具,它允许你管理后台进程,并获取错误和输出日志。我建议你用gunicorn+supervisor运行你的python应用程序。我不太了解NextJS,但https://nextjs.org/learn-pages-router/basics/deploying-nextjs-app可以看看这个。
另外,不要忘记在不同的端口上运行它们,不要直接使用端口
80
和443
。而是使用像NGINX
这样的代理。还要确保在设置后,flask API在localhost之外可用,这意味着您需要使用host=yourdomain.com
才能从nextjs访问。这里有一个视频,可能会有所帮助:https://www.youtube.com/watch?v=goToXTC96Co&list=PL-osiE80TeTs4UjLw5MM6OjgkjFeUxCYH&index=13