打造个人RAG,零基础也能快速搭建检索生成系统

部署运行你感兴趣的模型镜像

获取免费大模型APIKEY

这里我们选择使用 智谱 的,操作很简单,访问下面链接,注册登录。

https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys   

然后按图示步骤操作,如果你登录后不在APIKEY生成页面,也可以先点击右上角的钥匙按钮进入,然后点击添加新的API Key

给一个名字,方便后面区分(比如后面有其他业务或者学习使用其他的API Key ,后续可以区分调用来源)。

创建完成后,页面上点击复制即可。(看图示操作)

注意智谱的 embedding-2 模型不免费提供,需要先访问下方链接购买下,测试买这个7.5元的即可。(“图”方便就不找免费的代替了,欢迎评论区分享)

https://open.bigmodel.cn/tokenspropay?productIds=product-074   

模型测试调用

安装需要的包:

pip install faiss-cpu scikit-learn scipy openai   

首先创建一个 client,后面可以使用 client 调用各种接口模型。

'''   代码来源:github.com/datawhalechina/wow-rag   '''   # 智谱调用   from openai import OpenAI      api_key = "上一步骤复制的api_key"   base_url = "https://open.bigmodel.cn/api/paas/v4/"   chat_model = "glm-4-flash"   emb_model = "embedding-2"      client = OpenAI(       api_key = api_key,       base_url = base_url   )   

对话模型使用的是 glm-4-flash,嵌入式模型模型使用的 embedding-2

调用对话模型 glm-4-flash

很固定的格式,调用了 client.chat.completions.create函数,主要参数有:

  • model,使用的模型

  • messages,消息列表

  • stream,是否使用流式输出

'''   代码来源:github.com/datawhalechina/wow-rag   '''   # 使用 OpenAI 的 Chat Completions API 创建一个聊天完成请求   prompt = "你好,你可以做什么,列5点"   response = client.chat.completions.create(       model=chat_model,  # 填写需要调用的模型名称       messages=[           {"role": "user", "content": prompt},       ],       stream=True,   )   # 流式输出   if response:       # 遍历响应中的每个块       for chunk in response:           # 获取当前块的内容           content = chunk.choices[0].delta.content           # 如果内容存在           if content:               # 打印内容,并刷新输出缓冲区               print(content, end='', flush=True)   

调用嵌入式模型 embedding-2

首先 clone github.com/datawhalechina/wow-rag 内容,作为源料,

git clone https://github.com/datawhalechina/wow-rag   

然后读取 wow-rag/docs/第1课-手搓一个土得掉渣的RAG.md 文档作为测试 embedding 源料,读取后再使用 for 循环进行了简单的分块处理,设置每个文本块的大小为 150 个字符,结果存储在 chunks 变量。

'''   代码来源:github.com/datawhalechina/wow-rag   '''   with open("./wow-rag/docs/第1课-手搓一个土得掉渣的RAG.md") as f:       embedding_text = f.read()   # 设置每个文本块的大小为 150 个字符   chunk_size = 150   # 使用列表推导式将长文本分割成多个块,每个块的大小为 chunk_size   chunks = [embedding_text[i:i + chunk_size] for i in range(0, len(embedding_text), chunk_size)]   

接下来就是主要代码了,核心逻辑流程如下:

  • 嵌入生成

  • 使用 OpenAI API 将文本块转换为嵌入向量,并将结果存入 embeddings 列表。

  • 归一化处理

  • 调用 normalize 方法对嵌入向量进行归一化处理。

  • 向量存储

  • 使用 faiss.IndexFlatIP 创建一个用于内积相似性计算的索引。

  • 将归一化后的向量存入索引。

  • 索引查询

  • 使用 index.ntotal 获取索引中的向量总数。

输出

  • 打印索引中的向量总数,验证是否成功存储。

Tips 为什么要归一化?
若向量未归一化,则内积值不仅受方向影响,还受模长的影响。向量经过归一化后模为1,则内积等价于余弦相似性,确保仅计算方向的相似性。

'''   代码来源:github.com/datawhalechina/wow-rag   '''   # 用于对数据进行归一化处理,使每个嵌入向量的模为1   from sklearn.preprocessing import normalize   import numpy as np   # 一个高效的相似性搜索库,用于存储和检索向量   import faiss   import time      # 初始化一个空列表来存储每个文本块的嵌入向量   embeddings = []      print("开始向量化存储~")   t1 = time.time()   # 遍历每个文本块   for chunk in chunks:       # 使用 OpenAI API 为当前文本块创建嵌入向量       response = client.embeddings.create(           model=emb_model,           input=chunk,       )              # 将嵌入向量添加到列表中       embeddings.append(response.data[0].embedding)      # 使用 sklearn 的 normalize 函数对嵌入向量进行归一化处理   normalized_embeddings = normalize(np.array(embeddings).astype('float32'))      # 获取嵌入向量的维度   d = len(embeddings[0])      # 创建一个 Faiss 索引,用于存储和检索嵌入向量   index = faiss.IndexFlatIP(d)      # 将归一化后的嵌入向量添加到索引中   index.add(normalized_embeddings)      print(f"完成向量化存储~耗时:{round(time.time()-t1, 2)}s")   t1 = time.time()      # 获取索引中的向量总数   n_vectors = index.ntotal      print(n_vectors)   

综合使用

首先写一个函数match_text用于找到与输入文本最相似的前k个文本块。代码运行逻辑:

  • 问题转化为嵌入向量: 利用 OpenAI 接口代码调用嵌入模型(embedding-2),将输入文本块转化为嵌入向量

  • Faiss 索引: 归一化处理后,通过 index.search 函数高效检索最相似的K个嵌入向量

  • 返回结果: 遍历打印匹配的嵌入向量对应的内容,并返回

'''   代码来源:github.com/datawhalechina/wow-rag   '''   from sklearn.preprocessing import normalize   def match_text(input_text, index, chunks, k=2):       """       在给定的文本块集合中,找到与输入文本最相似的前k个文本块。          参数:           input_text (str): 要匹配的输入文本。           index (faiss.Index): 用于搜索的Faiss索引。           chunks (list of str): 文本块的列表。           k (int, optional): 要返回的最相似文本块的数量。默认值为2。          返回:           str: 格式化的字符串,包含最相似的文本块及其相似度。       """       # 确保k不超过文本块的总数       k = min(k, len(chunks))          # 使用OpenAI API为输入文本创建嵌入向量       response = client.embeddings.create(           model=emb_model,           input=input_text,       )       # 获取输入文本的嵌入向量       input_embedding = response.data[0].embedding       # 对输入嵌入向量进行归一化处理       input_embedding = normalize(np.array([input_embedding]).astype('float32'))          # 在索引中搜索与输入嵌入向量最相似的k个向量       distances, indices = index.search(input_embedding, k)       # 初始化一个字符串来存储匹配的文本       matching_texts = ""       # 遍历搜索结果       for i, idx in enumerate(indices[0]):           # 打印每个匹配文本块的相似度和文本内容           print(f"similarity: {distances[0][i]:.4f}\nmatching text: \n{chunks[idx]}\n")           # 将相似度和文本内容添加到匹配文本字符串中           matching_texts += f"similarity: {distances[0][i]:.4f}\nmatching text: \n{chunks[idx]}\n"          # 返回包含匹配文本块及其相似度的字符串       return matching_texts   

调用测试:

input_text = "教程使用了哪些模型"   matching_texts = match_text(input_text, index=index, chunks=chunks, k=3)   print(matching_texts)   

有了检索函数match_text,接下来我们写一个简单的调用即可完成一个简单的RAG检索demo,运行逻辑:

  • 输入要检索的问题

  • 调用 match_text 从向量库中查找出相似度最高的3个记录

  • 将查找出的内容和问题一起丢给大模型,让 大模型 基于查找内容进行回复

'''   代码来源:github.com/datawhalechina/wow-rag   '''   def get_completion_stream(prompt):       """       使用 OpenAI 的 Chat Completions API 生成流式的文本回复。          参数:           prompt (str): 要生成回复的提示文本。          返回:           None: 该函数直接打印生成的回复内容。       """       # 使用 OpenAI 的 Chat Completions API 创建一个聊天完成请求       response = client.chat.completions.create(           model=chat_model,  # 填写需要调用的模型名称           messages=[               {"role": "user", "content": prompt},           ],           stream=True,       )       # 如果响应存在       if response:           # 遍历响应中的每个块           for chunk in response:               # 获取当前块的内容               content = chunk.choices[0].delta.content               # 如果内容存在               if content:                   # 打印内容,并刷新输出缓冲区                   print(content, end='', flush=True)      input_text = "教程使用了哪些模型"   matching_texts = match_text(input_text, index=index, chunks=chunks, k=3)   prompt = f"""   根据找到的文档   {matching_texts}   生成   {input_text}   的答案,尽可能使用文档语句的原文回答。不要复述问题,直接开始回答,注意使用中文回复。   """   get_completion_stream(prompt)   

恭喜你,跟着跑到这里,你就完成了一个最简单的 RAG 项目,通过这个项目你可以很直观的了解到 RAG检索增强生成系统的运行流程、核心思路,这看似很简单,实际还有很多需要优化的地方,比如:怎么切分导入文本才是最优的 、数据如何长期存储、导入数据向量化操作如何并发等等。

欢迎大家去wow-rag项目学习后面更多内容,有什么问题或者想法也欢迎大家评论区交流反馈,也可以直接加我微信交流。

https://github.com/datawhalechina/wow-rag   

今天就分享到这,我是老表,想要成为一名终身学习者。

那么,如何系统的去学习大模型LLM?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~

篇幅有限,部分资料如下:

👉LLM大模型学习指南+路线汇总👈

💥大模型入门要点,扫盲必看!
在这里插入图片描述
💥既然要系统的学习大模型,那么学习路线是必不可少的,这份路线能帮助你快速梳理知识,形成自己的体系。

路线图很大就不一一展示了 (文末领取)
在这里插入图片描述

👉大模型入门实战训练👈

💥光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

👉国内企业大模型落地应用案例👈

💥两本《中国大模型落地应用案例集》 收录了近两年151个优秀的大模型落地应用案例,这些案例覆盖了金融、医疗、教育、交通、制造等众多领域,无论是对于大模型技术的研究者,还是对于希望了解大模型技术在实际业务中如何应用的业内人士,都具有很高的参考价值。 (文末领取)
在这里插入图片描述

👉GitHub海量高星开源项目👈

💥收集整理了海量的开源项目,地址、代码、文档等等全都下载共享给大家一起学习!
在这里插入图片描述

👉LLM大模型学习视频👈

💥观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。 (文末领取)
在这里插入图片描述

👉640份大模型行业报告(持续更新)👈

💥包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
在这里插入图片描述

👉获取方式:

这份完整版的大模型 LLM 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值