RAG 示例:利用 langchain、Redis、llama.cpp 构建一个 kubernetes 知识库 ...

打印 上一主题 下一主题

主题 1986|帖子 1986|积分 5958

RAG(Retrieval Augmented Generation 检索加强生成)是现在业界中的一种主流方法,通过增长额外知识的方式来减少大语言模子(LLM)的幻觉问题(一本正经的胡说八道)。
RAG 系统概览


如上图所示,RAG 系统可以分为两个部分:


  • Indexing:构建知识库。
  • Retrieval & Generation:从知识库中获取相干信息,然后生成结果。
Indexing 构建知识库的过程可以分为四步:

  • Load:加载 PDF、doc、markdown、web 等等形式的知识数据。
  • Split:由于 LLM 上下文大小的限制,需要将文档进行切割。
  • Embedding:将文本转换为向量。
  • store to VectorDB:将文本内容和向量存储至向量数据库,即知识库。
Retrieval & Generation 的过程也是四步:

  • Embedding:将用户提出的问题转换为向量。
  • search VectorDB:从知识库中查询与问题语义相近的文本段落。
  • prompt:将检索出来的文本段落与用户问题归并,生成 prompt。
  • LLM:将 prompt 提交给大语言模子,得到终极答案。
从上述过程中可以看到,相较于直接把问题提交给 LLM 得到答案,RAG 系统额外构建了一个知识库,而且会把问题跟已有知识相结合,生成新的 prompt 后再提交给 LLM 得到答案。
换句话说,RAG 系统就是在用户提出的问题之外,额外增长了一些上下文/背景信息,这些信息可以是实时信息、也可以是专业范畴信息,以此从 LLM 得到更好的答复。
RAG 系统示例

在本示例中,我将利用 langchain、Redis、llama.cpp 构建一个 kubernetes 知识库问答。
langchain 是一个工具包,Redis 被我用作向量数据库,llama.cpp 是一个开源的加载大语言模子的运行时步伐。
我在本地利用了 Docker 容器环境进行开发,通过以下 docker-compose 文件拉取依赖的服务:
  1. version: "3.9"
  2. services:
  3.   redis:
  4.     image: redis/redis-stack:7.4.0-v1
  5.     container_name: redis
  6.     ports:
  7.       - "6379:6379"   # 映射 Redis 默认端口
  8.       - "8001:8001"   # 映射 RedisInsight 默认端口
  9.   llama_cpp_server:
  10.     image: ghcr.io/ggerganov/llama.cpp:server
  11.     container_name: llama_cpp_server
  12.     ports:
  13.       - "8080:8080"
  14.     volumes:
  15.       - ~/ai-models:/models  # 映射主机路径到容器
  16.     environment:
  17.       LLAMA_ARG_MODEL: /models/llama3.2-1B.gguf
  18.       LLAMA_ARG_CTX_SIZE: 4096
  19.       LLAMA_ARG_HOST: "0.0.0.0"
  20.       LLAMA_ARG_PORT: 8080
复制代码
代码示例如下:

代码释义:


  • 加载文档:利用 langchain 抓取 kubernetes 官方文档页面内容。
  • 切割文档:利用 langchain 切割文档。
  • 向量化:利用 sentence_transformers 将文本转换为向量:
  1. from sentence_transformers import SentenceTransformer
  2. sentences = ["This is an example sentence"]
  3. model = SentenceTransformer('sentence-transformers/all-mpnet-base-v2')
  4. embeddings = model.encode(sentences)
  5. print(embeddings)
复制代码


  • 存储至向量数据库:将文本和向量存储至 Redis,你也可以利用别的向量数据库。
  • 用户提问向量化:利用同样的模子将用户提出的问题转换为向量。
  • 向量相似性检索:从向量数据库中检索出与提问相似的文本段落。
  • 组合生成 prompt:将检索出来的信息与用户提问一起归并生成新的 prompt。
  • 将 prompt 提交给 LLM 得到答案。
终极的测试结果如下:

可以看到,加了上下文之后,LLM 给出的答案更好了。
RAG 面临的挑战

RAG 的每一步几乎都面临挑战:


  • 如何加载不同形式的文档数据?这一步问题倒不大。
  • 如何切割文档?切割的结果影响了 prompt 的上下文信息,因此也会影响 LLM 生成的结果。
  • 如何做 embedding,选择哪种模子?
  • 选择哪个向量数据库?常见的技能选型问题。
  • 如何将检索出来的信息与用户提问一起归并成新的 prompt?prompt 本来就可以五花八门。
  • 选择哪个 LLM 以及运行时?就模子而言,Llama 系列算是最火的开源模子了;而运行时则有 llama.cpp(大概在其之上封装的 Ollama)、HuggingFace/transformers、vLLM 等等。
总结

RAG 系统通过引入知识库,扩展了 LLM 对专业范畴和实时信息的支持能力,使其在答复专业问题时更加正确高效。
(我是凌虚,关注我,无广告,专注技能,不煽惑感情,欢迎与我交流)

参考资料:


  • https://python.langchain.com/docs/tutorials/rag/
  • https://huggingface.co/sentence-transformers/all-mpnet-base-v2
  • https://github.com/ggerganov/llama.cpp/blob/master/examples/server/README.md
  • https://redis.io/docs/latest/develop/interact/search-and-query/query/vector-search/

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表