实用指南:基于langchain的简单RAG的实现

news/2025/10/8 9:41:16/文章来源:https://www.cnblogs.com/wzzkaifa/p/19129166

闲来无事,想研究一下RAG的实现流程,看网上用langchain的比较多,我自己在下面也跑了跑,代码很简单,以次博客记录一下,方便回顾

langchain

LangChain 是一个基于大型语言模型(LLM)开发应用程序的框架。LangChain 简化了LLM应用程序生命周期的每个阶段。

通过比如,在下面的实现中,LangChain能够将LLM提示词模板检索器怎么实现的。就是组合在一起快速的完成检索增强整个流程,而不需要你去关心底层具体

代码demo

实现思路:

  1. 加载文档,并对文档进行切分
  2. 将切分后的文档转化为向量,存储到向量库中
  3. 根据用户query去向量库中检索,找到最相关的回复,并拼接到prompt中
  4. 根据最新的prompt调用大模型产生增强回复

加载文档 -> 切分文档 -> 创建向量数据库-> 执行相似度搜索 -> 构建并增强 prompt -> 使用模型生成回答

import os
from openai import OpenAI
import requests
from langchain.text_splitter import CharacterTextSplitter
from weaviate.embedded import EmbeddedOptions
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser
from langchain_community.document_loaders import TextLoader
from langchain_community.chat_models import ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain.schema import Document
from langchain_core.messages import HumanMessage, SystemMessage
"""
实现一
"""
def method_one(vectorstore,llm,query):
# 根据用户query进行检索,并将检索结果拼接到prompt中
def augment_prompt(query: str
):
# 获取top2的文本片段
results = vectorstore.similarity_search(query, k=1
)
source_knowledge = "\n\n".join([x.page_content for x in results]
)
# 构建prompt
augmented_prompt = f"""你叫david,你需要解答xxx问题
###参考样例###
{
source_knowledge
}
"""
return augmented_prompt
prompt=augment_prompt(query)
print(prompt)
# 封装输入
messages = [
SystemMessage(content=prompt)
,
HumanMessage(content=query)
,
]
# 生成检索增强回复
res = llm.invoke(messages)
return res.content
"""
实现二
"""
def method_two(vectorstore,llm,query):
# 将 vectorstore 转换为一个检索器
retriever = vectorstore.as_retriever(
)
# 定义提示模板
template = """你叫david,你需要解答xxx问题
###参考样例###
{context}
###用户问题###
{question}
"""
prompt = ChatPromptTemplate.from_template(template)
print(prompt)
# LangChain 提供了一个高度模块化和可组合的框架就是链,使得你可以根据任务的特性自定义每个组件,并将它们按需组合成执行流程
# 定义一个执行流程链,包含如下组件
# {"context": retriever, "question": RunnablePassthrough()}:用来将上下文(通过检索器获得)和用户问题传递给后续组件
# prompt里面的占位符与上述定义的context和question是要保持一致的
# StrOutputParser():该组件用于解析模型的输出,将其转换为字符串格式
rag_chain = (
{
"context": retriever, "question": RunnablePassthrough(
)
}
| prompt
| llm
| StrOutputParser(
)
)
response = rag_chain.invoke(query)
return response
if __name__=="__main__":
# 加载单个文档,这里只需要匹配单个文档里面的片段
path="../rag/faq.txt"
loader = TextLoader(path)
documents = loader.load(
)
# 如果需要加载多个文档,将上述path改为跟路径即可,然后通过下述两行代码对多个文档进行切分
# text_splitter = CharacterTextSplitter()
# doc = text_splitter.split_documents(documents)
# 切分文档,给定的文档内容主要是通过换行符分隔的
text = documents[0].page_content
chunks = [Document(page_content=chunk)
for chunk in text.split("\n\n\n"
)
if chunk.strip(
)]
# 将文档片段转化为向量,并存储到 
# Chroma 是一个 开源的向量数据库,用于存储和检索向量嵌入
model_name = "../model/bge-base-zh-v1.5"
embedding = HuggingFaceEmbeddings(model_name=model_name)
vectorstore_hf = Chroma.from_documents(documents=chunks, embedding=embedding , collection_name="huggingface_embed"
)
vectorstore = Chroma.from_documents(chunks, embedding)
# 初始化对话模型
llm = ChatOpenAI(
openai_api_key=""
,
openai_api_base=""
,
model='qwen-max'
)
# 用户query
query = "今天天气如何?"
# 检索增强之后的回答
enhanced_result=method_one(vectorstore,llm,query)
# enhanced_result=method_two(vectorstore,llm,query)
print(enhanced_result)

思考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10 8

P6419这是一道很明显的 换根DP 我们发现 \(x\) 点的答案很明显是由需要经过的边乘 2 再减去从 \(X\) 开始的一条最长链 我们先考虑所有边乘 2 的事 定义 \(f_x\) 为在以 \(x\) 为根的子树中需要经过的边乘 2 的答案,\…

深入解析:微信小程序动态组件加载的应用场景与实现方式

深入解析:微信小程序动态组件加载的应用场景与实现方式2025-10-08 09:40 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

唐山做企业网站的公司centos7.2做网站

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 1.C和C的区别 1.语法和特性:C是一种过程式编程语言,而C是一种面向对象编程语言。C在C的基础上增加…

小语种网站建设公司网络营销广告词有哪些

散点图(scatter chart)将序列显示为一组点。值由点在图表中的位置表示。类别由图表中的不同标记表示。散点图通常用于比较跨类别的聚合数据。在QChart中,使用类QScatterSeries创建散点图。QScatterSeriesQScatterSeries类在散点图中显示数据。散点数据在图表上显示为…

2025双氧水厂家权威推荐榜:优质生产与稳定供应实力之选

2025双氧水厂家权威推荐榜:优质生产与稳定供应实力之选在当今化工产业快速发展的背景下,双氧水作为一种重要的基础化工原料,在造纸、纺织、环保、电子及医疗消毒等众多领域发挥着不可替代的作用。随着市场需求持续增…

STM32----IAP远程升级 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

英国AI数据中心发展规划:技术挑战与产业反馈

英国政府发布50点AI行动计划,承诺建设主权人工智能能力并加速AI数据中心发展。文章详细分析了技术基础设施规划、超级计算设施建设以及行业专家对计划可行性的质疑,涉及数据中心容量扩展、能源需求和公私合作模式等关…

2025 年工业风机厂家最新推荐排行榜:涵盖离心高温防腐耐磨防爆等类型设备实力厂商精选高温/防腐/耐磨/防爆/除尘/不锈钢/锅炉风机厂家推荐

在当下工业生产中,风机作为不可或缺的流体输送与通风设备,其品质与性能对生产效率提升、作业安全保障以及节能减排目标达成起着关键作用。随着冶金、化工、电力等行业的快速发展,市场对风机耐高温、防爆、耐腐蚀等特…

使用cursor 编辑器开发 Vue项目,调整ESlint自动修复脚本,消除代码不规范引起的报错无法运行项目问题

使用cursor 编辑器开发 Vue项目,调整ESlint自动修复脚本,消除代码不规范引起的报错无法运行项目问题pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: blo…

站群网站源码素材下载解析接口网站开发

使用静态函数作为连接助手,意味着你创建一个静态函数来帮助触发某个QObject实例的信号,而不是直接定义静态信号(因为Qt不支持)。这种模式允许你从全局上下文或其他非QObject环境中间接触发生命周期管理在其他地方的对象信号。以下…

2025 年拉力试验机厂家最新推荐榜单:聚焦专精特新企业技术实力与口碑,助力钢铁、线缆、轨道交通等行业精准选购

在工业制造高质量发展进程中,拉力试验机作为材料性能检测核心设备,其精度、稳定性与适配性直接决定产品质量管控效果与行业安全底线。当前市场上试验机厂家数量繁杂,部分企业缺乏核心加工能力、科研投入薄弱或质控体…

2025 年最新推荐!种植牙医院权威榜单:聚焦连锁品牌与万级手术室,助您精准选靠谱口腔机构西宁种植牙口腔医院/西宁种植牙齿美容/西宁种植牙美容医院推荐

当下,种植牙凭借出色的功能性与美观性,已成为缺牙患者修复的首要选择,但口腔医疗行业的发展乱象却让消费者陷入选择困境。部分机构缺乏合规资质,医疗设备老旧、消毒流程敷衍,不仅难以保障种植效果,还可能引发交叉…

高考数学易错考点01 | 临阵磨枪 - 教程

高考数学易错考点01 | 临阵磨枪 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

2025 年西宁口腔医院最新推荐排行榜:实力解析与全周期口腔服务指南西宁口腔医院/西宁口腔美容/西宁口腔整形/西宁口腔正畸/西宁口腔修复推荐

随着西宁市民对口腔健康重视度提升,口腔诊疗需求持续增长,但市场上机构资质、服务质量差异显著。部分机构存在诊疗流程不规范、专家经验不足、设备落后等问题,导致患者面临治疗效果不佳、安全无保障等风险;同时,民…

制作网站支付方式国际外贸平台排名

1、SQL CROSS JOIN 语句 CROSS JOIN在 SQL 中用于将两个或多个表的每一行进行组合。这意味着如果表 A 有 M 行,表 B 有 N 行,那么CROSS JOIN 的结果将包含 M * N 行。这种连接不依赖于任何连接条件,因此它会生成笛卡尔积。 下面是一个简单的…

黄岛网站建设公司哪家好商场设计效果图

一. 前言 从本节开始,将陆续的介绍几种框架搭建组合形式,分析每种搭建形式的优势和弊端,剖析搭建过程中涉及到的一些思想和技巧。 (一). 技术选型 1. DotNet框架:4.6 2. 数据库访问:EF 6.2 (CodeFrist模式) 3. IOC框架…

详细介绍:为何选择Spring框架学习设计模式与编码技巧?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年试验机厂家最新推荐榜单:专精特新企业深度解析,含疲劳 / 压力 / 液压万能等设备优质厂家水泥压力/压剪/锚链拉伸整形机/链条拉伸整形机厂家推荐

在工业制造向高质量转型的关键阶段,材料性能检测的准确性与效率直接决定产品竞争力,试验机作为核心检测工具,其品质与适配性成为企业关注焦点。当前市场上,试验机品牌数量繁杂,部分企业缺乏核心技术、品控体系不完…

最有性价比的网站建设哪个网站做高仿衣服

如何在不恢复出厂设置的情况下解锁 Android 手机密码? 当您忘记 Android 手机的密码时,可能会有压力,尤其是当您不想恢复出厂设置并删除所有数据时。但是,有一些方法可以在不诉诸如此激烈的步骤的情况下解锁手机。我们将在这篇文…

2025 年最新推荐西安路灯厂家排行榜:市政 / LED / 智慧 / 太阳能 / 农村路灯优质企业全景指南

当前智慧城市建设与文化照明需求持续升级,路灯行业却面临诸多选购难题。市场上产品同质化严重,部分厂家缺乏核心技术,节能性与智能化适配性不足,工程交付质量与后期维护服务参差不齐。不同场景如市政道路、景区、农…