当前位置: 首页 > news >正文

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

闲来无事,想研究一下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.jsqmd.com/news/9973/

相关文章:

  • 10 8
  • 深入解析:微信小程序动态组件加载的应用场景与实现方式
  • 2025双氧水厂家权威推荐榜:优质生产与稳定供应实力之选
  • STM32----IAP远程升级 - 详解
  • 英国AI数据中心发展规划:技术挑战与产业反馈
  • 2025 年工业风机厂家最新推荐排行榜:涵盖离心高温防腐耐磨防爆等类型设备实力厂商精选高温/防腐/耐磨/防爆/除尘/不锈钢/锅炉风机厂家推荐
  • 使用cursor 编辑器开发 Vue项目,调整ESlint自动修复脚本,消除代码不规范引起的报错无法运行项目问题
  • 2025 年拉力试验机厂家最新推荐榜单:聚焦专精特新企业技术实力与口碑,助力钢铁、线缆、轨道交通等行业精准选购
  • 2025 年最新推荐!种植牙医院权威榜单:聚焦连锁品牌与万级手术室,助您精准选靠谱口腔机构西宁种植牙口腔医院/西宁种植牙齿美容/西宁种植牙美容医院推荐
  • 高考数学易错考点01 | 临阵磨枪 - 教程
  • 2025 年西宁口腔医院最新推荐排行榜:实力解析与全周期口腔服务指南西宁口腔医院/西宁口腔美容/西宁口腔整形/西宁口腔正畸/西宁口腔修复推荐
  • 详细介绍:为何选择Spring框架学习设计模式与编码技巧?
  • 2025 年试验机厂家最新推荐榜单:专精特新企业深度解析,含疲劳 / 压力 / 液压万能等设备优质厂家水泥压力/压剪/锚链拉伸整形机/链条拉伸整形机厂家推荐
  • 2025 年最新推荐西安路灯厂家排行榜:市政 / LED / 智慧 / 太阳能 / 农村路灯优质企业全景指南
  • 2025 最新红绿灯厂家推荐排行榜:实力厂家技术与口碑深度解析,交通信号设备优选指南交通信号/路口红绿灯厂家推荐
  • 2025 土工材料厂家最新推荐榜:中铁合作厂商领衔,技术 / 案例双维度厂家深度甄选指南土工布/土工膜/土工格栅/复土工合膜厂家推荐
  • 2025 年帐篷源头厂家最新推荐排行榜:涵盖应急救灾 / 户外充气 / 露营充气 / 野营等品类,精选实力企业助采购
  • Claude Code完整安装部署指南:支持Windows/Linux/macOS三平台详细教程
  • 2025 杀虫公司最新推荐榜:权威筛选公司,靶向消杀与长效质保选购全指南
  • 2025 年电缆桥架生产厂家最新推荐榜单:聚焦北方 / 河北区域及多类型桥架,精选优质品牌深度解析瓦楞/防火/模压/镀锌桥架厂家推荐
  • rtthread学习笔记系列 -- 13 线程
  • 2025 年淋膜机厂家最新推荐排行榜:覆盖纸张 / 无纺布 / 高速 / 全自动等多类型设备,精选优质企业助力精准选购
  • 2021年度十大前沿科技研究盘点
  • 2025 商事律师咨询最新推荐榜:权威甄选专业法律服务品牌武汉公司法商事/武汉股东纠纷股权/武汉商事争议解决/武汉公司法股权律师推荐
  • 实用指南:Docker 插件生态:从网络插件到存储插件的扩展能力解析
  • 2025 最新推荐:全国开锁公司口碑排行榜权威甄选,含智能锁专项服务与紧急上门品牌详解全国/汽车保险柜/汽车锁/保险柜/智能/快速上门开锁公司推荐
  • CSP - J 讲义内容与CSP - S 讲义内容对比
  • 完整教程:【小红书】API接口,获取笔记列表
  • h5的aliplayer-min.js 加密视频会走到debugger - 教程
  • 云安全挑战与AI时代防护策略