论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
人工智能
›
人工智能
›
RAG 示例:利用 langchain、Redis、llama.cpp 构建一个 ...
RAG 示例:利用 langchain、Redis、llama.cpp 构建一个 kubernetes 知识库 ...
麻花痒
论坛元老
|
2024-11-26 00:28:05
|
显示全部楼层
|
阅读模式
楼主
主题
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 文件拉取依赖的服务:
version: "3.9"
services:
redis:
image: redis/redis-stack:7.4.0-v1
container_name: redis
ports:
- "6379:6379" # 映射 Redis 默认端口
- "8001:8001" # 映射 RedisInsight 默认端口
llama_cpp_server:
image: ghcr.io/ggerganov/llama.cpp:server
container_name: llama_cpp_server
ports:
- "8080:8080"
volumes:
- ~/ai-models:/models # 映射主机路径到容器
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
复制代码
代码示例如下:
代码释义:
加载文档:利用 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)
复制代码
存储至向量数据库:将文本和向量存储至 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 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
麻花痒
论坛元老
这个人很懒什么都没写!
楼主热帖
【SQL server速成之路】——身份验证及 ...
2022年安装Kali Linux最详细过程,以及 ...
容器开发运维人员的 Linux 操作机配置 ...
ping命令 网络抓包 分析
窄带传输与LoRa扩频传输技术应用方案对 ...
我今年12岁了,我喜欢打游戏,怎么能成 ...
程序员坐牢了,会被安排去写代码吗? ...
猜
密码学奇妙之旅、02 混合加密系统、AES ...
kubectl使用技巧:如何更方便地操作多 ...
标签云
渠道
国产数据库
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
前端开发
linux
云原生
网络安全
快速回复
返回顶部
返回列表