一 RAG与向量检索
1.1 RAG概念
检索增强生成(Retrieval-augmented Generation),简称RAG。
RAG通常包括两个阶段:1、检索上下文相关信息;2、使用检索到的知识指导生成过程。简单来说,就像开卷考试,我们可以携带参考材料用来查找相关信息来回答问题。
1.2 RAG意义
目前对大模型的使用通常存在两个主要挑战:1、由于生成模型依赖于内在知识(权重),对于未覆盖到的知识领域可能会产生大量的幻觉,也就是“一本正经的胡说八道”;其次,由于大模型参数量巨大,重新训练或微调方法成本过高。
1.3 RAG应用框架
RAG应用框架如下图所示,包含文本向量化、检索向量数据库、获取上下文(相关知识/文档)、prompt构造、调用大模型执行文本生成等主要环节。
当然这里只是描述了一个主流程,实际应用还有对多轮/历史会话处理、多轮问题改写,意图识别与分发,结果聚合等等。
二 向量数据库
由于介绍RAG的文章已经很多,本篇主要打算介绍向量数据库部分,所以不再对RAG进行赘述。
2.1 向量数据库方案
目前已经有十几种可选的向量数据库技术方案,包括Milvus、MongoDB Atlas、Chroma、Weaviate等。从分类的角度说,包括:原生向量数据库(Chroma、LanceDB、Mivus等)、支持向量的全文检索数据库(Elastic、Lucene、OpenSearch和Solr)、支持向量的NoSQL数据库(Cassandra、Rockset、Azure Cosmos DB和MongoDB)、和支持向量的关系数据库(PostgreSQL、Clickhouse、SingleStoreDB等)。
主流向量数据库的部分指标对比如下:
通常大模型应用场景,Milvus等原生向量数据库是最推荐的。但根据实际使用场景和习惯,在知识库数量并不是很大的场景(亿级以下),考虑到使用习惯和学习复杂度,也可以选择PgSQL等关系型数据库。
2.2 PgSql与PgVector
Postgres 通过 pg_vector 和 pg_embdding 两个插件来实现向量数据库,让PG数据库支持向量索引检索的能力。其索引算法使用的是基于Faiss的IVF Flat索引,提供了优异的召回率。
三 基于PgSql的向量检索示例
3.1 建立向量库
如下建表语句所示,向量库主要文档内容和embedding(文档向量化结果)。考虑到在实际应用场景可能涉及文档权限控制,或展示参考资料,我们还设计了文档名、文档id字段。
-- vector.knowledge_doc_vector definition`` ``-- Drop table`` ``-- DROP TABLE vector.knowledge_doc_vector;`` ``CREATE TABLE vector.knowledge_doc_vector (` `id bigserial NOT NULL,` `doc_id bigserial NOT NULL,` `embedding public.vector NULL,` `doc_content text NULL,` `doc_name varchar NULL,` `doc_page varchar NULL,` `CONSTRAINT knowledge_doc_vector_pkey PRIMARY KEY (id)``);
示例数据如下:
3.2 Mybatis连接PgSql
除了mybatis-plus之外,引入pgsql和pgvector两个依赖:
<dependency>` `<groupId>com.baomidou</groupId>` `<artifactId>mybatis-plus-boot-starter</artifactId>` `<version>3.5.3.1</version>` `</dependency>` `<dependency>` `<groupId>org.postgresql</groupId>` `<artifactId>postgresql</artifactId>` `<version>42.6.0</version>` `</dependency>` `<dependency>` `<groupId>com.pgvector</groupId>` `<artifactId>pgvector</artifactId>` `<version>0.1.6</version>` `</dependency>
3.3 编写mapper
用于查找相似向量,按照余弦相似度计算
import com.baomidou.mybatisplus.core.mapper.BaseMapper;``import com.fawvw.pms.vector.domain.dto.KnowledgeDocVectorDTO;``import com.fawvw.pms.vector.domain.entity.KnowledgeDocVector;``import com.google.gson.Gson;``import org.apache.ibatis.annotations.Mapper;``import org.apache.ibatis.annotations.SelectProvider;`` ``import java.util.Arrays;``import java.util.List;``import java.util.Map;`` ``@Mapper``public interface VectorMapper extends BaseMapper<KnowledgeDocVector> {` `@SelectProvider(type = SqlProvider.class, method = "findUsersWithSimilarVectors")` `List<KnowledgeDocVectorDTO> findUsersWithSimilarVectors(double[] targetVector);`` ` `static class SqlProvider {` `public String findUsersWithSimilarVectors(Map<String, Object> param) {` `System.out.println("param keys:" + new Gson().toJson(param.keySet()));` `double[] targetVector = (double[]) param.get("array");` `String sql = "SELECT id, doc_id, embedding, doc_content, " +` `"cosine_distance(embedding, '" + Arrays.toString(targetVector) + "') AS similarity " +` `"FROM knowledge_doc_vector " +` `"ORDER BY similarity DESC";` `return sql;` `}` `}``}
3.4 方法中调用,查询相似向量
下面示例代码使用的是阿里的灵积服务计算embedding,也可以采用其他方式计算。
public List findSimilarVector(String query) {` `// query转为向量` `TextEmbeddingResult embeddingResult = dashCodeHttpApi.textEmbedding(query);` `List<Double> embeddings = embeddingResult.getOutput().getEmbeddings().get(0).getEmbedding();` `double[] vector = new double[embeddings.size()];` `for (int i = 0; i < embeddings.size(); i++) {` `Double embedding = embeddings.get(i);` `vector[i] = embedding;` `}` `log.info("vector:{}", vector);` `List<KnowledgeDocVectorDTO> vectorDTOList = vectorMapper.findUsersWithSimilarVectors(vector);` `log.info("vectorDTOList:{}", vectorDTOList);` `// 过滤掉相似度低的向量检索结果 阈值:0.7` `vectorDTOList = vectorDTOList.stream()` `.filter(vectorDTO -> vectorDTO.getSimilarity() <= 0.7)` `.collect(Collectors.toList());`` ` `return vectorDTOList;` `}
拿到与问题相关的文档知识之后,我们就可以封装prompt,并调用大模型API获取生成式回答了。具体方法留在下一篇中给出。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。