RAG示例:使用langchain、Redis和llama.cpp构建Kubernetes问答知识库

2024年11月20日 由 alex 发表 27 0

RAG(检索增强生成)是一种被广泛采用的方法,通过结合额外的知识来缓解大型语言模型(LLM)中的幻觉问题(自信地生成错误反应)。


RAG 系统概述


4


如图所示,该RAG系统由两个主要组件组成:

  • 索引:构建知识库。
  • 检索和生成:从知识库中检索相关信息并生成响应。


索引阶段构建知识库的过程涉及四个步骤:

  1. 加载:从 PDF、DOC、Markdown 或网页等格式导入知识。
  2. 拆分:由于 LLM 的上下文长度限制,将文档分成更小的部分。
  3. 嵌入:将文本数据转换为向量表示。
  4. 存储在 VectorDB 中:将文本及其嵌入保存在向量数据库中,形成知识库。


检索和生成过程也包括四个步骤:

  1. 嵌入:将用户查询转换为向量。
  2. 搜索 VectorDB:从知识库中检索语义相似的文本段落。
  3. 提示:将检索到的段落与用户查询结合起来以创建提示。
  4. LLM:将提示提交给 LLM 以生成最终答案。


与直接查询 LLM 相比,该RAG系统整合了一个额外的知识库。它将用户查询与现有知识相结合,为 LLM 创建丰富的提示,使其能够提供更准确、更情境化的答案。这意味着系统RAG会用相关的实时或特定领域的信息补充用户的查询,以提高响应质量。


RAG 系统示例

langchain在这个例子中,我们将使用、Redis和构建一个 Kubernetes 知识库问答系统llama.cpp。

  • langchain是一个工具包。
  • Redis作为矢量数据库。
  • llama.cpp是一个用于加载 LLM 的开源运行时。


使用 Docker 容器环境在本地进行开发。以下docker-compose文件设置了必要的服务:


version: "3.9"
services:
  redis:
    image: redis/redis-stack:7.4.0-v1
    container_name: redis
    ports:
      - "6379:6379"   # Map Redis default port
      - "8001:8001"   # Map RedisInsight default port

  llama_cpp_server:
    image: ghcr.io/ggerganov/llama.cpp:server
    container_name: llama_cpp_server
    ports:
      - "8080:8080"
    volumes:
      - ~/ai-models:/models  # Map host path to container
    environment:
      LLAMA_ARG_MODEL: /models/llama3.2-1B.gguf
      LLAMA_ARG_CTX_SIZE: 4096
      LLAMA_ARG_HOST: "0.0.0.0"
      LLAMA_ARG_PORT: 8080


代码示例如下:


5


代码解释:

  • 加载文档:使用langchain库从Kubernetes官方文档页面抓取内容。
  • 拆分文档:使用langchain库对文档进行拆分。
  • 向量化:使用sentence_transformers库将文本转换为向量。


from sentence_transformers import SentenceTransformer
sentences = ["This is an example sentence"]
model = SentenceTransformer('sentence-transformers/all-mpnet-base-v2')
embeddings = model.encode(sentences)
print(embeddings)


  • 存储在VectorDB中:将文本和向量保存到Redis中。也可以使用其他向量数据库。
  • 查询向量化:使用相同的模型将用户的查询转换为向量。
  • 向量相似性搜索:从向量数据库中检索与用户查询相似的文本段落。
  • 生成提示:将检索到的信息与用户查询结合起来,形成一个新的提示。
  • 提交给LLM(大型语言模型):将提示发送给LLM以获取答案。


最终测试结果:


6


如上文所示,当包含额外上下文时,大型语言模型(LLM)提供的答案会有所改进。


RAG系统面临的挑战

RAG过程中的每一步都带来了独特的挑战:

  • 文档加载:如何处理不同的数据格式?这一步相对直接。
  • 文档拆分:拆分策略会影响提示的上下文,进而影响LLM的输出。
  • 嵌入:应该使用哪个模型进行向量化?
  • 向量数据库:应该选择哪个数据库?这是一个常见的技术决策。
  • 提示构建:如何将检索到的信息与用户查询结合起来?提示设计可以非常多样化。
  • LLM和运行时选择:像Llama这样的开源模型被广泛使用。运行时包括llama.cpp(或像Ollama这样的封装器)、HuggingFace/transformers和vLLM。


结论

通过引入知识库,RAG系统增强了LLM处理专业领域和实时信息的能力,使它们在回答特定领域问题时更加准确和高效。

文章来源:https://medium.com/@rifewang/rag-example-building-a-kubernetes-knowledge-base-q-a-with-langchain-redis-and-llama-cpp-3fec075cbcd2
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消