Appearance
5. 通过针对性学习提升模型性能
5.1 In-context learning, e.g. ReAct
In-context learning(上下文学习)是一种让模型通过示例学习如何执行任务的方法,而不需要修改模型的权重。ReAct 就是一种典型的 in-context learning 方法。
5.1.1 ReAct 的工作原理
ReAct 通过以下步骤工作:
- 思考(Reasoning):模型分析任务,制定计划
- 行动(Acting):模型执行计划,使用工具
- 观察(Observing):模型获取工具执行结果
- 思考(Reasoning):模型基于结果调整计划
5.1.2 示例
python
# ReAct 示例提示
prompt = """
你是一个助手,能够使用工具来完成任务。
任务:查询北京今天的天气,然后计算 25 + 36 的结果。
工具:
1. Search: 用于搜索信息,参数为查询内容
2. Calculator: 用于计算数学表达式,参数为表达式
示例:
问题:查询上海今天的天气,然后计算 12 + 34 的结果。
思考:我需要先查询上海今天的天气,然后计算 12 + 34 的结果。
行动:Search("上海今天天气")
观察:上海今天晴,温度 25 度。
思考:现在我需要计算 12 + 34 的结果。
行动:Calculator("12 + 34")
观察:46
思考:任务完成,我需要总结结果。
答案:上海今天晴,温度 25 度。12 + 34 = 46。
现在开始处理当前任务:
"""5.1.3 优势
- 不需要微调:不需要修改模型权重
- 快速适应:通过示例快速适应新任务
- 灵活性:可以处理各种类型的任务
- 可解释性:展示思考过程,提高可解释性
5.2 Retrieval-based in-context learning, e.g. RAG
Retrieval-based in-context learning(基于检索的上下文学习)是一种结合了检索和生成的方法,最典型的例子是 RAG(Retrieval-Augmented Generation)。
5.2.1 RAG 的工作原理
- 检索:从外部知识库检索与查询相关的信息
- 增强:将检索到的信息与原始查询一起作为上下文
- 生成:基于增强的上下文生成回答
5.2.2 示例
python
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_texts(
["北京是中国的首都", "上海是中国的经济中心", "广州是中国的南大门"],
embeddings
)
# 创建检索器
retriever = vectorstore.as_retriever()
# 创建 RAG 链
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=retriever
)
# 使用 RAG
result = qa_chain.run("中国的首都是哪里?")
print(result)5.2.3 优势
- 知识更新:可以通过更新知识库来更新模型的知识
- 减少幻觉:基于检索到的信息生成,减少幻觉
- 提高准确性:提供最新和准确的信息
- 扩展知识:突破模型训练数据的限制
5.3 Fine-tuning based learning
Fine-tuning based learning(基于微调的学习)是一种通过修改模型权重来提高性能的方法。
5.3.1 监督微调
监督微调是使用标注数据来微调预训练模型,使其适应特定任务。
步骤:
- 收集标注数据
- 准备微调数据集
- 执行微调
- 评估微调效果
优势:
- 提高特定任务的性能
- 减少对提示工程的依赖
- 提高模型的一致性和可靠性
5.3.2 基于人类反馈的强化学习(RLHF)
RLHF 是一种通过人类反馈来优化模型行为的方法。
步骤:
- 收集人类反馈数据
- 训练奖励模型
- 使用强化学习优化模型
优势:
- 提高模型的安全性
- 使模型输出更符合人类偏好
- 减少有害输出
5.4 再次与"厨师做饭"做类比
为了更好地理解这些学习方法,我们可以再次使用厨师做饭的类比:
In-context learning:厨师通过观察食谱学习新菜
- 不需要重新学习基本技能,只需要按照食谱操作
- 快速适应新的菜肴
Retrieval-based learning:厨师查阅食谱书获取信息
- 可以获取最新的烹饪方法
- 不需要记住所有食谱
Fine-tuning:厨师通过反复练习掌握新技能
- 技能会成为本能
- 执行速度更快
- 质量更稳定
5.5 学习方法的选择
| 学习方法 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|
| In-context learning | 快速适应新任务 | 不需要修改模型 | 对示例质量要求高 |
| Retrieval-based learning | 需要最新知识 | 知识可以更新 | 检索质量影响结果 |
| Fine-tuning | 特定任务优化 | 性能高,一致性好 | 需要标注数据,成本高 |
5.6 最佳实践
5.6.1 组合使用多种学习方法
- In-context + Retrieval:通过示例引导模型使用检索工具
- Retrieval + Fine-tuning:先检索增强,再微调优化
- In-context + Fine-tuning:使用示例进行微调,提高模型的任务适应能力
5.6.2 数据准备
- 多样性:确保训练数据的多样性
- 质量:确保数据的质量和准确性
- 代表性:确保数据代表实际使用场景
5.6.3 评估和改进
- 定量评估:使用指标评估性能
- 定性评估:人工评估输出质量
- 持续改进:基于反馈不断改进
5.7 小结
- In-context learning 通过示例快速适应新任务
- Retrieval-based learning 通过外部知识提高准确性
- Fine-tuning 通过修改模型权重优化特定任务性能
- 不同学习方法适用于不同场景,应根据具体需求选择
- 组合使用多种学习方法可以获得更好的效果
现在你已经了解了如何通过针对性学习提升模型性能,接下来让我们探讨如何基于 LangChain 快速创建 Agent。
