🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光
目录
1. 前言
通过第一篇文章检索增强内容生成(RAG)1·RAG及其技术的概述-CSDN博客,我们已经知道RAG技术的作用就是用来增强生成式大语言模型(GPT4.0、GPT3.5等)。
而想要方便灵活的增强生成式大语言模型就需要用到LangChain框架,在LangChain框架中调用OpenAI的接口,同时结合RAG等技术来强化大语言模型,从而实现对LLM模型的强化
2. 概述RAG流程
完整运用RAG技术可以分为三个部分:
1、建立索引知识库(Indexing);
2、检索索引知识库(Retrieval);
3、生成增强回答(Generate Augmented answer);
如下图:
其中,
建立索引知识库(Indexing):加载(loader)--》切片(splitter)--》量化(Embedding)--》整合(Vector Database)
检索索引知识库(Retrieval):问题量化(Embedding)--》检索(相似度计算)--》相关度高的切片文档(Relevant Snippets)
生成增强回答(Generate Augmented answer):切片文档+问题输入LLM模型 --》得到增强后的生成式回答
3. 代码实现——前提准备
3.1 安装必要的Python包
pip install langchain openai weaviate-client
-
langchain
:基于大语言模型构建用于端到端语言模型应用的框架 -
openai
:用于嵌入langchain
框架的LLM -
weaviate-client
用于向量数据库
3.2 获取OpenAI API密钥
要获取 OpenAI API 密钥,需要拥有 OpenAI 账户
具体流程参照下面文章:如何获取OpenAI API Key_openai key-CSDN博客
我获得OpenAI API密钥的页面如下图:
4. 代码实现
4.1 导入API
1、在根目录下创建.env
文件,在其中定义OpenAI的API。
结构如下图:
内容如下:
OPENAI_API_KEY="你的API"
2、运行下面命令获取环境变量中的API
import dotenv
dotenv.load_dotenv()
dotenv.load_dotenv():将
.env
文件中的变量加载到当前进程的环境变量中
因此可以利用os库查看当前进程的环境变量,从而查看我们加载进来的 OPENAI_API_KEY
代码如下:
import dotenv
import os
dotenv.load_dotenv()
database_url = os.getenv('OPENAI_API_KEY')
print(f'Database URL: {database_url}')
4.2 加载文档
将文档保存在本地项目中,命名为state_of_the_union.txt
from langchain_community.document_loaders import TextLoader
# 加载
loader = TextLoader('state_of_the_union.txt')
documents = loader.load()
4.3 文档切片
将文档切片,切片的参数(切片大小、切片重复数)可以自己调整
from langchain.text_splitter import CharacterTextSplitter
# 切片
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)
4.4 量化产生向量数据库
from langchain_community.embeddings import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
# 量化并生成向量数据库
db = Chroma.from_documents(chunks, OpenAIEmbeddings())
4.5 相似性检索
将问题也利用嵌入技术向量化后进行相似性检索
query = "在一片连绵不绝的广阔山脉之中,两座足有千丈高的剑型山峰相隔百米的距离矗立在茫茫云海之下"
embedding_vector = OpenAIEmbeddings().embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector)
print(docs[0].page_content)
4.6 完整代码
import dotenv
import os
import getpass
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.embeddings import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
# 加载OpenAI API KEY到进程中
dotenv.load_dotenv()
# database_url = os.getenv('OPENAI_API_KEY')
# print(f'Database URL: {database_url}')
# 加载
loader = TextLoader('state_of_the_union.txt')
documents = loader.load()
# 切片
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)
# 量化并生成向量数据库
db = Chroma.from_documents(chunks, OpenAIEmbeddings())
# 相似性检索
query = "在一片连绵不绝的广阔山脉之中,两座足有千丈高的剑型山峰相隔百米的距离矗立在茫茫云海之下"
embedding_vector = OpenAIEmbeddings().embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector)
print(docs[0].page_content)
5. 总结
如果想要学习更多深度学习的知识,大家可以点个关注并订阅,持续学习、天天进步
你的点赞就是我更新的动力,如果觉得对你有帮助,辛苦友友点个赞,收个藏呀~~~