基于LangChain、vLLM/OpenLLM搭建PDF问答LLM并提供API服务遇阻求助
基于LangChain+OpenAI的PDF问答API封装方案(CPU环境适配)
问题背景
已通过LangChain结合OpenAI text-davinci-003 与ChromaDB实现PDF问答功能,但在Azure Jupyter Notebook(仅CPU资源)下尝试vLLM、OpenLLM封装API失败,需适配CPU环境的轻量API方案。
解决方案
放弃依赖GPU的vLLM/OpenLLM,采用FastAPI搭建轻量API服务,无需GPU支持,适配现有CPU环境,步骤如下:
1. 安装依赖
在Notebook中执行以下命令安装必要工具:
!pip install fastapi uvicorn python-multipart nest-asyncio
2. 重构代码实现API封装
整合原有PDF问答逻辑与API接口,避免每次请求重复加载文档和向量库:
from langchain import OpenAI, VectorDBQA from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.document_loaders import PyPDFLoader from fastapi import FastAPI from pydantic import BaseModel # 配置OpenAI密钥 OPENAI_API_KEY = 'XXXXXX' # 初始化PDF加载与向量库(仅执行一次,减少重复开销) loader = PyPDFLoader("https://Some_doc.pdf") pages = loader.load_and_split() embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY) docsearch = Chroma.from_documents(pages, embeddings) # 初始化LLM与问答链 llm = OpenAI(model_name='text-davinci-003', temperature=0, openai_api_key=OPENAI_API_KEY) qa_chain = VectorDBQA.from_chain_type(llm=llm, chain_type='stuff', vectorstore=docsearch) # 创建FastAPI实例 app = FastAPI() # 定义请求数据结构 class QuestionRequest(BaseModel): question: str # 定义问答接口 @app.post("/pdf-qa") async def pdf_qa(request: QuestionRequest): result = qa_chain.run(request.question) return {"answer": result}
3. 启动API服务
在Notebook中执行以下代码启动服务:
import uvicorn import nest_asyncio # 修复Jupyter Notebook异步事件循环冲突问题 nest_asyncio.apply() # 启动服务,端口可根据需求调整 uvicorn.run(app, host="0.0.0.0", port=8000)
4. 测试API接口
服务启动后,可通过两种方式测试:
- 在Notebook中用
requests发送请求:
import requests response = requests.post("http://localhost:8000/pdf-qa", json={"question": "some question…"}) print(response.json())
- 访问
http://localhost:8000/docs查看自动生成的API文档,直接在线测试接口。
注意事项
- Azure Jupyter Notebook需确保使用的端口(如8000)已在网络规则中开放。
- 若PDF文档更新,需重新运行向量库初始化代码。
内容的提问来源于stack exchange,提问作者Lars UK
相关产品推荐
相关产品推荐

