大模型应用开发极简入门
推荐书目
《大模型应用开发极简入门:基于 GPT-4 和 ChatGPT》
- 作者:奥利维·耶卡埃朗、玛丽·艾丽斯·布莱特
- 译者:何文斯
- 出版社:人民邮电出版社
- 简介:适合入门,概念清晰,篇幅适中,建议反复阅读。
《BERT 基础教程:Transformer 大模型实战》
- 作者:苏达哈尔桑·拉维昌迪兰
- 译者:周参
- 出版社:人民邮电出版社
- 简介:Transformer 原理讲解通俗易懂,适合深入理解底层机制。
1. 什么是大模型
大模型通常指大语言模型(Large Language Model, LLM)。我们可以将其拆解为三个部分理解:
- 大:指规模巨大。通过海量数据训练,包含数十亿甚至万亿级别的参数和网络层数。
- 语言:能够理解和生成自然语言(Natural Language),处理文本输入与输出。
- 模型:本质上是深度学习模型,基于神经网络架构构建。
常见的 ChatGPT 就是一种大语言模型。GPT 代表 Generative Pre-trained Transformer(生成式预训练 Transformer),核心在于其基于 Transformer 架构。
Transformer 架构详解
Transformer 是一种神经网络架构,专为处理时序任务设计,如自然语言处理(NLP)和语音识别。它解决了传统循环神经网络(RNN)的局限性:
- 长期依赖问题:RNN 在序列变长时,信息传递容易丢失,导致梯度消失或爆炸,难以捕捉远距离元素关系。
- 并行化困难:RNN 必须按顺序处理序列元素,限制了训练速度和效率。
2017 年,谷歌在论文《Attention is All You Need》中提出 Transformer,迅速成为 NLP 领域的主流架构,推动了 BERT、GPT 等模型的发展。
编码器与解码器
标准 Transformer 由编码器和解码器组成:
- 编码器(Encoder):将输入句子转换为特征向量表示。
- 解码器(Decoder):根据特征向量生成输出语句。
以文本补全为例,编码器处理输入文本,解码器逐词生成结果。
自注意力机制(Self-Attention)
注意力机制允许模型在处理输入序列时关注重要部分。自注意力机制计算序列内每个元素与其他元素的相关性。
核心概念包括三个向量:
- 查询向量 Q (Query):当前要关注的信息点。
- 键向量 K (Key):衡量其他位置信息与当前查询的相关性。
- 值向量 V (Value):通过与 Q、K 相关性加权组合形成最终输出。
计算公式如下:
$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$
其中 $d_k$ 是键向量的维度。多头注意力(Multi-Head Attention)使用多个注意力头并行计算,捕捉不同层面的语义信息。
位置编码(Positional Encoding)
由于 Transformer 不处理序列顺序(无 RNN 结构),需引入位置编码来标记词在句子中的位置。通常使用正弦和余弦函数计算位置编码矩阵,并与输入嵌入相加后送入编码器。
前馈网络与残差连接
每个注意力层后接一个全连接的前馈网络(Feed-Forward Network),通常使用 ReLU 激活函数。Add & Norm 模块结合层归一化(Layer Normalization)和残差连接(Residual Connection),有助于缓解梯度消失并加速收敛。
2. 提示词工程(Prompt Engineering)
提示词工程旨在设计有效的指令,让大模型更好地理解和执行任务。一个有效的提示词通常包含三个部分:
- 角色(Role):设定模型身份,明确职责定位。
- 上下文(Context):提供任务背景或具体情境。
- 任务(Task):明确目标,细化指令,指定输出格式。
示例对比
简单提问:
User: 请给我制定一份训练计划。
结果: 模型通常会给出通用建议,缺乏针对性。
结构化提问:
User: 你是一位专业的健身教练及营养师。我最近暴饮暴食导致体重超标,四肢无力,且附近无健身房。请从专业角度,帮我制定一份在家进行的训练计划,并按表格形式输出一周的计划和饮食建议。
结果: 模型能提供更具体、符合约束条件的方案,包含表格化的训练和饮食安排。
进阶技巧
- 思维链(Chain of Thought):在提示词末尾添加'让我们逐步思考',可提升复杂推理问题的准确率。
- 少样本学习(Few-Shot Learning):在提示词中提供几个输入输出示例,引导模型模仿格式。
- 负面提示:明确告知模型不要做什么,例如'不要包含代码'、'不要输出废话'。
- 格式化输出:要求特定格式,如 JSON、Markdown 表格、固定行数等。
- 自我反思:指示模型在回答前先检查自己的逻辑,或要求模型先提出问题以获取更多信息。
3. 大模型部署与聊天应用
为了体验大模型能力,我们可以通过本地部署开源模型。FastChat 是一个兼容 OpenAI API 语法的流行框架。
环境搭建
建议使用 Python 虚拟环境以避免依赖冲突:
conda create -n fastchat python=3.12
conda activate fastchat
pip install "fschat[model_worker,webui]"
下载模型
由于访问 HuggingFace 可能受限,可使用加速工具下载模型。以 Vicuna-7b-v1.5 为例:
git clone https://github.com/LetheSec/HuggingFace-Download-Accelerator.git
cd HuggingFace-Download-Accelerator
python hf_download.py --use_hf_transfer False --model lmsys/vicuna-7b-v1.5 --save_dir ./lmsys
cd lmsys && mv models--lmsys--vicuna-7b-v1.5 vicuna-7b-v1.5
启动服务
依次启动 Controller、Model Worker 和 API Server:
python3 -m fastchat.serve.controller
python3 -m fastchat.serve.model_worker --model-path lmsys/vicuna-7b-v1.5 --device cpu
python3 -m fastchat.serve.openai_api_server --host localhost --port 8000
API 调用示例
升级 OpenAI SDK 后,可通过 Python 脚本调用:
import openai
openai.api_key = "EMPTY"
openai.base_url = "http://localhost:8000/v1/"
model = "vicuna-7b-v1.5"
prompt = "Once upon a time"
completion = openai.completions.create(
model=model,
prompt=prompt,
max_tokens=64
)
print(prompt + completion.choices[0].text)
completion = openai.chat.completions.create(
model=model,
messages=[{"role": "user", "content": "Hello! What is your name?"}]
)
print(completion.choices[0].message.content)
Embedding 应用
Embedding 将文本转化为数值向量,保持语义相似性。可用于搜索、推荐、聚类和异常检测。
curl http://localhost:8000/v1/embeddings \
-H "Content-Type: application/json" \
-d '{
"model": "vicuna-7b-v1.5",
"input": "Hello world!"
}'
4. LangChain 框架实战
LangChain 是专为开发 LLM 驱动应用设计的框架,核心模块包括 Models、Prompts、Indexes、Chains、Agents 和 Memory。
基础安装
pip install langchain langchain_community
文档检索问答(RAG)
利用 LangChain 可以构建基于私有文档的问答系统。以下是使用 FAISS 向量库的示例:
from langchain.document_loaders import PyPDFLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain import OpenAI
loader = PyPDFLoader("ExplorersGuide.pdf")
pages = loader.load_and_split()
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(pages, embeddings)
llm = OpenAI()
chain = RetrievalQA.from_llm(llm=llm, retriever=db.as_retriever())
q = "What is Link's traditional outfit color?"
result = chain(q, return_only_outputs=True)
print(result['result'])
智能体(Agents)
Agent 可以自主决定调用哪些工具。例如,结合计算器工具解决数学问题,或调用搜索引擎获取最新信息。
from langchain.agents import initialize_agent, Tool
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
tools = [
]
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)
agent.run("Who is the CEO of Tesla? Use search tool if needed.")
5. 总结与展望
大模型应用开发正处于快速演进阶段。本文介绍了从 Transformer 基础原理到 Prompt 工程,再到本地部署与 LangChain 框架集成的完整流程。
关键技术点回顾
- Transformer 架构:理解自注意力机制和位置编码是掌握大模型的基础。
- 提示词优化:结构化提示词能显著提升模型输出的质量和稳定性。
- 本地部署:通过 FastChat 等工具,开发者可在本地运行开源模型,保障数据隐私。
- 应用开发:LangChain 简化了 RAG、Agent 等复杂场景的开发,降低了门槛。
未来方向
- 多模态融合:未来的模型将不仅处理文本,还将深度融合图像、音频和视频。
- 垂直领域微调:针对医疗、法律、金融等特定领域进行 LoRA 微调,提升专业度。
- 端侧部署:随着硬件性能提升,轻量化模型将在手机、PC 等终端设备上直接运行。
建议开发者持续关注社区动态,积极参与开源项目实践,不断积累工程经验,以适应 AI 技术的快速发展。