LangChain构建RAG(基于Huggingface与Groqcloud,无需本地部署模型)

一、前言

LangChain是一个开源框架,旨在简化使用大型语言模型(LLM)的应用程序创建。‌它提供了一个标准接口,允许开发者将不同的语言模型连接在一起,并与外部计算和数据源进行集成。LangChain的核心思想是通过组合不同的组件来创建更高级的大语言模型应用程序。它为常见应用程序提供了端到端的解决方案,例如聊天机器人、文档分析和代码生成等。‌

LangChain封装许多主流的大模型提供商的API接口,可以快速便捷的开发RAG应用。

下面我将从0开发一个RAG应用。

二、准备工作

准备HuggingfaceGroqcloudapi_key

Huggingface:https://huggingface.co/

Groqcloud:https://console.groq.com/

python依赖:

python 复制代码
 langchain-openai
 langchain-community 
 chromadb 
 pypdf    
 openai  

在线pdf文档

作为我们的本地知识,大模型要从这个pdf中告诉我们答案,这里我是在网络上随便找的一篇论文
https://arxiv.org/pdf/1801.06176

三、LangChain构建RAG应用

RAG应用的流程如下:

简单来说就是,用户询问问题,首先将用户的问题Embedding向量化,之后与向量数据库中比对,找到相似度最高的文本,之后将相关的文本交给大模型,大模型根据这些文本给出我一个总结后的答案。

1、准备问题

准备一个问题,最好是可以在准备的文档中可以找到的答案。

例如:

我询问DDQ的全称是什么,这个答案是在pdf的内容中的

python 复制代码
query = "What is the full name of DDQ"

2、加载文本

加载准备的文档,这里我只取了文档的前3页作为演示

python 复制代码
pdf_loader = PyPDFLoader("https://arxiv.org/pdf/1801.06176")
pages = pdf_loader.load_and_split()
pages = pages[:3]  # 为了减少时间,缩短数据

3、分割文本

为了提高处理效率、便于模型训练与推理 ,需要将我们加载的数据进行切分
chunk_size=500

这个参数指定了每个文本块的最大长度(以字符数为单位)。例如,chunk_size=500表示每个文本块的最大长度为500个字符。

chunk_overlap=50

这个参数定义了相邻两个文本块之间的重叠字符数。chunk_overlap=50意味着相邻的两个文本块将共享50个字符。这对于确保文本块之间的连接顺畅、保持上下文一致性很有用。

python 复制代码
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
documents = splitter.split_documents(pages)

4、Embedding向量化

我们调用HuggingFace的模型接口作为我们的Embedding模型,Embedding模型可以在HuggingFace找到,注意这里需要填写自己的api_key

python 复制代码
hug_embeddings = HuggingFaceInferenceAPIEmbeddings(api_key="xxxx",
                                                   model_name="sentence-transformers/all-MiniLM-l6-v2")
vectorstore = Chroma.from_documents(documents=documents, embedding=hug_embeddings, collection_name="test")

5、匹配文本

这里我们匹配相似度前3的三个文本,并将这3段文本拼接,之后交给大模型从中提取我们想要的答案。

python 复制代码
search_result = vectorstore.similarity_search(query, k=3)
source_knowledge = "\n".join([x.page_content for x in search_result])

6、构建Prompt

将我们的问题和从向量数据库中匹配到的文本数据交给大模型

python 复制代码
msgs = []
from langchain.schema import HumanMessage
prompt = HumanMessage(
    content=f"""Answer my question based on my content, content: {source_knowledge}, question: {query}"""
)
msgs.append(prompt)

7、调用大模型

这里我们调用GroqCloudllama模型,需要填写自己的api_key

python 复制代码
client = ChatOpenAI(
    base_url="https://api.groq.com/openai/v1",
    api_key="xxxx",
    model="llama-3.3-70b-versatile"
)
resp = client.invoke(msgs)
print(resp.content)

8、实现效果

四、完整代码

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_community.embeddings import  HuggingFaceInferenceAPIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.document_loaders import PyPDFLoader

# 我们的问题
query = "What is the full name of DDQ"


# 1、加载文本
pdf_loader = PyPDFLoader("https://arxiv.org/pdf/1801.06176")
pages = pdf_loader.load_and_split()
pages = pages[:3]  # 为了减少时间,缩短数据


# 2、分割文本
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
documents = splitter.split_documents(pages)
print(documents.__len__())

# 3、embedding向量化
hug_embeddings = HuggingFaceInferenceAPIEmbeddings(api_key="xxxx",
                                                   model_name="sentence-transformers/all-MiniLM-l6-v2")
vectorstore = Chroma.from_documents(documents=documents, embedding=hug_embeddings, collection_name="test")

# 4、根据文本匹配top3文本,拼接,为了之后交给大模型处理
search_result = vectorstore.similarity_search(query, k=3)
source_knowledge = "\n".join([x.page_content for x in search_result])
print(source_knowledge)

# 5、构建Prompt
msgs = []
from langchain.schema import HumanMessage
prompt = HumanMessage(
    content=f"""Answer my question based on my content, content: {source_knowledge}, question: {query}"""
)
msgs.append(prompt)

# 6、调用大模型
client = ChatOpenAI(
    base_url="https://api.groq.com/openai/v1",
    api_key="xxxxx",
    model="llama-3.3-70b-versatile"
)
resp = client.invoke(msgs)
print(resp.content)
相关推荐
梦云澜2 小时前
论文阅读(十二):全基因组关联研究中生物通路的图形建模
论文阅读·人工智能·深度学习
远洋录3 小时前
构建一个数据分析Agent:提升分析效率的实践
人工智能·ai·ai agent
IT古董4 小时前
【深度学习】常见模型-Transformer模型
人工智能·深度学习·transformer
沐雪架构师5 小时前
AI大模型开发原理篇-2:语言模型雏形之词袋模型
人工智能·语言模型·自然语言处理
python算法(魔法师版)5 小时前
深度学习深度解析:从基础到前沿
人工智能·深度学习
kakaZhui6 小时前
【llm对话系统】大模型源码分析之 LLaMA 位置编码 RoPE
人工智能·深度学习·chatgpt·aigc·llama
struggle20257 小时前
一个开源 GenBI AI 本地代理(确保本地数据安全),使数据驱动型团队能够与其数据进行互动,生成文本到 SQL、图表、电子表格、报告和 BI
人工智能·深度学习·目标检测·语言模型·自然语言处理·数据挖掘·集成学习
佛州小李哥7 小时前
通过亚马逊云科技Bedrock打造自定义AI智能体Agent(上)
人工智能·科技·ai·语言模型·云计算·aws·亚马逊云科技
云空8 小时前
《DeepSeek 网页/API 性能异常(DeepSeek Web/API Degraded Performance):网络安全日志》
运维·人工智能·web安全·网络安全·开源·网络攻击模型·安全威胁分析
AIGC大时代8 小时前
对比DeepSeek、ChatGPT和Kimi的学术写作关键词提取能力
论文阅读·人工智能·chatgpt·数据分析·prompt