大模型项目实战与开发流程详解
本文详细阐述了大模型项目的开发流程与实战方法。内容涵盖大模型开发与传统 AI 开发的差异对比,介绍了从设计、架构搭建、Prompt 工程、验证迭代到前后端搭建的全生命周期管理。以个人知识库问答助手为例,深入解析了基于 LangChain 和 Chroma 的 RAG 架构实现,包括文档加载、向量化、检索链构建及 API 集成。此外,还补充了代码结构规范、最佳实践优化建议及部署维护策略,旨在帮助开发者系统化掌握大模型应用开发技能,解决实际业务问题。

本文详细阐述了大模型项目的开发流程与实战方法。内容涵盖大模型开发与传统 AI 开发的差异对比,介绍了从设计、架构搭建、Prompt 工程、验证迭代到前后端搭建的全生命周期管理。以个人知识库问答助手为例,深入解析了基于 LangChain 和 Chroma 的 RAG 架构实现,包括文档加载、向量化、检索链构建及 API 集成。此外,还补充了代码结构规范、最佳实践优化建议及部署维护策略,旨在帮助开发者系统化掌握大模型应用开发技能,解决实际业务问题。

我们将开发以大语言模型为功能核心,通过大语言模型的强大理解能力和生成能力,结合特殊的数据或业务逻辑来提供独特功能的应用称为大模型开发。
开发大模型相关应用,其技术核心点虽然在大语言模型上,但一般通过调用 API 或开源模型来实现核心的理解与生成,通过 Prompt Engineering(提示词工程)来实现大语言模型的控制。因此,虽然大模型是深度学习领域的集大成之作,大模型开发却更多是一个工程问题。
在大模型开发中,我们一般不会去大幅度改动模型,而是将大模型作为一个调用工具,通过 Prompt Engineering、数据工程、业务逻辑分解等手段来充分发挥大模型能力,适配应用任务,而不会将精力聚焦在优化模型本身上。
大模型开发与传统的 AI 开发在整体思路上有着较大的不同:
大模型开发与传统 AI 开发在评估思路上也有了质的差异:
包括确定目标,设计功能。
确定目标:在进行开发前,需要确定开发的目标,即要开发的应用的应用场景、目标人群、核心价值。一般应先设定最小化目标,从构建一个 MVP(最小可行性产品)开始,逐步进行完善和优化。
设计功能:确定开发目标后,设计本应用所要提供的功能,首先确定应用的核心功能,然后延展设计核心功能的上下游功能;例如,想打造一款个人知识库助手,核心功能就是结合个人知识库内容进行问题的回答,上游功能——用户上传知识库、下游功能——用户手动纠正模型回答,就是子功能。
搭建整体架构:搭建项目的整体架构,实现从用户输入到应用输出的全流程贯通。包括搭建整体架构和搭建数据库。
目前,绝大部分大模型应用都是采用的特定数据库 + Prompt + 通用大模型的架构。
推荐基于 LangChain 框架进行开发。LangChain 提供了 Chain、Tool 等架构的实现,可以基于 LangChain 进行个性化定制,实现从用户输入到数据库再到大模型最后输出的整体架构连接。
搭建数据库:大模型应用需要进行向量语义检索,一般使用诸如 Chroma 的向量数据库。搭建数据库需要收集数据并进行预处理,再向量化存储到数据库中。数据预处理一般包括从多种格式向纯文本的转化,例如 pdf、markdown、html、音视频等,以及对错误数据、异常数据、脏数据进行清洗。完成预处理后,需要进行切片、向量化构建出个性化数据库。
明确 Prompt 设计的一般原则及技巧,构建出一个来源于实际业务的小型验证集,基于小型验证集设计满足基本要求、具备基本能力的 Prompt。
优质的 Prompt 对大模型能力具有极大影响,需要逐步迭代构建优质的 Prompt Engineering 来提升应用性能。
验证迭代在大模型开发中是极其重要的一步,指通过不断发现 Bad Case 并针对性改进 Prompt Engineering 来提升系统效果、应对边界情况。在完成上一步的初始化 Prompt 设计后,应该进行实际业务测试,探讨边界情况,找到 Bad Case,并针对性分析 Prompt 存在的问题,从而不断迭代优化,直到达到一个较为稳定、可以基本实现目标的 Prompt 版本。
完成 Prompt Engineering 及其迭代优化之后,就完成了应用的核心功能,可以充分发挥大语言模型的强大能力。接下来搭建前后端,设计产品页面,让应用上线成为产品。
两种快速开发 Demo 的框架:Gradio 和 Streamlit,可以帮助个体开发者迅速搭建可视化页面实现 Demo 上线。
在完成前后端搭建之后,应用就可以上线体验了。接下来就需要进行长期的用户体验跟踪,记录 Bad Case 与用户负反馈,再针对性进行优化即可。
用户常用文档格式有 pdf、txt、doc 等,首先使用工具读取文本,通常使用 langchain 的文档加载器模块,也可以使用 python 比较成熟的包进行读取。
由于目前大模型使用 token 的限制,需要对读取的文本进行切分,将较长的文本切分为较小的文本,这时一段文本就是一个单位的知识。
from langchain.document_loaders import PyPDFLoader, TextLoader
loader = PyPDFLoader("example.pdf")
documents = loader.load()
使用文本嵌入 (Embeddings) 对分割后的文档进行向量化,使语义相似的文本片段具有接近的向量表示。然后,存入向量数据库,这个流程正是创建索引 (index) 的过程。
向量数据库对各文档片段进行索引,支持快速检索。这样,当用户提出问题时,可以先将问题转换为向量,在数据库中快速找到语义最相关的文档片段。然后将这些文档片段与问题一起传递给语言模型,生成回答。
Chroma 向量库轻量级且数据存储在内存中,非常容易启动和开始使用。
用户知识库内容经过 embedding 存入向量知识库,然后用户每一次提问也会经过 embedding,利用向量相关性算法(例如余弦算法)找到最匹配的几个知识库片段,将这些知识库片段作为上下文,与用户问题一起作为 prompt 提交给 LLM 回答。
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vectorstore = Chroma.from_documents(documents=documents, embedding=embeddings)
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo", openai_api_key="YOUR_API_KEY")
搭建一个基于大模型的个人知识库助手,基于 LangChain 框架搭建,核心技术包括 LLM API 调用、向量数据库、检索问答链等。项目整体架构如下:
项目从底向上依次分为 LLM 层、数据层、数据库层、应用层与服务层:
基于四种流行 LLM API(OpenAI-ChatGPT、百度文心、讯飞星火、智谱 GLM)进行了 LLM 调用封装,支持用户以统一的入口、方式来访问不同的模型,支持随时进行模型的切换;
在 LLM 层,构建了一个 Self_LLM 基类,基类定义了所有 API 的一些共同参数(如 API_Key,temperature 等);在该基类基础上继承实现了上述四种 LLM API 的自定义 LLM。四种 LLM 的原生 API 封装在了统一的 get_completion 函数中。
包括个人知识库的源数据(包括 pdf、txt、md 等)以及 Embedding API,源数据经过 Embedding 处理可以被向量数据库使用;
基于个人知识库源数据搭建的向量数据库,本项目中选择了 Chroma。在该层实现了源数据处理、创建向量数据库的方法;
应用层封装了整个项目的全部核心功能。基于 LangChain 提供的检索问答链基类进行了进一步封装,支持通过 model 参数进行不同模型切换以及便捷实现基于数据库的检索问答。
实现了两个检索问答链,分别是有历史记录的 Chat_QA_Chain 和没有历史记录的 QA_Chain;
实现了 Gradio 搭建 Demo 与 FastAPI 组建 API 两种方式来支持本项目的服务访问。
-project
-readme.md 项目说明
-requirements.txt 使用依赖包的版本
-llm LLM 调用封装
-self_llm.py 自定义 LLM 基类
-wenxin_llm.py 自定义百度文心 LLM
-spark_llm.py 自定义讯飞星火 LLM
-zhipuai_llm.py 自定义智谱 AI LLM
-call_llm.py 将各个 LLM 的原生接口封装在一起
-test.ipynb 使用示例
-embedding embedding 调用封装
-zhipuai_embedding.py 自定义智谱 AI embedding
-call_embedding.py 调用 embedding 模型
-data 源数据路径
-database 数据库层封装
-create_db.py 处理源数据及初始化数据库封装
-qa_chain 应用层封装
-qa_chain.py 封装检索问答链,返回一个检索问答链对象
-chat_qa_chian.py:封装对话检索链,返回一个带有历史记录的对话检索链对象
-get_vectordb.py 返回向量数据库对象
-model_to_llm.py 调用模型
-test.ipynb 使用示例
-serve 服务层封装
-run_gradio.py 启动 Gradio 界面
-api.py 封装 FastAPI
-run_api.sh 启动 API
-test.ipynb 使用示例
为了提高回答质量,建议采用以下策略:
大模型开发不仅仅是调用 API,更是一个系统工程。从需求分析、架构设计、数据准备、Prompt 工程到部署运维,每一个环节都需要精心打磨。通过本文介绍的开发流程和实战案例,希望能为开发者提供一套可落地的参考方案,帮助大家快速构建高质量的大模型应用。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online