菜单

LLM 工程师

相关源文件

目的与范围

本文档提供了在生产环境中构建、部署和保护 LLM 驱动的应用程序的全面指南。它侧重于使用 LLM 的实际方面,包括如何有效运行模型、使用外部知识增强它们、优化性能、大规模部署以及确保系统安全。

有关构建和改进底层 LLM 模型本身的信息,请参阅 LLM 科学家。有关构成 LLM 技术基础的数学、Python 和神经网络的入门知识,请参阅 LLM 基础知识

来源: README.md299-417

1. 运行 LLM

LLM 由于其高计算需求而难以运行。根据您的具体需求,您可以选择通过 API 访问模型或在本地运行它们。本节探讨这两种方法以及优化模型输出的技巧。

1.1 LLM API

对于许多应用程序来说,通过 API 访问 LLM 是最便捷的部署方法。LLM API 领域分为:

  • 专有 LLM API:OpenAI (GPT-4)、Google (Gemini)、Anthropic (Claude)、Cohere
  • 开源 LLM API:OpenRouter、Hugging Face Inference API、Together AI

这些服务处理所有基础设施方面的担忧,同时提供简单的 REST 接口来访问最先进的模型。

1.2 开源模型

开源 LLM 为特定应用程序提供了更大的灵活性、隐私性和成本优势。运行这些模型的主要方法包括:

  • 模型发现:Hugging Face Hub 是开源 LLM 的主要存储库
  • 托管环境:Hugging Face Spaces 允许在没有本地基础设施的情况下运行模型
  • 本地执行:LM Studio、llama.cpp 和 Ollama 等工具允许在消费级硬件上运行模型
方法优点局限性
基于 API无需维护,最新模型,可扩展持续成本,数据隐私担忧
自托管数据隐私,一次性成本,可定制硬件要求,维护负担

1.3 提示工程

有效的提示技术可显著改善模型输出。常见技术包括:

  • 零样本提示:直接要求模型执行任务,无需示例
  • 少样本提示:在提示中提供示例以指导模型行为
  • 思维链:鼓励复杂问题分步推理
  • ReAct:在迭代过程中结合推理和行动

1.4 结构化输出

许多应用程序需要结构化输出,例如特定模板或 JSON 格式。LMQL、Outlines 和 Guidance 等库提供了框架来约束模型生成并确保其符合所需的格式。

来源: README.md307-320

2. 构建向量存储

向量存储是检索增强生成 (RAG) 系统的基础。本节涵盖创建和管理向量存储以进行有效知识检索的过程。

2.1 文档摄取

文档加载器提供标准化接口,用于导入各种内容类型

  • 文档格式:PDF、JSON、HTML、Markdown、CSV 等
  • 外部来源:网页、API、数据库
  • 知识库:GitHub、Reddit、Google Drive 等

2.2 文档拆分

文本分割器将文档分解为可管理的块,这些块可以保留语义含义

  • 基于字符的分割器:按字符数简单划分,并带有重叠
  • 基于标记的分割器:基于分词器特定标记数的划分
  • 语义分割器:基于语义单元(段落、章节)的划分
  • 递归分割器:保持文档结构的层次化分割

2.3 嵌入模型

嵌入模型将文本转换为捕获语义含义的密集向量表示。关键考虑因素包括:

  • 维度:更高的维度可以捕获更多信息,但需要更多存储
  • 领域专业化:通用还是领域特定的嵌入
  • 性能:在 MTEB 等基准测试上衡量的嵌入质量
  • 计算要求:本地还是云端嵌入生成

2.4 向量数据库

向量数据库根据相似性存储和高效检索嵌入向量

  • 内存选项:FAISS、Annoy、Hnswlib
  • 持久化解决方案:Chroma、Pinecone、Milvus、Qdrant、Weaviate
  • 混合方法:PostgreSQL 与 pgvector 扩展

来源: README.md322-336

3. 检索增强生成

RAG 系统通过在推理时从知识库中检索相关上下文信息来增强 LLM。这种方法提高了模型的准确性,并允许访问模型训练数据之外的信息。

3.1 编排器

编排框架将 LLM 与外部工具、数据库和内存连接起来

  • LangChain:用于构建 LLM 应用程序的综合框架
  • LlamaIndex:专注于将 LLM 与外部数据连接的数据框架
  • FastRAG:用于高性能检索应用程序的优化框架

这些框架为整个 RAG 管道提供了标准化的抽象。

3.2 检索器

用户查询通常需要转换以优化检索效果

  • 多查询检索器:生成多个查询变体以提高召回率
  • HyDE(假设文档嵌入):在检索之前生成理想的假设文档
  • 查询转换:改写查询以提高检索性能

3.3 内存

对话式应用程序需要在多次交互中保持上下文

  • 缓冲区内存:简单存储对话历史
  • 摘要内存:对话历史的压缩表示
  • 向量内存:将过去的交互存储在向量数据库中以进行基于相似性的检索
  • 实体内存:跟踪对话中提到的特定实体

3.4 评估

有效的 RAG 系统需要评估检索和生成组件

  • 检索指标:上下文精度、上下文召回率、检索相关性
  • 生成指标:忠实度(事实性)、答案相关性、答案正确性
  • 自动化评估框架:Ragas、DeepEval

来源: README.md338-352

4. 高级 RAG 技术

高级 RAG 技术通过处理结构化数据、自主工具使用和优化检索的专用组件来扩展基本实现。

4.1 查询构建

结构化数据源需要专门的查询语言

  • SQL 生成:将自然语言转换为 SQL 查询
  • 图查询生成:为图数据库创建 Cypher 或 SPARQL 查询
  • 元数据过滤:基于文档元数据构建结构化过滤器

4.2 代理和工具

代理通过自动选择和使用工具的能力来增强 LLM

  • 工具选择:根据查询动态选择合适的工具
  • 工具集成:API、计算器、网络搜索、代码执行
  • 操作规划:确定复杂任务的工具使用顺序
  • 反思:自我纠正和改进工具使用策略

4.3 后处理

检索结果可在提供给 LLM 之前进行进一步的优化

  • 重排序:使用较小的模型重新评分检索到的文档
  • RAG-fusion:组合来自多个检索策略的结果
  • 分类:对查询进行分类以路由到专用检索器
  • 过滤:删除不相关或冗余的信息

4.4 程序化 LLM

DSPy 等框架能够系统地优化 LLM 提示和工作流程

  • 自动提示优化:通过系统测试查找最佳提示
  • 任务分解:将复杂任务分解为更简单的组件
  • 评估驱动开发:使用自动指标指导系统改进

来源: README.md356-371

5. 推理优化

文本生成在计算上成本高昂。本节涵盖了在不影响输出质量的情况下最大化吞吐量和降低推理成本的技术。

5.1 Flash Attention

Flash Attention 通过减少内存操作来优化注意力机制

  • 线性复杂度:将注意力的二次复杂度转换为线性
  • 内存效率:通过算法改进减少内存占用
  • 性能提升:训练和推理的速度显著提升

5.2 键值缓存

键值缓存存储中间表示以避免冗余计算

  • 标准注意力:每个标记关注所有前面的标记
  • 多查询注意力 (MQA):使用单个键值对来处理所有注意力头
  • 分组查询注意力 (GQA):对注意力头进行分组以共享键值对

5.3 推测解码

推测解码通过草稿和验证方法加速生成

  • 草稿生成:使用较小、较快的模型生成候选输出
  • 验证:使用较大的模型来验证和完善草稿输出
  • 性能提升:在质量损失很小的情况下显著降低延迟

来源: README.md374-386

6. 部署 LLM

部署 LLM 需要平衡性能要求、可扩展性需求和基础设施限制。本节涵盖了从本地设置到大规模生产系统的部署选项。

6.1 本地部署

本地部署提供了隐私优势并消除了网络延迟

  • 桌面应用程序:LM Studio、oobabooga Web UI
  • 命令行工具:llama.cpp、Ollama
  • 嵌入式解决方案:kobold.cpp 用于与其他应用程序集成

6.2 演示部署

快速原型设计和演示应用程序受益于专用框架

  • Gradio:用最少的代码快速创建界面
  • Streamlit:更具可定制性的应用程序框架
  • 托管选项:Hugging Face Spaces、Streamlit Cloud

6.3 服务器部署

生产部署需要优化的服务器基础设施

  • 推理服务器:Text Generation Inference (TGI)、vLLM、CTranslate2
  • 云部署:SkyPilot、AWS SageMaker、Google Vertex AI
  • 扩展策略:负载均衡、自动扩展、缓存

6.4 边缘部署

资源受限的环境需要专门的部署方法

  • 移动部署:MLC LLM、mnn-llm
  • 浏览器部署:WebGPU、WebAssembly 解决方案
  • 物联网部署:针对计算能力有限的环境优化推理

来源: README.md388-402

7. 保护 LLM

LLM 应用程序面临着传统软件漏洞之外独特的安全挑战。本节概述了关键的安全问题和缓解策略。

7.1 提示黑客攻击

提示黑客攻击利用 LLM 的输入处理来操纵输出

  • 提示注入:插入覆盖系统提示的指令
  • 数据泄露:精心制作提示以提取训练数据或系统提示
  • 越狱:绕过安全措施和内容过滤器
  • 间接注入:通过外部数据源传递有害内容

7.2 后门

训练时漏洞可能导致持久性安全问题

  • 数据投毒:在模型训练期间引入有害模式
  • 后门触发器:创建特定输入以激活意外行为
  • 模型提取:通过系统查询窃取模型能力

7.3 防御措施

保护 LLM 应用程序需要主动和持续的措施

  • 红队演练:系统性地测试漏洞
  • 输入净化:过滤和验证用户输入
  • 输出过滤:扫描生成的内容是否存在策略违规
  • 监控:使用 garak 和 langfuse 等工具跟踪模型使用和输出中的异常模式

来源: README.md404-417

结论

有效的 LLM 工程需要理解整个应用程序生命周期,从模型选择和增强到部署和安全性。通过结合这些技术,工程师可以构建强大、可靠且安全的 LLM 驱动的应用程序,有效地利用模型功能和外部知识源。

该领域正在迅速发展,在检索、优化和部署方面不断涌现新技术。在应用扎实的工程原理的同时,及时了解这些发展将确保 LLM 应用程序在各种用例中成功实施。