
SambaNova Llama 3.3 Qdrant 构建快速 RAG 应用以 LlamaIndex 串联推理、向量检索与 Streamlit 实现文档问答【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub本文围绕ai-engineering-hub仓库中的 fastest-rag-stack 示例项目完整讲解如何用 SambaNova 推理引擎、LlamaIndex 编排、Qdrant 向量数据库与 Streamlit 界面搭建一个“与你的文档对话chat with your docs”的 RAG 应用。读完本文你将掌握该技术栈各部分的分工与配置、从环境准备到本地启动的全流程以及rag_code.py中索引、入库、检索、生成四段核心源码的运行原理。项目背景与技术选型该子项目的定位是构建一个“尽可能快的 RAG 技术栈”项目名称与 README 的表述即以此为卖点具体延迟表现与运行环境相关需在实测中验证。整套方案只有四个组成部分职责清晰组件职责在本项目中的选型推理引擎LLM 服务阅读理解并生成回答SambaNova 云推理加载 Llama 3.3 模型RAG 编排框架文档加载、节点切分、查询引擎组装LlamaIndex向量数据库存储与检索文档 EmbeddingQdrant前端界面文件上传与对话交互Streamlit整套代码只有两个 Python 文件rag_code.py 封装全部 RAG 核心逻辑app.py 提供 Streamlit 界面非常适合作为理解“轻量级 RAG 全栈”的起点。环境准备与依赖安装按照 README 的步骤环境搭建分为三步。1. 配置 SambaNova API KeyLlama 3.3 模型托管在 SambaNova 云推理平台上因此需要先申请 API Key并在项目根目录的.env文件中写入SAMBANOVA_API_KEYYOUR_SAMBANOVA_API_KEY代码中通过load_dotenv()见 app.py 与 rag_code.py读取该环境变量供SambaNovaCloud客户端使用。示例项目将.env文件放在与app.py相同的目录下启动时会被自动加载。2. 启动 Qdrant 向量数据库推荐用 Docker 启动 QdrantREADME 给出了直接可用的命令docker run -p 6333:6333 -p 6334:6334 \ -v $(pwd)/qdrant_storage:/qdrant/storage:z \ qdrant/qdrant这里涉及两个端口和一组挂载值得展开说明6333 端口HTTP/REST 接口代码中QdrantClient(urlhttp://localhost:6333)即连接此端口6334 端口gRPC 接口由于客户端代码设置了prefer_grpcTrue见 rag_code.py向量数据的传输会优先走 gRPC以获得更低的序列化开销-v $(pwd)/qdrant_storage:/qdrant/storage:z把宿主机当前目录下的qdrant_storage挂载为容器内的持久化目录容器重启后 Collection 与向量数据仍然保留z是 SELinux 环境如部分 Linux 发行版下常用的权限标签文档中的docs/目录内放置了待检索的样例 PDF如 dspy.pdf作为 RAG 检索的目标内容。3. 安装 Python 依赖README 要求Python 3.11 或更高版本然后执行pip install streamlit llama-index-vector-stores-qdrant llama-index-llms-sambanovasystems sseclient-py对这四个核心依赖的用途说明如下依赖包用途streamlit构建聊天 UI含st.chat_input、st.chat_message等会话组件llama-index-vector-stores-qdrantLlamaIndex 与 Qdrant 存储层的对接llama-index-llms-sambanovasystems提供SambaNovaCloud这个 LLM 封装类sseclient-py解析 SambaNova 返回的 SSEServer-Sent Events流式响应说明embedding 模型通过HuggingFaceEmbedding本地加载BAAI/bge-large-en-v1.5依赖llama-index-embeddings-huggingface与transformers首次运行会自动下载模型权重。启动应用完成上述三步后在项目目录下执行streamlit run app.py浏览器会打开 Streamlit 页面页面包含左右两栏左侧边栏用于上传 PDF 并实时展示“正在索引”状态右侧主区域用于流式聊天。仓库还提供了两种不依赖 UI 的备选入口notebook.ipynb完整复刻 RAG 流程的 Jupyter 笔记本含加载、建索引、查询、DSPy 测试等步骤适合逐格调试sambanova.ipynb仅演示SambaNovaCloud的流式补全能力提问后以 SSE 形式逐字输出。源码剖析rag_code.py 的四层流水线rag_code.py 将 RAG 流程抽象为四个类EmbedData向量化、QdrantVDB_QB入库、Retriever检索、RAG问答编排。一条请求的完整数据流为PDF → 文本 → Embedding → Qdrant Collection → 检索 Top-k → 拼装 Prompt → SambaNova 流式生成。EmbedData文本向量化class EmbedData: def __init__(self, embed_model_nameBAAI/bge-large-en-v1.5, batch_size32): ... embed_model HuggingFaceEmbedding(model_name..., trust_remote_codeTrue, cache_folder./hf_cache) def generate_embedding(self, context): return self.embed_model.get_text_embedding_batch(context) def embed(self, contexts): for batch_context in batch_iterate(contexts, self.batch_size): self.embeddings.extend(self.generate_embedding(batch_context))要点选用的BAAI/bge-large-en-v1.5输出1024 维向量这正是 app.py 中把vector_dim显式设为 1024 的原因rag_code.py中构造函数的默认值 768 是其他模型的常见维度实际必须以所加载的 embedding 模型为准trust_remote_codeTrue允许执行模型仓库自带的远程代码首次运行会下载权重到./hf_cache目录分批batch_size32调用get_text_embedding_batch避免一次提交全部文本导致显存/内存峰值过高。QdrantVDB_QBCollection 管理与数据入库define_client()通过QdrantClient(urlhttp://localhost:6333, prefer_grpcTrue)建立连接。create_collection()对“更快检索”的取舍体现得最直接见 rag_code.pyself.client.create_collection( collection_nameself.collection_name, vectors_configmodels.VectorParams( sizeself.vector_dim, distancemodels.Distance.DOT, # 点积距离 on_diskTrue, # 向量存磁盘省内存 ), optimizers_configmodels.OptimizersConfigDiff( default_segment_number5, indexing_threshold0, # 入库阶段不建索引纯写入 ), quantization_configmodels.BinaryQuantization( binarymodels.BinaryQuantizationConfig(always_ramTrue), ), )可以拆成四个性能取向的关键设置设置含义与影响distancemodels.Distance.DOT使用点积作为相似度度量。点积计算成本低于余弦距离的归一化开销在 Embedding 已经归一化时可等价于余弦相似度on_diskTrue向量存储落盘以换取更低的内存占用二值量化BinaryQuantization(always_ramTrue)把高维向量压缩为二进制表示参与粗筛大幅降低检索带宽always_ramTrue表示把量化向量常驻内存以追求极致的检索速度default_segment_number5预置 5 个分段配合后续批量写入动态indexing_threshold创建时置为0入库阶段不建 HNSW 索引写得更快全量数据入库后再通过update_collection改为20000见ingest_data末尾让 HNSW 索引在收集到足够多的点时再构建ingest_data()将“文本块”与“向量”按同一批切分后以 zip 形式写入self.client.upload_collection( collection_nameself.collection_name, vectorsbatch_embeddings, payload[{context: context} for context in batch_context], )原始文本作为payload.context与向量一起存入检索时无需再回原文档取正文。Retriever带量化的近似最近邻搜索def search(self, query): query_embedding self.embeddata.embed_model.get_query_embedding(query) result self.vector_db.client.search( collection_name..., query_vectorquery_embedding, search_paramsmodels.SearchParams( quantizationmodels.QuantizationSearchParams( ignoreFalse, # 开启量化搜索 rescoreTrue, # 候选集上用原向量精排 oversampling2.0, # 采样 2 倍候选再 rescore ) ), timeout1000, )rescoreTrueoversampling2.0是典型的“先粗后精”两阶段检索先用便宜的二进制量化向量捞出 2 倍于实际所需的候选再用完整精度向量对候选重新打分兼顾速度与召回质量。查询侧的向量由同一个 embedding 模型的get_query_embedding生成保证与库内向量处于同一向量空间。RAG提示词编排与流式生成RAG类承担最后的问答拼接。其 QA 模板与 README 场景chat with your docs直接对应值得完整保留rag_code.pyContext information is below. --------------------- {context} --------------------- Given the context information above I want you to think step by step to answer the query in a crisp manner, incase case you dont know the answer say I dont know!. Query: {query} Answer:内部流程为generate_context(query)调用Retriever.search只取返回结果中前 2 条的payload[context]用\n\n---\n\n连接成检索上下文对单文档问答场景2 条通常已能覆盖答案出处同时也限制了送入大模型的 Token 数用模板把上下文与问题格式化为 Prompt_setup_llm()构建推理客户端SambaNovaCloud( modelMeta-Llama-3.3-70B-Instruct, temperature0.7, context_window100000, )Llama 3.3 模型名与 10 万 Token 的上下文窗口来自 app.py 与 rag_code.py系统提示词system message固定为 “You are a helpful assistant that answers questions about the users document.”调用self.llm.stream_complete(...)返回流式响应对象由上层逐 chunk 渲染。前端实现app.py 中的 Streamlit 交互app.py 承担三类职责① 文档上传与热加载。侧边栏的st.file_uploader(Choose your .pdf file, typepdf)只接受 PDF。文件上传后先落到tempfile.TemporaryDirectory()再用SimpleDirectoryReader(input_dir..., required_exts[.pdf], recursiveTrue)解析取出doc.text作为待向量化的文本块。随后按“embed → 建 collection → 入库 → 建 retriever → 建 RAG”的顺序实例化上面四个类并把组装好的query_engine缓存在st.session_state.file_cache以f{session_id}-{uploaded_file.name}为 key——同一文件二次上传不会重复索引。② 内置 PDF 预览。display_pdf把 PDF 读为 base64通过iframe srcdata:application/pdf;base64,...内嵌渲染上传后即可在页面右侧对照文档内容核验回答app.py。③ 会话与流式打字机效果。借助st.chat_input、st.chat_message维护消息历史每次提问时从缓存取出query_engine遍历流式 chunk从chunk.raw[choices][0][delta][content]中逐字取出文本追加渲染形成打字机效果app.py。右上角的 “Clear ↺” 按钮通过reset_chat()清空消息并触发gc.collect()释放资源。运行约束与注意事项前提条件需要可用的 SambaNova 云 API Key、本机 Docker运行 Qdrant、Python 3.11。Embedding 模型下载与推理调用均需要网络连接模型标识符要一致README 面向 Llama 3.3代码中实际使用Meta-Llama-3.3-70B-Instructapp.py。若平台模型标识有更新需同步修改此处向量维度必须匹配Collection 创建时的vector_dim此处 1024必须等于BAAI/bge-large-en-v1.5的实际输出维度否则入库会报错可复现的探索路径想脱离 UI 逐步验证可直接运行 notebook.ipynb仅想验证 LLM 流式能力可运行 sambanova.ipynb。两个笔记本在 Streamlit 前先加载过模型时注意释放 GPU 显存笔记本中有相应提醒。小结本项目用四个经过性能取向调优的模块拼出了一条可运行的文档问答链路Qdrant 用on_disk存储、二值量化与两阶段 rescore 压低检索成本SambaNova 用托管推理免去本地 GPU 部署LlamaIndex 与 Streamlit 则分别负责编排与交互。对于希望快速落地“对话式文档助手”、又不想自建推理与向量服务的开发者fastest-rag-stack是一个结构清晰、可直接改造成起点的参考实现。【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考