你好,我是方华。今天无意中看到
阿里云开发者社区
有一个构建RAG应用的活动,于是简单看了一下,按照官方教程和阿里云提供的ROS(资源编排服务)
、百炼平台
、以及文档智能
等工具能力的支持,基本上网页操作,零代码就可配置一个RAG应用的Demo。然而,为了更好的学习理解和进一步实践应用开发,本文将分享如何根据该项目的源码
本地部署调试,自定义修改该项目代码。☁️
RAG项目简介
基于文档智能和百炼平台的RAG应用,该项目旨在基于阿里云的文档智能能力和百炼平台,构建一个高效的RAG(Retrieval-Augmented Generation)应用。使用LLamaIndex作为核心技术,能够有效地从大量文档中检索相关信息,以增强生成模型的回答质量。
通过将文档智能与百炼平台相结合,可实现快速、准确的信息获取,帮助用户更高效地处理和理解复杂数据。
同时,可以支持灵活的知识管理和智能问答服务,为决策提供可靠支持。
功能
- 支持上传文件,自动提取文本内容,并构建知识库。
- 支持自定义问答,实现RAG问答应用。
- 支持用户登陆鉴权,用于系统识别和权限控制。
项目地址
网页链接🔗:https://atomgit.com/aliyun_solution/docmind-rag
代码结构
该项目是一个基于 Python 的 Web 应用程序,采用了 FastAPI 作为后端框架,Jinja 模板引擎作为前端模板引擎。
- 后端:使用 FastAPI 框架,主要处理 API 请求,包括认证、文档处理、问答和文件上传等逻辑。
- 前端:使用 Jinja 模板引擎,提供静态资源文件和模板文件,实现用户界面。
- 数据模型:定义在 models.py 文件中,用于数据库操作。
- 依赖管理:通过 requirements.txt 文件管理项目依赖,确保环境一致性。
功能代码逻辑
uploadfile(文件上传)
@router.post("/uploadfile")
async def upload_parse_and_create_knowledge_base(file: UploadFile = File(...), knowledge_base_name: str = Form(...)):
upload_folder = os.getenv("UPLOAD_FOLDER", "uploads")
os.makedirs(upload_folder, exist_ok=True)
if file.filename == "":
raise HTTPException(status_code=400, detail="未选择文件")
# 校验文件类型
allowed_extensions = ['.pdf', '.doc', '.docx']
file_extension = os.path.splitext(file.filename)[1].lower()
if file_extension not in allowed_extensions:
raise HTTPException(status_code=400, detail="不支持的文件类型,仅支持 PDF/Doc/Docx 格式")
# 校验文件大小
max_file_size = 100 * 1024 * 1024 # 100 MB
if len(await file.read()) > max_file_size:
raise HTTPException(status_code=400, detail="文件大小超过100MB")
# 重置文件指针
await file.seek(0)
try:
file_path = os.path.join(upload_folder, file.filename)
contents = await file.read()
with open(file_path, "wb") as buffer:
buffer.write(contents)
# 解析文档
documents = await parse_document(file_path)
# 处理解析结果
processed_result = process_parsed_result(documents)
# 创建知识库索引
index = DashScopeCloudIndex.from_documents(
documents,
knowledge_base_name,
verbose=True,
)
# 查询文档
dashscope_llm = DashScope(
model_name=DashScopeGenerationModels.QWEN_MAX, api_key=DASHSCOPE_API_KEY
)
query_engine = index.as_query_engine(llm=dashscope_llm)
abstract = query_engine.query("给出一段300字以内的文本,总结文档内容")
print(abstract.response)
return {
"parsed_result": processed_result,"abstract": abstract.response}
except Exception as e:
raise HTTPException(status_code=500, detail=f"文件上传和处理失败,请检查百炼相关配置")
qa(知识库问答)
@router.post("/qa")
async def post_qa(request: Request,
data: dict):
user_message = data.get("message")
knowledge_base_name = data.get("knowledge_base_name")
if not user_message:
raise HTTPException(status_code=400, detail="请输入问题")
if not knowledge_base_name: # 如果没有提供知识库名称,则返回错误
raise HTTPException(status_code=400, detail="请输入知识库名称")
# 知识库检索
retriever = DashScopeCloudRetriever(knowledge_base_name)
nodes = retriever.retrieve(data["message"])
# 初始化大模型
dashscope_llm = DashScope(
model_name=DashScopeGenerationModels.QWEN_MAX, api_key=DASHSCOPE_API_KEY
)
messages = [
ChatMessage(role=MessageRole.SYSTEM, content="你是一个智能助手,回答问题"),
ChatMessage(role=MessageRole.USER, content=data["message"])
]
# 添加检索到的信息作为上下文
for result in nodes:
text_content = result.node.text
messages.append(ChatMessage(role=MessageRole.ASSISTANT, content=text_content))
resp = dashscope_llm.chat(messages)
print(resp.message.content)
return {
"answer": resp.message.content}
部署介绍
配置python环境
利用pip安装依赖环境时,可选择使用国内镜像,提高下载速度。
conda create -n rag_app python=3.9.6
conda activate rag_app
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ # 清华镜像源
# pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ #阿里云镜像源
获取环境变量信息
- UPLOAD_FOLDER : 文件上传路径,自定义即可。
- DASHSCOPE_API_KEY :百炼平台的API密钥,用于访问百炼平台服务。
- DASHSCOPE_WORKSPACE_ID:百炼平台的业务空间ID。
- USERNAME :应用演示账户的用户名,用于系统识别和权限控制。
- PASSWORD :应用演示账户的默认密码,用于登录演示账号。
阿里云百炼平台地址:https://bailian.console.aliyun.com
启动服务
通过IDE设置运行配置启动(PyCharm)
- 新建FastAPI配置
- 选择程序运行设置
- 环境变量配置
- 选择对应conda环境
通过方式命令启动
通过命令启动需要提前在terminal终端中配置环境变量。
# uvicorn main:app --host 0.0.0.0 --reload # 外网模式
uvicorn main:app --host 127.0.01 --reload # 本地模式