使用LangChain简单搭建自己的RAG知识库

背景

本人日常工作需要对接各种第三方合作方,对接过程中的文档繁多、沟通不及时、问题排查繁琐以及工作具有重复性等问题愈发明显。合作方遇到对接问题需要提工单经门户网站–>产品部门接口人–>开发人员问题排查/修复–>产品部门接口人–>合作方收到回复,这种模式联调、验收流程较长。

考虑到前期对接过程中积累的问题日志、对接规范、指导手册、接口文档,如何让开发、产品、运营以及合作方有效利用这些知识?首先就想到了大模型,它具有强大的自然语言理解和文档整理能力,但其缺少对接流程的垂类领域知识?于是想到了RAG(检索增强生成技术)给两者建立了桥梁!

1. RAG技术介绍

RAG (Retrieval-Augmented Generation) 是一种结合了检索和生成的混合式深度学习模型,常用于处理复杂的自然语言处理任务。RAG模型通过将外部知识库中的信息与生成模型结合在一起,可以提供更准确和上下文相关的答案。具体来说,RAG由两个部分组成:

  1. 检索模块:负责从预先建立的知识库中检索与输入问题最相关的文档或信息片段。这通常通过向量检索技术实现,向量检索能够支持语义匹配,而不仅仅是关键词匹配,从而提高了检索的准确性。
  2. 生成模块:接收检索到的内容并生成最终的自然语言响应。这个模块通常基于大型生成模型(如 GPT-4),能够理解和生成复杂的自然语言。

这种技术的优势在于它能够利用海量的外部数据进行知识补充,从而提升回答的质量和准确性。这在动态性强、知识库更新频繁的场景中尤为重要。

2. RAG搭建常见流程

在实际应用中,搭建一个基于 RAG 的知识库通常包括以下几个步骤:

  1. 文档加载,并按一定条件切割成片段;
  2. 将切割的文本片段灌入向量数据库;
  3. 封装检索接口;
  4. 构建调用流程:Query -> 检索 -> Prompt -> LLM -> 回复。

3. 编码实现

下面用极少的代码快速搭建一个RAG系统,包括服务端和web界面,仅用于demo展示,生成级的 RAG 系统要复杂的多的多。

核心代码

如果纯自己编码实现 RAG,小一千行代码是要的,这里只能借助成熟的大模型开发框架来简化开发过程,把重心放到流程上去,本例使用了 LangChain,关键代码给出注释,可自己咨询大模型进行理解和改进。

LangChain:一套在大模型能力上封装的工具框架(SDK),它为开发者提供了一系列工具和组件,以简化语言模型在复杂任务中的集成和应用,尤其是涉及到多步骤的流程和需要结合外部数据源的场景。

import uvicorn
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from dotenv import load_dotenv, find_dotenv
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.prompts import ChatPromptTemplate
from starlette.middleware.cors import CORSMiddleware
​
# 加载环境变量,读取本地 .env 文件,里面定义了 OPENAI_API_KEY
_ = load_dotenv(find_dotenv())
​
# llm
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
​
# 加载文档,可换成PDF、txt、doc等其他格式文档
loader = TextLoader('../docs/解答手册.md', encoding='utf-8')
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter.from_language(language="markdown", chunk_size=200, chunk_overlap=0)
texts = text_splitter.create_documents(
    [documents[0].page_content]
)
​
# 选择向量模型,并灌库
db = FAISS.from_documents(texts, OpenAIEmbeddings(model="text-embedding-ada-002"))
# 获取检索器,选择 top-2 相关的检索结果
retriever = db.as_retriever(search_kwargs={"k": 2})
​
# 创建带有 system 消息的模板
prompt_template = ChatPromptTemplate.from_messages([
    ("system", """你是一个对接问题排查机器人。
               你的任务是根据下述给定的已知信息回答用户问题。
               确保你的回复完全依据下述已知信息。不要编造答案。
               请用中文回答用户问题。
               
               已知信息:
               {context} """),
    ("user", "{question}")
])
​
# 自定义的提示词参数
chain_type_kwargs = {
    "prompt": prompt_template,
}
​
# 定义RetrievalQA链
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",  # 使用stuff模式将上下文拼接到提示词中
    chain_type_kwargs=chain_type_kwargs,
    retriever=retriever
)
​
# 构建 FastAPI 应用,提供服务
app = FastAPI()
​
# 可选,前端报CORS时
app.add_middleware(
    CORSMiddleware,
    allow_origins=['*'],
    allow_credentials=True,
    allow_methods=['*'],
    allow_headers=['*'],
)
​
​
# 定义请求模型
class QuestionRequest(BaseModel):
    question: str
​
​
# 定义响应模型
class AnswerResponse(BaseModel):
    answer: str
​
    
# 提供查询接口 http://127.0.0.1:8000/ask
@app.post("/ask", response_model=AnswerResponse)
async def ask_question(request: QuestionRequest):
    try:
        # 获取用户问题
        user_question = request.question
        print(user_question)
​
        # 通过RAG链生成回答
        answer = qa_chain.run(user_question)
​
        # 返回答案
        answer = AnswerResponse(answer=answer)
        print(answer)
        return answer
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
​
​
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

运行环境

代码采用 python3.11 版本运行,并安装了如下依赖:

# pip install -r requirements.txt
fastapi==0.112.1
langchain==0.2.14
langchain_community==0.2.12
langchain_openai==0.1.22
langchain_text_splitters==0.2.2
pydantic==2.8.2
python-dotenv==1.0.1
Requests==2.32.3
starlette==0.38.2
uvicorn==0.30.6

QA准备

按照自己熟悉的文档组织方式组织QA,并按照业务需求选择是将Q向量化,还是将QA一起向量化,本例采用如下格式组织QA,并且QA一起向量化。

### xx接口不通怎么办
请首先确认接口地址以及鉴权参数,可找coderjia进行排查

效果展示

简陋的客户端界面:

咨询知识库存在的知识:

咨询知识库不存在的知识:

4. 总结与优化点

以上只是搭建搭建基于RAG的知识库最基本的步骤,实际应用时,有几点优化建议:

  1. 知识库的动态更新:随着时间的推移,知识库中的信息可能会过时或无效,因此需要设计自动化的知识更新机制,以保证系统回答的准确性和时效性。
  2. 模型微调:在不同的应用场景中,可能需要对调用的模型进行选择,或者对提示词进行优化,来引导模型生成更符合预期的输出。
  3. 混合检索策略:可以结合向量检索与传统的关键词检索策略,在保证检索精度的同时,提高召回率。
  4. 系统可扩展性:确保系统能够随着数据量和请求量的增加而扩展,避免性能瓶颈。使用分布式检索和生成技术是实现这一目标的关键。
  5. 用户反馈循环:引入用户反馈机制,定期分析用户的查询和系统的响应,持续改进模型和知识库,提升整体系统的智能水平。

在这里插入图片描述

大模型&AI产品经理如何学习

求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。

1.学习路线图

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

在这里插入图片描述

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方图片前往获取

3.技术文档和电子书

这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
在这里插入图片描述

4.LLM面试题和面经合集

这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值