尧图精选

大模型应用开发实战地图:RAG、Agents与开源工程落地

🕒 发布时间:2026/9/15 5:05:50 📁 来源:尧图网络
1. 项目概述这不是一个“清单”而是一张大模型应用开发的实战地图“awesome-llm-apps”这个标题乍看像一份 GitHub 上常见的开源项目聚合清单——类似 “awesome-python” 或 “awesome-docker” 那种纯信息索引。但如果你真点进去翻过几十个 star 过千的仓库就会发现它早已不是简单的链接堆砌。它实质上是当前大模型技术从实验室走向真实业务场景过程中最密集、最活跃、也最“接地气”的实践结晶图谱。我从 2023 年初开始系统性跟踪这个仓库的 weekly update至今已整理出 47 个高频复现的架构模式、19 类典型失败案例以及 6 种被反复验证的“最小可行落地路径”。它背后真正承载的是当 LLM 不再是 demo 视频里的炫技而是要嵌入 CRM 系统处理客户投诉、要接入 PLC 控制器调节产线参数、要作为嵌入式模块在边缘设备上持续响应语音指令时工程师们实际在用什么、怎么搭、踩了哪些坑、又如何绕开。核心关键词 “LLM”、“Agents”、“RAG”、“open-source” 并非并列关系而是一个层层递进的技术栈依赖链RAG 是让 LLM “有记忆、懂上下文”的基础能力层Agents 是让 LLM “能规划、会调用、可纠错”的行为组织层而 open-source 则是整个生态得以快速迭代、交叉验证、低成本试错的基础设施层。比如你看到一个标着 “RAG” 的项目它大概率已内置了文档解析 pipeline、向量库选型对比、重排序re-ranking策略实现而一个标着 “Agents” 的项目几乎必然包含工具调用tool calling的 schema 定义、状态持久化机制、以及 human-in-the-loop 的中断恢复逻辑。这不是理论推演是成百上千个团队在生产环境里用 CPU 时间和线上报错日志换来的共识。适合谁来深度阅读这份内容不是刚学完 transformer 原理的在校生也不是只关心 ROI 的 CTO——而是那些正在会议室里被问“下周能不能给销售部上线一个智能话术推荐功能”的一线算法工程师、全栈开发、或 MLOps 工程师。你需要的不是“LLM 是什么”的科普而是“用 Ollama LangChain Chroma 在 4 小时内把销售 SOP PDF 变成可对话知识库并支持追问溯源”的完整操作链。本文将完全跳过所有概念铺垫直接从真实项目结构出发拆解每一个被反复验证过的模块设计、参数取舍、以及那些藏在 commit log 里、文档里从不写的“为什么这么干”。2. 内容整体设计与思路拆解为什么是“应用”而非“模型”2.1 从“模型中心主义”到“应用中心主义”的范式迁移五年前AI 项目的起点是模型选 BERT 还是 RoBERTa微调还是 prompt tuning损失函数用 cross-entropy 还是 focal loss今天“awesome-llm-apps” 所代表的项目集合其起点已彻底转向应用契约Application Contract这个功能必须在 800ms 内返回结果必须支持用户随时打断并切换话题必须能准确识别出“把上周三的报表发给张经理”中的时间、文件名、接收人三个实体必须在断网状态下仍能回答“公司差旅报销标准是多少”这类静态问题。模型只是满足这些契约的工具之一且常常不是首选。我曾参与一个制造业设备故障诊断项目初期团队坚持要用 7B 参数的 LLM 做端到端故障归因。结果在产线边缘盒子上推理延迟高达 3.2 秒远超现场工程师 500ms 的容忍阈值。后来我们彻底重构用规则引擎匹配常见告警码覆盖 68% 场景对剩余 32% 的模糊描述才触发轻量级 RAG 检索——向量库仅存 200 条经 SFT 微调的专家问答对检索后直接拼接进 prompt用 1.5B 的 Phi-3 模型生成结论。最终端到端延迟压到 410ms准确率反而提升 11%因为规则部分零错误RAG 部分数据更干净。这个案例说明“awesome-llm-apps” 中绝大多数高 star 项目其核心竞争力不在于用了多大的模型而在于如何用最经济的计算资源最稳健的工程手段最贴近业务的语言兑现一个具体、可测、可交付的应用承诺。2.2 “Agents” 不是“更聪明的 Chatbot”而是“可编程的业务流程引擎”网络热词里频繁出现的 “llm powered autonomous agents” 容易让人误解为“全自动、无人干预”。但翻遍 “awesome-llm-apps” 中所有标注为 Agents 的项目你会发现一个惊人事实92% 的项目都明确实现了 human-in-the-loop人在环中的强制介入点。这不是功能缺陷而是设计哲学。真正的 Autonomous在工业语境下意味着“在预设边界内自主决策超出边界则无条件移交人类”而非“绝对不打扰用户”。以一个高 star 的 “AIOT Smart Home via Autonomous LLM Agents” 项目为例它的 Agent 架构分为三层感知层Perception通过 Home Assistant API 获取温湿度、开关状态、摄像头帧决策层DecisionLLM 根据当前状态用户历史偏好如“晚上 10 点后空调温度不高于 26℃”生成执行计划执行层Action计划需经本地规则引擎二次校验如“空调温度不得低于 16℃”校验通过后才下发指令且每次下发前弹出手机确认浮层。这个设计的关键在于Agent 的“自主性”体现在决策逻辑的封装与复用上而非取消人工确认。它把原来需要用户手动查温度、查历史设置、查空调安全阈值、再组合操作的 7 步流程压缩为 1 次自然语言输入 1 次点击确认。这才是真实世界里“Autonomous”的含义——减负而非替代。这也是为什么所有成熟 Agents 项目都标配agent_state.json持久化文件它记录的不是 LLM 的思考过程而是用户确认过的每一次决策快照用于审计、回滚、和冷启动恢复。2.3 RAG 的本质是“可控幻觉抑制器”而非“知识增强器”“RAG 知识库” 这个说法本身就有误导性。RAG 的核心价值从来不是“让模型知道更多”而是“让模型在不知道时能诚实地说‘我不知道’并给出可验证的依据”。我在测试 12 个主流 RAG 项目时专门设计了一组“对抗性问题”Q1“2023 年苹果发布会发布的 iPhone 15 Pro 重量是多少”事实型知识库应有Q2“iPhone 15 Pro 的钛合金边框是用哪种激光焊接工艺制造的”超细粒度知识库大概率无Q3“请用莎士比亚风格写一首关于 iPhone 15 Pro 的十四行诗。”创意型无需知识库结果发现表现最好的 RAG 项目如llama-index的SubQuestionQueryEngine在 Q1 准确率 98%Q2 主动回复“该工艺细节未收录在知识库中建议查阅苹果官方技术白皮书”Q3 则完全绕过 RAG 流程直接调用 LLM 生成。而表现最差的项目硬编码所有 query 都走向量检索在 Q2 会胡编一个“飞秒激光脉冲焊接”并在引用处伪造一个不存在的 PDF 页码。这印证了一个关键原则RAG 的成败不取决于向量库有多大而取决于“何时启用 RAG”、“何时绕过 RAG”、“何时拒绝回答”的路由策略是否足够鲁棒。所有高 star RAG 项目其核心代码量最大的部分永远是query_router.py或retrieval_guard.py而不是向量索引构建逻辑。3. 核心细节解析与实操要点从标题到可运行代码的必经之路3.1 “Open-Source” 不是口号而是可审计、可替换、可离线的工程契约“awesome-llm-apps” 中所有被标记为 open-source 的项目其开源质量存在巨大差异。我按可部署性将其分为三级L1玩具级代码开源但依赖闭源 API如gpt-4-turbo、闭源向量库如 Pinecone、或闭源文档解析服务如 Adobe PDF Services。这类项目 star 高但无法真正落地。L2实验级全部依赖开源组件但要求 GPU 显存 ≥24GB如需加载 13B 模型做 rerank或强绑定特定云厂商如只支持 AWS Lambda 的冷启动优化。适合 PoC难进生产。L3生产级满足“三可”原则——可审计所有模型权重、向量库 schema、prompt 模板均版本化管理、可替换提供config.yaml明确声明各组件接口如retriever: chroma/retriever: milvus、可离线默认配置下仅需 CPU 8GB 内存即可启动Ollama 模型可全量下载至本地。以python milvus 实现 rag 知识库这一热词对应的高 star 项目为例其 L3 级别的关键设计体现在三个文件docker-compose.yml定义 milvus standalone单机版、minio对象存储、和 nginx静态文件服务三容器无外部依赖rag_config.py用 Pydantic V2 定义RetrievalConfig模型强制要求embedding_model_path、reranker_model_path、chunk_size、overlap四个字段缺失则启动报错ingest_pipeline.py文档切块逻辑不调用任何黑盒 SDK而是用pymupdf解析 PDFlangchain.text_splitter.RecursiveCharacterTextSplitter切分sentence-transformers/all-MiniLM-L6-v2生成 embedding全程可 debug、可断点、可替换。提示判断一个 RAG 项目是否真开源只需看它能否在无网络环境下用docker-compose up -d一键拉起全部服务并成功处理一份本地 PDF。做不到这点就别谈“生产可用”。3.2 “Agents” 的骨架State、Tool、Memory 三大不可简化的支柱所有高 star Agents 项目其代码结构都高度同质化核心围绕三个 Python 类展开AgentState一个 Pydantic 模型定义 agent 当前状态的所有字段。例如sales_agent的 state 必含current_lead_id: str、conversation_history: List[Dict]、pending_tool_calls: List[ToolCall]。这不是可选装饰而是强制约束——任何状态变更如用户新输入、工具调用返回都必须通过state.update()方法确保原子性。Tool一个抽象基类所有可调用工具查 CRM、发邮件、调用计算器都继承它。关键在于validate_input()和execute()两个方法。前者在调用前校验参数合法性如邮箱格式、CRM ID 是否存在后者执行实际逻辑。我见过太多项目把工具逻辑写死在 agent loop 里导致无法单独测试、无法热更新、无法审计调用日志。Memory不是简单的list.append()而是带 TTLTime-To-Live和容量限制的双缓冲区。主缓冲区short_term_memory存最近 10 轮对话用于 LLM 上下文副缓冲区long_term_memory存用户确认过的决策快照按lead_id分片写入 SQLite用于冷启动恢复。以workbuddy llm wiki项目为例其memory.py文件只有 87 行但实现了自动清理 7 天前的short_term_memorylong_term_memory的写入采用 WALWrite-Ahead Logging模式确保断电不丢数据提供memory.search_by_keyword(报销)接口用 BM25 算法在本地 SQLite 全文索引中检索而非调用向量库——因为决策快照是结构化文本BM25 比向量检索更准、更快、更省资源。注意不要试图用 Redis 或内存 dict 替代Memory类。Redis 没有 TTL 精确控制内存 dict 无法持久化。一个没Memory的 Agent就像没有刹车的汽车——跑得快但停不下。3.3 RAG 的灵魂Chunking 策略决定 80% 的效果上限“rag文档怎么切块” 是搜索热词里提问最多的问题但答案绝不是“用 512 token”。Chunking 的本质是在信息密度、上下文连贯性、检索精度三者间找平衡点。我对比了 19 个 RAG 项目的 chunking 实现总结出四条铁律禁止跨语义单元切分PDF 中的表格、代码块、公式必须作为一个整体 chunk。用pymupdf解析时检测block[type] 1图片或block[type] 2表格将其 content 提取为独立 chunk不与周围文字混合。否则检索“如何配置 Kafka 生产者”可能只召回表格中的一行bootstrap.servers而丢失acks、retries等关键参数。标题必须前置每个 chunk 的开头必须是其所属的最高级标题H1 H2 H3。例如一篇《Kafka 配置指南》文档其 “Producer 配置” 章节下的 chunk开头必须是# Producer 配置而非直接是bootstrap.serverslocalhost:9092。这样当用户问“Kafka 生产者怎么配”检索到的 chunk 能立刻让用户确认这是目标章节而非在一堆参数中盲目寻找。代码与描述分离技术文档中一段代码及其说明文字必须拆成两个 chunk。代码 chunk 以CODE START开头说明 chunk 以DESC START开头。因为用户检索时意图明确分为两类“给我看代码” 和 “解释这个参数”。混在一起会导致 rerank 模型无法区分降低 top-1 准确率。动态 overlap固定 overlap如 100 token是新手陷阱。正确做法是对标题 chunkoverlap 0标题就是锚点无需重叠对段落 chunkoverlap min(50, len(previous_chunk)/3)保证至少包含前 chunk 的核心名词对代码 chunkoverlap 0代码行号是天然边界。llama-index的HierarchicalNodeParser就是基于此逻辑实现的。实测数据在相同文档集、相同 embedding 模型下采用上述策略的 RAG 系统相比 naive 512-token chunkingtop-1 检索准确率从 63.2% 提升至 89.7%平均响应延迟降低 220ms因更少的 chunk 数量减少了向量计算量。4. 实操过程与核心环节实现手把手搭建一个生产级 RAGAgents 应用4.1 环境准备用 Docker Compose 定义可复现的基础设施所有高 star 项目都放弃手动 pip install转而用docker-compose.yml锁定基础设施版本。以下是一个经过 3 个项目验证的最小可行配置docker-compose.prod.ymlversion: 3.8 services: # 向量数据库Milvus Standalone专为中小规模 RAG 优化 milvus: image: milvusdb/milvus:v2.4.7 container_name: milvus-standalone environment: ETCD_ENDPOINTS: etcd:2379 MINIO_ADDRESS: minio:9000 ports: - 19530:19530 volumes: - ./milvus-data:/var/lib/milvus depends_on: - etcd - minio # 对象存储MinIO存原始 PDF/HTML 文档 minio: image: quay.io/minio/minio:RELEASE.2024-02-20T01-19-47Z container_name: minio-server command: server /data --console-address :9001 environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin ports: - 9000:9000 - 9001:9001 volumes: - ./minio-data:/data # Web 服务FastAPI Uvicorn暴露 /ingest /query /agent 接口 api: build: . container_name: rag-api ports: - 8000:8000 environment: MILVUS_URI: http://milvus:19530 MINIO_ENDPOINT: http://minio:9000 MINIO_ACCESS_KEY: minioadmin MINIO_SECRET_KEY: minioadmin depends_on: - milvus - minio restart: unless-stopped关键点解析Milvus 版本锁定为 v2.4.7这是最后一个支持float32向量且无需 GPU 的稳定版。v2.5 强制要求 GPU 加速对 CPU-only 环境不友好MinIO 使用 RELEASE.2024-02-20T01-19-47Z这个日期版本修复了 S3 API 在并发上传时的NoSuchKey异常该 bug 在 RAG 文档批量 ingeset 时高频触发API 服务的restart: unless-stopped确保宿主机重启后服务自动恢复这是生产环境底线要求而非开发便利性选项。实操心得第一次部署时务必先docker-compose -f docker-compose.prod.yml up -d milvus minio等待 2 分钟用curl http://localhost:19530/healthz和curl http://localhost:9000/minio/health/live确认两者健康再启动api。跳过此步90% 的 “Connection refused” 错误都源于服务未就绪。4.2 文档 Ingest Pipeline从 PDF 到可检索向量的七步流水线一个健壮的 ingest pipeline 不是脚本而是一个有状态、可重试、可监控的微服务。以下是ingest_service.py的核心逻辑已简化为伪代码实际项目中每步都有日志和异常捕获def ingest_document(pdf_path: str, bucket_name: str docs): # Step 1: 从 MinIO 下载 PDF 到本地临时目录 local_pdf download_from_minio(pdf_path, bucket_name) # Step 2: 用 pymupdf 解析提取文本、表格、图片元数据 doc fitz.open(local_pdf) blocks [] for page in doc: blocks.extend(page.get_text(dict)[blocks]) # 获取所有 block # Step 3: 按语义单元分组标题、段落、表格、代码 semantic_chunks group_blocks_by_semantic_type(blocks) # Step 4: 对每个语义单元应用定制化 chunking final_chunks [] for unit in semantic_chunks: if unit.type table: chunk f## {unit.title}\n{unit.content} # 表格 chunk 前置标题 elif unit.type code: chunk fCODE START\n{unit.content}\nCODE END else: chunk f## {unit.title}\n{unit.content} # 动态计算 overlap 并切分 chunks dynamic_chunking(chunk, unit.type) final_chunks.extend(chunks) # Step 5: 生成 embedding使用 sentence-transformers/all-MiniLM-L6-v2 embeddings embed_model.encode([c.text for c in final_chunks]) # Step 6: 写入 Milvus带去重根据 chunk.text 的 hash 判断是否已存在 collection get_milvus_collection(rag_docs) existing_hashes collection.query(exprhash in [{}].format(,.join([c.hash for c in final_chunks]))) new_chunks [c for c in final_chunks if c.hash not in existing_hashes] collection.insert([ [c.hash for c in new_chunks], [c.text for c in new_chunks], [c.metadata for c in new_chunks], [e for e in embeddings if e not in existing_embeddings] ]) # Step 7: 更新 MinIO 中的文档元数据记录最后 ingest 时间、chunk 数量 update_minio_metadata(pdf_path, {last_ingest: datetime.now(), chunk_count: len(final_chunks)})这个 pipeline 的设计哲学是每一步都是幂等的且可单独调试。例如如果 Step 5 的 embedding 生成失败你可以直接python -c from ingest_service import embed_model; print(embed_model.encode([test]))测试模型加载如果 Step 6 的 Milvus 插入失败你可以用collection.query()直接检查 collection 状态。这种可分解性是区别于“一键脚本”的关键。4.3 RAG Query Engine超越简单向量检索的三层路由一个生产级 RAG 查询引擎绝不能是vector_db.similarity_search(query)。它必须包含三层路由逻辑对应三种用户意图用户问题类型路由策略技术实现示例事实型Fact强制启用 RAG向量检索 BM25 混合排序Hybrid RAG“公司差旅报销标准是多少”创意型Creative绕过 RAG直接调用 LLMprompt 中明确禁用外部知识“写一封感谢客户支持的邮件”模糊型Ambiguous子问题分解Sub-questionLLM 生成 2~3 个子问题分别检索再综合“帮我分析一下上季度销售情况”query_router.py的核心代码如下def route_query(user_query: str) - QueryRoute: # Step 1: 用轻量级分类器LogisticRegression on TF-IDF粗筛 intent intent_classifier.predict([user_query])[0] # 返回 fact, creative, ambiguous if intent creative: return QueryRoute(route_typellm_only, context) # Step 2: 对 fact/ambiguous用 LLM 做子问题分解带 temperature0.1 确保稳定 sub_questions llm.generate( promptf将以下问题分解为 2-3 个具体、可检索的子问题用换行分隔{user_query}, temperature0.1 ).split(\n) if len(sub_questions) 1 and intent fact: # 单子问题直接 Hybrid RAG 检索 results hybrid_retriever.retrieve(sub_questions[0], top_k5) return QueryRoute(route_typehybrid_rag, context\n.join([r.text for r in results])) else: # 多子问题分别检索后合并 all_results [] for sq in sub_questions: all_results.extend(hybrid_retriever.retrieve(sq, top_k3)) # 去重 重排序用 cross-encoder reranker unique_results deduplicate_by_hash(all_results) reranked reranker.rerank(user_query, unique_results, top_k5) return QueryRoute(route_typesubquestion_rag, context\n.join([r.text for r in reranked]))这个设计的价值在于它把“RAG 是否生效”的决策权从开发者手中交还给用户意图。用户不需要知道什么是 Hybrid RAG他只需要自然提问系统自动选择最优路径。这也是为什么所有高 star RAG 项目其query_router.py的代码行数往往超过retriever.py和llm_client.py的总和——因为路由逻辑才是 RAG 的大脑。4.4 Agents Workflow用 State Machine 实现可预测的业务流以一个销售线索跟进 Agent 为例其 workflow 不是自由对话而是严格的状态机。sales_agent.py定义了 5 个状态class SalesAgentState(BaseModel): current_lead_id: str stage: Literal[new, contacted, demo_scheduled, proposal_sent, closed_won, closed_lost] last_contact_time: datetime pending_action: Optional[Literal[send_email, schedule_call, send_proposal]] conversation_history: List[Dict[str, str]] # Agent 的核心循环 def run_agent(state: SalesAgentState, user_input: str) - SalesAgentState: if state.stage new: # 新线索必须先获取客户基本信息 required_fields [company, role, pain_point] missing [f for f in required_fields if f not in user_input.lower()] if missing: return state.copy(update{pending_action: ask_missing_info}) else: return state.copy(update{stage: contacted, last_contact_time: datetime.now()}) elif state.stage contacted and state.pending_action schedule_call: # 已联系待约会议解析用户输入中的时间、时区、会议主题 meeting_info parse_meeting_intent(user_input) if meeting_info: calendar_invite create_calendar_invite(meeting_info) send_email(calendar_invite) return state.copy(update{ stage: demo_scheduled, pending_action: None, last_contact_time: datetime.now() }) else: return state.copy(update{pending_action: ask_meeting_details}) # ... 其他状态处理逻辑这个 state machine 的优势是可穷举、可测试、可审计。你可以用 pytest 写 20 个测试用例覆盖new - contacted - demo_scheduled全路径以及所有异常分支如用户输入乱码、时间解析失败、邮件发送超时。而自由对话式 Agent测试覆盖率永远无法达到 100%。在销售、客服、运维等强流程领域确定性比“拟人性”重要得多。5. 常见问题与排查技巧实录那些文档里不会写的血泪教训5.1 RAG 常见失效场景与根因定位表现象可能根因快速验证方法解决方案检索结果完全不相关向量库未正确创建 index如 Milvus 缺少create_index调用collection.num_entities返回 0或collection.describe()显示 index 为空在ingest后显式调用collection.create_index(field_namevector, index_paramsindex_params)检索结果相关但答案错误Embedding 模型与查询意图不匹配如用all-MiniLM-L6-v2检索法律条文用相同模型对 query 和 top-3 chunk 分别 encode计算 cosine similarity若 0.4 则模型不适配切换为领域适配模型如intfloat/multilingual-e5-large多语言或jinaai/jina-embeddings-v2-base-zh中文法律同一问题多次查询结果不一致向量库未设置consistency_levelStrongMilvus 默认为 Bounded连续 5 次查询同一 query记录 top-1 chunk id若不一致则为一致性问题在MilvusClient初始化时传入consistency_levelStrongRAG 响应慢3sChunk 数量过多10k且未启用search_params的nprobe优化collection.describe()查看num_entitiesexplain查询计划设置search_params{nprobe: 32}Milvus或改用HNSW索引类型实操心得我遇到过最隐蔽的 RAG 失效源于 PDF 解析。某份销售合同 PDF 用 Adobe Acrobat 生成其文本层被加密虽肉眼可见pymupdf解析后返回空字符串。解决方案不是换解析库而是加一道if not text.strip(): text extract_text_with_ocr(pdf_path)用pytesseract做 OCR 备份。这行代码救活了 3 个客户的 RAG 系统。5.2 Agents “失控” 的四大征兆与熔断机制Agents 最怕的不是“答错”而是“无限循环”、“工具滥用”、“状态污染”、“权限越界”。高 star 项目都内置熔断以下是四个必须检查的熔断点循环熔断Loop Breaker在run_agent()开头添加计数器if state.loop_count 5: logger.warning(fAgent loop count exceeded 5 for lead {state.current_lead_id}) return state.copy(update{pending_action: escalate_to_human})这里loop_count是 state 字段每次调用run_agent()时state.loop_count 1。5 次是经验值超过说明状态机设计有缺陷或用户输入触发了死循环。工具调用熔断Tool Guard所有Tool.execute()方法开头必须加if not self.validate_input(input_dict): raise ValueError(fInvalid input for {self.name}: {input_dict}) if time.time() - self.last_call_time 1.0: # 1秒内禁止重复调用 raise ValueError(fRate limit exceeded for {self.name}) self.last_call_time time.time()状态污染熔断State Sanitizer在state.update()方法中强制过滤非法字段def update(self, **kwargs): allowed_keys {current_lead_id, stage, pending_action, ...} # 显式声明 invalid_keys set(kwargs.keys()) - allowed_keys if invalid_keys: logger.error(fAttempt to set invalid state keys: {invalid_keys}) raise ValueError(fInvalid state keys: {invalid_keys}) super().update(**{k: v for k, v in kwargs.items() if k in allowed_keys})权限熔断Permission Gate在 Agent 启动时加载用户角色权限def __init__(self, user_role: str): self.permissions { sales_rep: [send_email, schedule_call], manager: [send_email, schedule_call, send_proposal, close_deal] }.get(user_role, []) def can_execute_tool(self, tool_name: str) - bool: return tool_name in self.permissions注意这四个熔断点必须在项目初始化阶段就注入而不是等线上报错后再补。它们是 Agents 的“安全气囊”不是“性能优化”。5.3 Open-Source 组件选型避坑指南2024 实测版组件类型推荐选项替代选项慎用关键原因Embedding 模型jinaai/jina-embeddings-v2-base-zh中文intfloat/multilingual-e5-large多语言sentence-transformers/all-MiniLM-L6-v2MiniLM 在中文长文本上表现差e5-large 和 jina-embeddings 对中文语义理解更准且支持长上下文512→8192向量数据库Milvus Standalone v2.4.7ChromaDBChromaDB 在 10k chunk 时内存泄漏严重Milvus Standalone 经过 3 个客户 6 个月压测稳定性达标LLM 运行时OllamaCPUvLLMGPUtext-generation-inferenceTGITGI 对模型格式要求苛刻必须 HF 格式Ollama 支持 GGUFvLLM 支持 PagedAttention二者启动速度和内存效率碾压 TGIOrchestration 框架LangChainv0.1.xLlamaIndexLangChain 的Runnable接口更符合生产环境 pipeline 编排需求LlamaIndex 的QueryEngine过于抽象调试困难实测数据在相同硬件Intel i7-11800H, 32GB RAM上用jina-embeddings-v2-base-zh替换all-MiniLM-L6-v2RAG top-1 准确率提升 18.3%用Milvus Standalone替换ChromaDB10k chunk 场景下内存
上一篇/下一篇内容由系统自动关联 返回资讯列表 →