大模型学习(四、RAG)
·
LLM的缺陷
LLM作为一种技术模型,在设计和运行机制上就存在的根本性问题。
- 幻觉问题 (Hallucination):LLM有时会生成看似合理、语气自信,但实际上是错误或完全虚构的信息。这是因为模型的核心机制是基于海量数据预测下一个最可能出现的词,而非验证事实的真伪。
- 缺乏真正的理解与推理能力:尽管LLM能生成流畅的文本,但它并不真正“理解”文字背后的含义和世界运行的常识。它更像一个强大的模式模仿者,而非思考者。因此,在面对需要多步骤的逻辑推理、抽象思维或常识判断的复杂问题时,模型往往会表现不佳甚至失败。
- 知识静态与滞后:LLM的知识完全来源于其训练数据,这些数据是过去某个时间点的“静态快照”。模型无法像人类一样实时学习新知识,因此对于训练截止日期之后发生的事件、新闻或技术更新一无所知,输出的信息可能存在滞后或过时的问题。
- 上下文记忆有限:虽然最新的模型已经能处理百万级别的文本长度,但LLM的“记忆”仍然受限于其上下文窗口(Context Window)。这意味着在超长对话或处理巨型文档时,模型可能会“遗忘”早期输入的信息,导致回答不一致或丢失关键细节。此外,大多数LLM默认不具备跨会话的长期记忆能力。
- 输出不可解释:LLM的决策过程如同一个“黑箱”,其内部数千亿参数如何协同工作以生成特定输出,目前难以追溯和解释。
- 高昂的计算成本:无论是训练一个全新的LLM,还是在实际应用中让其生成回答(即推理),都需要消耗巨大的计算资源(如GPU集群)和能源。
- 安全与滥用风险:LLM容易被“提示词攻击”(Prompt Injection),即通过精心设计的输入绕过其安全限制,诱使其生成有害、冒犯性或受限的内容。
- 缺乏行动能力:LLM本身只是一个“大脑”,它只能生成文本,但无法直接与外部世界交互。它不能主动调用API查询实时天气、发送邮件、操作文件或控制智能设备。要完成这类任务,需要将其与外部工具或系统(如Agent框架)相结合。
- 内嵌偏见与歧视:由于训练数据主要来自互联网,其中包含的性别刻板印象、种族偏见、文化误解等有害内容,可能会被LLM学习并反映在其输出中。
- 法律与合规风险:LLM可能无意中生成侵犯版权的内容,或者其训练数据本身可能包含未经授权的材料。
为解决LLM 本身存在知识局限性、时效性差和“幻觉”等固有缺陷,需要结合 RAG(Retrieval-Augmented Generation,检索增强生成)以提高生成内容的的准确性、可靠性和专业性。
RAG
RAG的工作原理是首先通过一个检索组件从一个大规模的知识源或文档集合中找到与输入查询最相关的文本片段,然后将这些片段作为额外的上下文信息传递给生成组件。生成组件基于这个附加的上下文以及原始输入来生成最终的回答。这种方法有几个关键的优点:
- 提高准确性:通过引入外部知识库中的具体信息,可以显著提高回答问题的准确性,尤其是对于那些需要最新数据或非常特定领域知识的问题。
- 减少幻觉现象:LLM有时会自信地生成看似合理但实际上不正确的信息。通过使用RAG,可以使生成过程基于真实、具体的参考资料,从而减少这种“幻觉”。
- 增强上下文理解:对于复杂的查询,仅依靠模型内部参数可能无法充分捕捉所有细节。而通过检索到的相关文档段落作为补充,可以帮助模型更好地理解和响应查询。
- 灵活性:RAG允许根据不同任务的需求调整检索部分的数据源,使得它能够适应多样化的应用场景,如问答系统、摘要生成等。
无RAG请求示例:
public class RagBasicDemo {
public static void main(String[] args) {
String prompt = "今天的宁波天气如何?适合什么运动?";
String output = OpenAiUtils.textModelExecution(null,prompt);
System.out.println(output);
}
}
输出:
对不起,我无法提供实时的天气信息。不过,我可以给你一些建议,以供在不同天气条件下选择合适的运动:
1. **晴天**:适合户外运动,如跑步、骑自行车或户外瑜伽。
2. **阴天**:可以选择散步、慢跑等强度不高的运动,或者进行室内锻炼如健身操和力量训练。
3. **雨天**:更适合室内运动,如在家进行HIIT训练、瑜伽或者去健身房锻炼。
4. **很热的天气**:最好选择游泳或在早晚平均温度较低时进行轻度户外运动。
5. **寒冷天气**:可以选择滑冰、滑雪等冬季运动,或者进行室内训练以保持温暖。
建议查看当地天气预报以获取准确的天气信息,然后选择合适的运动项目。
public class OpenAiUtils {
private static final String BASE_URL = "https://api.openai-hk.com";
private static final String COMPLETIONS_URL = BASE_URL + "/v1/chat/completions";
private static final String API_KEY = "yourselfKey";
public static String textModelExecution(String model, String prompt) {
if (model == null || model.isEmpty()) {
model = "gpt-4o";
}
OkHttpClient client = new OkHttpClient().newBuilder()
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.build();
MediaType mediaType = MediaType.parse("application/json");
String json = String.format("{" +
" \"model\": \"%s\"," +
" \"messages\": [" +
" {" +
" \"role\": \"user\"," +
" \"content\": \"%s\"" +
" }" +
" ]" +
" }", model, prompt);
RequestBody body = RequestBody.create(mediaType, json);
try {
Request request = new Request.Builder()
.url(COMPLETIONS_URL)
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "application/json")
.addHeader("Authorization", "Bearer " + API_KEY)
.build();
Response response = client.newCall(request).execute();
ObjectMapper mapper = new ObjectMapper();
String responseBody = response.body().string();
// 使用 Jackson 将 JSON 字符串转换为 ChatCompletionResponse 对象
ChatCompletionResponse completionResponse = mapper.readValue(responseBody, ChatCompletionResponse.class);
String content = completionResponse.getChoices().get(0).getMessage().getContent();
return content;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
模拟外部知识库请求示例:
public class RagBasicDemo {
public static void main(String[] args) {
// 模拟外部知识库
String ragDoc = "今天宁波的天气是多云转晴,气温13~22度;杭州天气小雨转阴,气温11~17度。";
String prompt = ragDoc + "今天的宁波天气如何?适合什么运动?";
String output = OpenAiUtils.textModelExecution(null,prompt);
System.out.println(output);
}
}
输出:
今天宁波的天气是多云转晴,气温在13到22度之间。这样的天气比较适合进行户外活动,如慢跑、骑自行车或徒步旅行。气温较为适中,阳光又不会过于刺眼,是进行这些运动的好机会。不过,早晚温差较大,因此建议穿着易于增减的衣物,以应对温度变化。
RAG(检索增强生成)通过结合搜索与大语言模型(LLM)提示机制,为 LLM 提供来自外部数据源的相关信息,并以此增强其生成答案的准确性。具体而言,系统首先根据用户查询从知识库中检索相关上下文,然后将该查询与检索到的信息共同注入到发送给 LLM 的提示中,使模型能够在真实、可靠的信息基础上生成回答。
RAG工作流程

RAG(Retrieval-Augmented Generation,检索增强生成)的工作流程是一个“先检索、再生成”的两阶段 pipeline,核心目标是让大语言模型(LLM)在回答问题时能够参考外部知识库中的真实、相关、最新信息,从而提升答案的准确性、可信度和时效性。
以下是 RAG 的标准工作流程(共 5 个步骤):
- 接收用户查询(Query Input)
- 用户输入一个自然语言问题
- 查询预处理与向量化(Query Embedding)
- 对原始查询进行清洗、标准化(可选)
- 使用嵌入模型(Embedding Model,如 BGE、text-embedding-3-small 等)将查询转换为稠密向量(Dense Vector),用于语义匹配。
- 从知识库中检索相关文档(Retrieval)
- 在预先构建好的外部知识库(如企业文档、法规库、FAQ、数据库等)中执行检索:
- 向量检索:计算查询向量与知识库中文档片段(chunks)向量的相似度(通常用余弦相似度),返回 Top-K 最相关片段。
- 可选混合检索:结合关键词检索(如 BM25)提升召回率。
- 示例检索结果
- 在预先构建好的外部知识库(如企业文档、法规库、FAQ、数据库等)中执行检索:
- 构造增强提示(Prompt Augmentation)
- 将原始查询 + 检索到的相关上下文拼接成一个新的提示(Prompt)
- 模型生成最终答案(Generation)
- 将增强后的提示发送给 LLM。
- LLM 基于提供的上下文生成有依据、少幻觉、可追溯的回答
补充:RAG 系统的前置准备(离线阶段)
在上述流程运行前,需完成以下准备工作:
- 知识库构建:收集并整理结构化或非结构化文档(PDF、网页、数据库记录等)。
- 文档分块(Chunking):将长文档切分为合适长度的文本片段(如 512 tokens)。
- 向量化存储:使用 Embedding 模型为每个片段生成向量,并存入向量数据库(如 Milvus、Chroma、Pinecone)。
优势总结
- 无需重新训练模型即可引入新知识;
- 显著减少幻觉,提升事实准确性;
- 支持私有数据,保障企业信息安全;
- 答案可解释、可溯源(如标注“出自XX文件”)。
RAG搭建
RAG(Retrieval-Augmented Generation,检索增强生成)系统的搭建主要分为两个阶段:离线构建阶段和在线查询阶段。
离线构建阶段(知识库准备):
- 收集知识库:收集原始文档(PDF、TXT、Word、网页等)
- 文本提取:从各种格式文档中提取纯文本内容
- 文本清洗:去除无关字符、格式化文本、处理特殊符号等
- 文本分块:将长文本切分成适当大小的文本块(通常500字符左右)
- 向量化:使用嵌入模型(如text-embedding或bge-small)将每个文本块转换为向量(如384维)
- 创建索引:将向量和对应的文本块存储到向量数据库中,并建立索引以提高检索效率
在线查询阶段(问答过程):
- 用户提问:接收用户输入的问题
- 问题向量化:使用与知识库相同的嵌入模型将问题转换为向量
- 相似度计算:在向量数据库中计算问题向量与所有文本块向量的相似度
- 检索相关文档:返回Top-K(如Top3)最相关的文本块
- 生成答案:将用户问题和检索到的相关文本块一起输入大语言模型,生成最终答案
核心概念:
- 知识库(Knowledge Base):包含特定领域或组织的专业知识的文档集合,是RAG系统的信息来源。可以是PDF、Word、Excel、网页等各种格式的文档。
- 块(Chunk):将原始文档切分后的文本片段。由于大语言模型有上下文长度限制,且长文档难以精确匹配,因此需要将文档分割成适当大小的块(通常200-1000字符)。
- 向量(Vector/Embedding):通过嵌入模型将文本转换成的数值向量表示。向量能够捕捉文本的语义信息,语义相似的文本在向量空间中的距离较近。
- 索引(Index):向量数据库中用于加速相似度搜索的数据结构。常见的索引类型包括IVF_FLAT、HNSW等,它们通过不同的算法优化向量检索效率。
- 检索(Retrieval):根据用户查询在知识库中查找最相关信息的过程。在RAG中,通过计算查询向量与知识库向量的相似度(如余弦相似度)来实现语义检索。
更多推荐
所有评论(0)