序
完整覆盖 LangChain/LCEL、向量数据库、FastAPI 后端、Gradio 前端、Docker 部署、RAGAS 量化评估
这是最后的效果:
编辑
编辑
编辑
rag就是一种大模型增强技术,简答来说就是:根据用户的问题,从知识库里面检索相关知识,把检索的内容作为拼接到prompt的上下文,让大模型基于这些实时去准确回答。
本项目主要分成3部分:rag,backend,frontend
rag
部分的流程:loader->splitter->emdedding->vectorstore->retriever->reranker->chain
1、loader.py
加载文档,支持txt、pdf、md、word文件,根据后缀来判别。
2、splitter.py
分块 CharacterTextSplitter、SemanticChunker进行语义和RecursiveCharacterTextSplitter
CharacterTextSplitter直接每段切成chunksize,设定overlop重复部分
SemanticChunker切成成短句通过向量模型生成语义向量,根据设定的阈值判断分割点
RecursiveCharacterTextSplitter在第一中的基础上添加separators一些符号进行分割
3、embedding.py
调用阿里云百炼模型text-embedding-v4
4、verctorstore.py
创建向量数据库chroma 包括它的CRUD
5、retriever.py
检索器 向量检索+BM25检索构建多路找回检索器
BM25是去找关键词的匹配 专业术语、精准名词、固定表述匹配
向量检索是找句子匹配 计算语义相似度 一些口语化的表达的查询
把这两条路合并去重EnsembleRetriever得到更全面的相关文本块
构建MultiQuery把一个问题变成多个问法搜索多次,解决检索不全的问题(输入,扩写,多路检索,合并去重)
6、reranker.py
重排 把问题和多路找回的相关内容进行语义匹配、判断解答能力、关键词契合度打分排序 进行筛选
7、chain.py
构建chain和check_chain 最后流式输出
chain就是基础的prompt调用llm然后输出
check_chain是在chain的结果上面在添加一轮的检查 目的是控制幻觉率
backend
利用的是FastAPI
mian.py
先初始化应用,设定跨域中间件,然后就是写一些接口
@app.post("/upload",response_model=UploadResponse)
加载文档,通过创建临时文件(前端传的文件是内存中的二进制数据流,Docunmentloader解析的是本地磁盘上面的,所有先创建临时文件写入磁盘用完删除),得到原始文档然后分块处理,传入向量数据库,更新检索器
@app.post("/query",response_model=QueryResponse)
查询 接受前端问题,调用chain来生成回答
@app.post("/chat")
流式输出
@app.get("/health",response_model=HealthCheckResponse)
检查后端是否成功启动
schemas.py
pydantic标准化 固定参数的格式
rag_service.py
核心业务层,把接口逻辑和业务解耦
fronted
使用Gradio
定义upload_files函数,以rb打开上传,通过mime_type识别文件类型 传给后端
定义query_rag 调用后端问答接口
定义chat_rag 流式聊天交互
通过gr.Blocks创建自定义布局的网页
创建gr.Tab 3个独立的标签页,里面分别是上传文件、智能问答、聊天模式
Docker
Dockerfile+docker-compose.yml
Dockerfile 前端后端打包自己的代码、安装自己的依赖、运行自己的服务
docker-compose.yml 组装在一起
RAGAS 量化评估
30个样本的test_set.json
generate_dataset.py 加载test_set数据然后运行rag的系统question/ground_truth/answer/contexts通过save_to_disk保存为标准化评估数据集rag_eval_dataset
evaluate_ragas.py 加载dataset的数据集,执行评估,保存结果
有问题欢迎大家指正!