代码编织梦想

一、RAG搭建流程

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

1.1、文档的加载与切割

(1)安装 pdf 解析库

!pip install pdfminer.six

(2)pdf文档切割

from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
def extract_text_from_pdf(filename, page_numbers=None, min_line_length=5):
    '''从 PDF 文件中(按指定页码)提取文字'''
    paragraphs = []
    buffer = ''
    full_text = ''
    # 提取全部文本
    for i, page_layout in enumerate(extract_pages(filename)):
        # 如果指定了页码范围,跳过范围外的页
        if page_numbers is not None and i not in page_numbers:
            continue
        for element in page_layout:
            if isinstance(element, LTTextContainer):
                full_text += element.get_text() + '\n'
    # 按空行分隔,将文本重新组织成段落
    lines = full_text.split('\n')
    for text in lines:
        if len(text) >= min_line_length:
            buffer += (' '+text) if not text.endswith('-') else text.strip('-')
        elif buffer:
            paragraphs.append(buffer)
            buffer = ''
    if buffer:
        paragraphs.append(buffer)
    return paragraphs
paragraphs = extract_text_from_pdf("data.pdf", min_line_length=5)#llama2
for para in paragraphs[:15]:
    print(para+"\n")

在这里插入图片描述

1.2、文档的加载与切割

(1)安装 ES 客户端

!pip install elasticsearch7

推荐第二种:线下下载,通过网盘分享的文件:elasticsearch-8.14.3.7z
链接: https://pan.baidu.com/s/1cVi1Y7YpT1iOjRrpVMdgQQ 提取码: f3qd
运行bin文件下的elasticsearch.bat启动
(2)安装 NLTK(文本处理方法库)

!pip install nltk
from elasticsearch7 import Elasticsearch, helpers
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
import nltk
import re

import warnings
warnings.simplefilter("ignore")  # 屏蔽 ES 的一些Warnings

(3)to_keywords只针对英文

def to_keywords(input_string):
    '''(英文)文本只保留关键字'''
    # 使用正则表达式替换所有非字母数字的字符为空格
    no_symbols = re.sub(r'[^a-zA-Z0-9\s]', ' ', input_string)
    word_tokens = word_tokenize(no_symbols)
    # 加载停用词表
    stop_words = set(stopwords.words('english'))
    ps = PorterStemmer()
    # 去停用词,取词根
    filtered_sentence = [ps.stem(w)
                         for w in word_tokens if not w.lower() in stop_words]
    return ' '.join(filtered_sentence)

针对中文

import re
import jieba
import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')  
def to_keywords(input_string):
    """将句子转成检索关键词序列"""
    # 按搜索引擎模式分词
    word_tokens = jieba.cut_for_search(input_string)
    # 加载停用词表
    stop_words = set(stopwords.words('chinese'))
    # 去除停用词
    filtered_sentence = [w for w in word_tokens if not w in stop_words]
    return ' '.join(filtered_sentence)

def sent_tokenize(input_string):
    """按标点断句"""
    # 按标点切分
    sentences = re.split(r'(?<=[。!?;?!])', input_string)
    # 去掉空字符串
    return [sentence for sentence in sentences if sentence.strip()]
    
if "__main__" == __name__:
    # 测试关键词提取
    print(to_keywords("小明硕士毕业于中国科学院计算所,后在日本京都大学深造"))
    # 测试断句
    print(sent_tokenize("这是,第一句。这是第二句吗?是的!啊"))

(4)将文本灌入检索引擎

import os, time
import nltk
nltk.download('punkt')
nltk.download('stopwords')
# 引入配置文件
# ELASTICSEARCH_BASE_URL = os.getenv('ELASTICSEARCH_BASE_URL')
# ELASTICSEARCH_PASSWORD = os.getenv('ELASTICSEARCH_PASSWORD')
# ELASTICSEARCH_NAME= os.getenv('ELASTICSEARCH_NAME')
 
# tips: 如果想在本地运行,请在下面一行 print(ELASTICSEARCH_BASE_URL) 获取真实的配置

#1. 创建Elasticsearch连接
es = Elasticsearch(
    hosts=["127.0.0.1:9200"],  # 服务地址与端口
    http_auth=('elastic','elastic'),  # 用户名,密码
)

# 2. 定义索引名称
index_name = "teacher_demo_index1"

# 3. 如果索引已存在,删除它(仅供演示,实际应用时不需要这步)
if es.indices.exists(index=index_name):
    es.indices.delete(index=index_name)

# 4. 创建索引
es.indices.create(index=index_name)

# 5. 灌库指令
actions = [
    {
        "_index": index_name,
        "_source": {
            "keywords": to_keywords(para),
            "text": para
        }
    }
    for para in paragraphs
]

# 6. 文本灌库
helpers.bulk(es, actions)

# 灌库是异步的
time.sleep(2)

(5)实现关键字检索

def search(query_string, top_n=1):
    # ES 的查询语言
    search_query = {
        "match": {
            "keywords": to_keywords(query_string)
        }
    }
    res = es.search(index=index_name, query=search_query, size=top_n)
    return [hit["_source"]["text"] for hit in res["hits"]["hits"]]

results = search("截至到 2017 年底,北京市新能源车辆保有量为多少辆,较上年增长多少?")#2020 年全国电动汽车保有量将超过多少辆
for r in results:
    print(r+"\n")

在这里插入图片描述

1.3、 LLM 接口封装

from openai import OpenAI
import os
# 加载环境变量
# from dotenv import load_dotenv, find_dotenv
# _ = load_dotenv(find_dotenv())  # 读取本地 .env 文件,里面定义了 OPENAI_API_KEY

# client = OpenAI()
client = OpenAI(api_key="****",base_url='***')# 默认使用环境变量中的 OPENAI_API_KEY 和 OPENAI_BASE_URL

def get_completion(prompt, model="gpt-3.5-turbo"):
    '''封装 openai 接口'''
    messages = [{"role": "user", "content": prompt}]
    response = client.chat.completions.create(
        model=model,
        messages=messages,
        temperature=0,  # 模型输出的随机性,0 表示随机性最小
    )
    return response.choices[0].message.content
    
def build_prompt(prompt_template, **kwargs):
    '''将 Prompt 模板赋值'''
    inputs = {}
    for k, v in kwargs.items():
        if isinstance(v, list) and all(isinstance(elem, str) for elem in v):
            val = '\n\n'.join(v)
        else:
            val = v
        inputs[k] = val
    return prompt_template.format(**inputs)

prompt模板

prompt_template = """
你是一个问答机器人。
你的任务是根据下述给定的已知信息回答用户问题。

已知信息:
{context}

用户问:
{query}

如果已知信息不包含用户问题的答案,或者已知信息不足以回答用户的问题,请直接回复"我无法回答您的问题"。
请不要输出已知信息中不包含的信息或答案。
请用中文回答用户问题。
"""
user_query = "截至到 2017 年底,北京市新能源车辆保有量为多少辆,较上年增长多少?"

# 1. 检索
search_results = search(user_query, 3)

# 2. 构建 Prompt
prompt = build_prompt(prompt_template, context=search_results, query=user_query)
# print("===Prompt===")
# print(prompt)

# 3. 调用 LLM
response = get_completion(prompt)

print("===回复===")
print(response)

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012121721/article/details/143320793

大模型学习笔记五:rag-爱代码爱编程

文章目录 一、RAG介绍 1)局限性 2)通过检索增强生成 二、RAG系统的基本搭建流程

【第3节】“茴香豆“:搭建你的 rag 智能助理_rag 实现文档快读-爱代码爱编程

目录 1 基础知识1.1.RAG技术的概述1.2 RAG的基本结构有哪些呢?1.3 RAG 工作原理:1.4 向量数据库(Vector-DB ):1.5 RAG常见优化方法1.6RAG技术vs微调技术 2

【 书生·浦语大模型实战营】学习笔记(三):“茴香豆” 搭建你的rag 智能助理-爱代码爱编程

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深

如何使用elasticsearch搭建llm-爱代码爱编程

        在之前的案例视频中我们演示了使用Milvus向量数据库和腾讯向量数据库实现RAG的场景应用。今天我们演示下利用ES的向量数据存储能力来实现RAG,包括三个部分:连接ES数据库并建表;数据写入ES向量数据库流程;问答对话流程。具体操作可参照下面的视频: 《玩转数据之使用ElasticSearch搭建RAG》https://www.bilib

rag(检索增强的生成式模型)项目的搭建_rag搭建-爱代码爱编程

1. LLM的局限性 1)LLM的知识不是实时的; 2)LLM可能不知道你的私有领域/业务知识。 2. 检索增强 RAG(Retrieval Augmented Generation),通过检索的方式增强生成模型的能力。 类似于开卷考试,让LLM先翻书,再回答问题。同时可以减少LLM胡编乱造的情况。 3. RAG基本项目的搭建流程 3.1

rag 入门指南:从零开始构建一个 rag 系统_rag开发入门-爱代码爱编程

本文正文字数约 3300 字,阅读时间 10 分钟。 从零开始构建一个应用可以让我们快速理解应用的各个部分。 这个方法其实非常适用于 RAG。 我在以前的文章中有介绍过 RAG 的概念、原理以及应用等,但其实,亲自

rag实践 -爱代码爱编程

0,什么是RAG? RAG,即检索增强生成(Retrieval-Augmented Generation),是一种先进的自然语言处理技术架构,旨在克服传统大型语言模型(LLM)在处理开放域问题时的信息容量限制和时效性不足。RAG通过融合信息检索系统的精确性和语言模型的强大生成能力,为基于自然语言的任务提供了更灵活和精准的解决方案。 1,RAG与LL

搭建rag系统就这么简单:langchain|rag是什么?_rag系统部署-爱代码爱编程

RAG是什么 “RAG”(Retrieval-Augmented Generation)是一种结合了检索(Retrieval)和生成(Generation)的人工智能技术,它在大模型中被需要的原因包括: 知识丰富性:

rag+agent项目实践系列:基于本地菜谱知识库的大语言模型rag+agent的解决方案设计和实现_rag+agent智能问答-爱代码爱编程

RAG+Agent项目实践系列:基于本地菜谱知识库的大语言模型RAG+Agent的解决方案设计和实现 为 A 项目构建一个基于菜谱知识库的问答机器人,由业务方提供一系列菜谱知识库和公司概况介绍材料,根据这些知识库要求实现一

使用rag技术构建企业级文档问答系统之基础流程-爱代码爱编程

1 概述 本文是本系列(使用RAG技术构建企业级文档问答系统)的第二篇,将介绍检索增强生成(Retrieval Augmented Generation,简称RAG)最基础流程。 所谓检索增强生成,是大语言模型兴起之后发

rag 基本流程及处理技巧 with langchain_langchain rag 问答系统 详解-爱代码爱编程

LLM 主要存在两个问题:幻想和缺乏领域知识。领域知识缺乏的原因是因为训练 LLM 本身的知识更新慢,对特定领域的知识也没有太细致的输入。 RAG 主要是解决 LLM 缺乏领域知识的问题。底层的逻辑是:把 LLM 作为逻辑

在android开发中webview的详细使用方法-爱代码爱编程

目录 1. 基本初始化和配置 2. 启用 JavaScript 3. 处理页面导航 4. 与 JavaScript 交互 5. 加载本地 HTML 内容 6. 支持文件上传与下载 7. 进度条与加载指示 8. 处理网页错误 9. 安全性设置 总结 在 Android 中,WebView 是一个强大的组件,用于在应用内显示网页内容。

pyhon—openpyxl修改某个表头的样式&其余单元格加边框线-爱代码爱编程

目录 专栏导读1、库的介绍2、库的安装3、核心代码4、完整代码总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击—

【无标题】-爱代码爱编程

Python包和模块 模块(Modules) 什么是模块 一个.py文件就是一个模块。模块是含有一系列数据、函数、类等的程序。 模块的作用 管理功能:把相关功能的函数等放在一起有利于管理,有利于多人合作开发。 代码复用:模块可以被多个程序重复使用,提高代码的复用性。 模块的分类 1. 内置模块 2. 标准库模块 3. 第三方模块

rag完整构建流程-爱代码爱编程

RAG完整构建流程 LLM模型缺陷: ​ 知识是有局限性的(缺少垂直领域/非公开知识/数据安全) ​ 知识实时性(训练周期长、成本高) ​ 幻觉问题(模型生成的问题) ​ 方法:Retrieval-Augmente

rag架构搭建_rag框架搭建-爱代码爱编程

RAG(Retrieval Augmented Generation,检索增强生成)架构的搭建是一个涉及多个组件和步骤的复杂过程。以下是一个简化的RAG架构搭建指南,旨在帮助理解其核心组件和搭建流程: 一、核心组件 文档库