引言
术语定义
在深入技术细节之前,我们需要明确几个核心概念:
- LLM (Large Language Model):大语言模型。如 ChatGPT、Llama、Qwen(千问)、文心一言、Kimi 等。它们是基于海量数据训练而成的生成式 AI 模型。
- LangChain:一个用于开发 LLM 应用的高级框架。它提供了对 AI 基础功能的抽象封装,帮助开发者从重复的基础代码中脱离,快速构建复杂的应用流程。
- RAG (Retrieval Augmented Generation):检索增强生成。这是一种通过引入外部知识库来增强 LLM 生成能力的技术架构。
- Fine-Tuning (指令微调):微调。指利用特定领域的私有化数据集对预训练模型进行进一步训练,使其适应特定任务或风格。
概述
关键技术:RAG(检索增强生成)
定义与意义
Retrieval Augmented Generation(检索增强生成)的核心作用是在生成最终答案之前,先对现有文档进行检索,而不是完全依赖 LLM 内部的知识参数。
主要解决的问题:
- 知识时效性限制:LLM 的训练数据有截止时间。例如,ChatGPT 3.5 的知识更新到 2021 年 9 月,之后的新知识无法知晓。
- 私有知识缺失:企业内部的非公开知识(如业务操作指南、合同条款)无法被通用模型学习。
- 幻觉问题:优化/解决 LLM 胡说八道的问题。
通俗解释:
LLM 本身的内容存在时间限制,而 RAG 则是添加一个私密的、专业的外挂知识集。例如,将企业的《业务操作指南》交给 LLM,让 LLM 去查询并阅读这本指南,综合多个章节内容后回答问题。简单来说,就是给 LLM 我们自己的知识内容,让它根据给出的知识去回答,而不是让它凭空捏造。
当内容非常多(上百万字)时,人工查找十分困难,而 LLM 可以快速理解知识并给出符合要求的答案。
RAG 与 Fine-Tuning 的区别
- Fine-Tuning(微调):是在修改模型权重,给模型增加了新内容。微调后的模型专用性越强,通用性越弱。微调的内容通常是一问一答,即一个明确的问题有确定的回答,避免回答的随机性。如果只是一问一答且语义固定,直接检索即可;但 Fine-Tuning 能让 LLM 将相似语义表述认定为同一个问题(如'吃了火锅窜稀'和'吃了火锅拉肚子'视为相同),这是传统检索不具备的语义泛化能力。
- RAG:相当于是给 LLM 加了一个外挂知识库,LLM 本身并没有变化,只是在回答问题时,从知识库中摘取内容进行回答。它更适合处理动态变化的知识或需要引用来源的场景。
RAG 的工作流程
要把我们的知识给 LLM,RAG 技术通常包含以下步骤:
- 文档加载 (Document Loading):读取原始文件(PDF, TXT, Markdown 等)。
- 文档分割 (Document Splitting):将长文本切分为适合模型处理的 Chunk(块)。
- 文档嵌入 (Embedding):将文本块转换为向量表示。
- 向量化存储 (Vector Storage):将向量存入向量数据库。
- 文档检索 (Retrieval):根据用户查询检索相关向量。
- 生成回答 (Generation):结合检索到的上下文和 Prompt 生成最终答案。
RAG 的组成
一个典型的 RAG 框架可以分为两个核心部分:
-
检索器 (Retriever)
- 检索过程:包括为数据做切分、生成嵌入向量 (Embedding)、构建索引 (Chunks Vectors),再通过向量检索召回相关结果。
-
生成器 (Generator)
- 生成过程:利用基于检索结果 (Context) 增强的 Prompt 来激活 LLM 以生成回答 (Result)。
关键技术:Ollama(LLM 私有部署与运行环境框架)
Ollama 是大语言模型的运行环境。LLM 并不是一个可执行文件,需要依托于一个运行环境才可以使用。
- 特点:Ollama 体积小巧(约 200M+),任何电脑都可以安装。它没有 GUI,主要通过命令行 (CMD/Terminal) 运行。
- 优势:支持本地部署多种开源模型(如 Llama, Qwen 等),无需联网调用 API,保护数据隐私。
- 配置要求:
- 7B 模型:至少 8GB 内存。
- 14B 模型:至少 16GB 内存。
- 72B 模型:至少 64GB 内存。
关键技术:LangChain(LLM 编程框架)
LangChain 是一个 LLM 编程框架,它将基础功能整合封装,减少工作量。它本身不是 LLM,需要配合已安装的 LLM 或使用在线 API。
LangChain 的几大模块:
- 提示模板 (Prompt Templates)
- 示例选择器 (Example Selectors)
- 聊天模型 (Chat Models)
- LLMs
- 输出解析器 (Output Parsers)
- 文档加载器 (Document Loaders)
- 文本拆分器 (Text Splitters)
- 嵌入模型 (Embeddings)
- 向量存储 (Vector Stores)
- 检索器 (Retrievers)
- 索引 (Indexes)
- 工具 (Tools)
- 代理 (Agents)
- 多模态 (Multimodal)
- 回调 (Callbacks)
LangChain 的价值在于其组件的模块化。无论是否使用框架的其他部分,组件都易于复用。现成的链 (Chains) 用于完成特定高级任务,对于更复杂的应用,可以通过组合组件建立新链。
实战案例:基于 LangChain 完成代码任务
为了实现基于 LLM 的代码任务,我们需要准备以下环境:
- 使用
Ollama 在本地配置一个 LLM。
- 配置好 Python 集成开发环境(如 PyCharm)。
- 安装
langchain 及相关依赖库。
Step 1: 安装本地部署与运行环境 Ollama
下载并安装 Ollama 后,输入 ollama -v 确认版本信息正常。
Step 2: 安装大语言模型 QWen2
Ollama 只是一个运行环境,需要拉取具体的模型。这里选择阿里的 QWEN2。
ollama run qwen2
如果电脑性能一般,运行速度可能会较慢。下载完成后,再次输入 ollama run qwen2 即可开始对话。
注意:Ollama 的接口服务器默认占用 11434 端口。可以在浏览器中访问 http://localhost:11434 查看服务状态。
Step 3: 安装 Python 集成开发环境并配置 LangChain
确保 Python 环境就绪,升级 pip 并安装必要的库:
python.exe -m pip install --upgrade pip
pip install langchain
pip install langchain-community
pip install beautifulsoup4
Step 4: 编写代码示例
完成环境准备后,我们可以编写一个简单的对话脚本。这段代码展示了如何使用 LangChain 的组件处理提示词、调用模型并解析输出。
from langchain.prompts import ChatPromptTemplate
from langchain_community.llms import Ollama
from langchain.output_parsers import CommaSeparatedListOutputParser
def chat():
prompt = ChatPromptTemplate.from_messages([
("system", "{parser_instructions}"),
("human", "列出{cityName}的{viewPointNum}个著名景点。")
])
model = Ollama(model="qwen2")
output_parser = CommaSeparatedListOutputParser()
parser_instructions = output_parser.get_format_instructions()
final_prompt = prompt.invoke({
"cityName": "成都",
"viewPointNum": 4,
"parser_instructions": parser_instructions
})
response = model.invoke(final_prompt)
print("----- response -----")
print(response)
ret = output_parser.invoke(response)
print("------ret-----")
print(ret)
if __name__ == "__main__":
chat()
代码解析:
- Prompt Template:使用
ChatPromptTemplate 定义系统指令和用户问题。system 中的 parser_instructions 是对输出的格式要求,human 中的 cityName 和 viewPointNum 是动态参数。
- Model:定义使用的 LLM,此处指定了
qwen2。
- Output Parser:使用
CommaSeparatedListOutputParser 将模型返回的字符串解析为列表。LangChain 还支持 DatetimeOutputParser、EnumOutputParser 等多种解析器。
- Invoke:
invoke 是 LangChain 的核心方法,用于触发链的执行。prompt.invoke 将输入绑定到模板,model.invoke 提交给 LLM,output_parser.invoke 将结果转为结构化数据。
此外,LangChain 支持 LCEL (LangChain Expression Language) 表达语言,可以将上述步骤简化为链式调用:
chain = prompt | model | output_parser
result = chain.invoke({"cityName": "成都", "viewPointNum": 4, "parser_instructions": parser_instructions})
print(result)
这种表达方式更加直观,体现了 LangChain 将工作流串起来的优势,避免了 invoke 满天飞的情况。
总结与展望
通过本文的介绍,我们了解了 LLM、RAG 和 Fine-Tuning 的基本概念及其区别。RAG 通过外挂知识库解决了 LLM 知识滞后和幻觉问题,而 Fine-Tuning 则增强了模型的领域适应性。在实际开发中,Ollama 提供了便捷的本地模型运行环境,而 LangChain 则大大降低了构建 LLM 应用的复杂度。
随着大模型技术的快速发展,掌握这些工具将成为程序员的重要技能。建议开发者在实践中不断尝试不同的 RAG 策略(如混合检索、重排序)和优化 LangChain 的 Chain 结构,以获得生产级别的效果。同时,关注社区的最新动态,及时跟进新的模型能力和框架更新,才能在 AI 时代保持竞争力。