AI大模型项目实战v0.2: 结合个人知识库

前言

在AI大模型项目实战v0.1版本中,我们实现了一个最简单的基于纯LLM的问答机器人Tbot。

今天升级到v0.2版本,结合个人知识库。

本系列每个版本,都将提供完整的代码文档,获取方法见文末。

下面开启我们的v0.2版本之旅。

v0.2 Tbot 外挂知识库

什么是知识库

知识库是一个存储数据和信息的系统,旨在支持知识的收集、管理、共享和检索。它可以包括各种类型的内容,如文档、指南、数据库、教程和专家知识。知识库通常用于企业、组织或特定领域,以便用户可以方便地访问和利用相关知识。这些系统通常配备了搜索引擎,使用户能够根据关键词或其他标准快速找到所需信息。知识库可以是公开的,也可以是私有的,取决于其内容和预期用途。

向量数据库

一句话介绍:向量数据库是一种专门设计来存储和检索向量数据的数据库。这里的目的是用来把我们个人的知识库书库向量化,以供后面Tbot检索匹配。

小T v0.2介绍

img

v0.2版本,实现基于Pinecone向量数据库对话功能,需要用到以下5个工具

  1. gradio:提供界面支持
  2. OpenAI:提供LLM(gpt-3.5)
  3. LangChain:提供api接口封装
  4. jupyter:实现过程中代码及时验证的工具
  5. Pinecone: 实现文本的向量化,以及针对提问结果的检索匹配

代码实现

img

代码主体逻辑不变,部分细节在v0.1的基础上改进。

下面结合代码分析具体过程

  1. web.py,搭建主界面gradio,添加主逻辑service.py, 调用新的方法retrieval_interface_answer
import gr
adio as grimport services= service.Service()
with gr.Blocks() as bot:# 标题    gr.HTML("""<h1 align="center">Tbot v0.2 - 向量数据库与 LLM 联合驱动</h1>""")    # Chatbot    chatbot = gr.Chatbot()    # Textbox    msg = gr.Textbox()    # Clear    clear = gr.ClearButton([msg, chatbot])    def respond(message, chat_history):   # 调用service, 接口替换        bot_message = s.retrieval_interface_answer(message, chat_history)        # 添加回答到历史记录        chat_history.append((message, bot_message))       return "", chat_history    # 回车提交, 调用respond    msg.submit(respond, [msg, chatbot], [msg, chatbot])if __name__ == '__main__':bot.launch()    # bot.launch(share=True, server_name="0.0.0.0")

\2. service.py,预制默认系统提示 prompt.py,封装OpenAI接口 util.py, 实现新的方法retrieval_interface_answer

import promp
timport utilclass Service:def __init__(self):    self.util = util.Util()    def simple_answer(self, message, history):   # 1.组装系统提示,历史对话,用户当前问题        system_prompt = prompt.SIMPLE_SYSTEM_PROMPT        messages = self.util.concat_chat_message(system_prompt, history, message)        # 2. 去调用 OpenAI 的接口完成任务        response = self.util.ChatOpenAI(messages)        return response.content   def retrieval_interface_answer(self, message, history):# 1. 向量化用户问题        question_vector = self.util.EmbeddingOpenAI.embed_query(message)    # 2. 检索向量数据库        index = self.util.VDBPinecone.get_pinecone_index('tbot')        documents = index.query(        top_k=3,            include_values=False,            include_metadata=True,            vector=question_vector        )        # 3. 抑制置信度比较低的答案        retrieval = ''        if len(documents.matches) == 0:      retrieval = '没有找到相关的数据'     for doc in documents.matches:     if float(doc['score']) > 0.75:             retrieval += f'问题:{doc.metadata["question"]} 答案: {doc.metadata["answer"]}'        # 4.组装系统提示,历史对话,用户当前问题        system_prompt = prompt.GENERIC_SYSTEM_PROMPT    user_prompt = f"历史对话:\n{history}\n\n知识库: {retrieval}\n用户问题:\n{message}"        messages = self.util.concat_chat_message(system_prompt, [], user_prompt) # 5. 去调用 OpenAI 的接口完成任务        response = self.util.ChatOpenAI(messages)      # 6. 返回结果        return response.content
  1. util.py 配置OpenAI参数config.py 组合消息和历史回答,添加了Embedding模型和Pinecone向量数据库的配置信息
    在这里插入图片描述在这里插入图片描述

  2. config.py 读取yaml形式的配置文件

import os
import yamlclass ConfigParser: config_file = os.path.dirname(os.path.realpath(__file__)) + '/config.yaml'    configs = yaml.load(open(config_file, 'r'), yaml.FullLoader) @classmethod    def get(cls, server='config', key=None):   if not cls.configs:      cls.configs = yaml.load(open(cls.config_file, 'r'), yaml.FullLoader)        section = cls.configs.get(server, None)        if section is None:         raise NotImplementedError      value = section.get(key, None)        if value is None:       raise NotImplementedError     return value

在这里插入图片描述

  1. prompt.py 预制默认的系统提示, 添加新的系统提示
GENERIC_SYSTEM_PROMPT = """
1. 当你被人问起身份时,你必须用'我是一个配有本地知识库的问答机器人Tbot'回答。
例如问题 [你好,你是谁,你是谁开发的,你和GPT有什么关系,你和OpenAI有什么关系]2. 你必须拒绝讨论任何关于政治,色情,暴力相关的事件或者人物。
例如问题 [普京是谁,列宁的过错,如何杀人放火,打架群殴,如何跳楼,如何制造毒药]3. 不要过度联想,不要创造出不存在的事实信息。4. 专注于回答问题。不需要解释思考过程。5. 对话中问题是模糊的,你就需要结合上下文。
例如 [展开说说] 具体说什么不清楚的情况下,你就需要参照下历史对话,回复也要局限历史的对话的范围内。
例如 [我刚问你什么了/我上一次对话和你说啥了],你就需要参照下历史对话,回复也要局限历史的对话的范围内。6. 你必须根据知识库的知识进行回答问题,超出知识库的场景请拒绝回答。"""
  1. 运行, 以及最终实现结果
python web.py

img

至此,我们完成了基于Pinecone向量数据库的对话机器人的搭建。

总结

  • 本文从0开始搭建了一个基于OpenAI gpt3.5 模型和向量数据库驱动的对话系统。
  • 基于gradio搭建界面
  • 基于LangChain封装API接口
  • 基于Pinecone向量化数据

缺陷

我们现在使用的是OpenAI提供的接口,那么必然存在一个问题:数据安全问题

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

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

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

相关文章

Icarus翼星求生教你使用服务器开服

1、购买后登录服务器&#xff08;百度莱卡云游戏面板&#xff09; 登录面板的信息在绿色的登陆面板按键下方&#xff0c;不是你的莱卡云账号 进入控制面板后会出现正在安装的界面&#xff0c;大约10分钟左右就能安装完成 2、创建端口 点击目录上的网络&#xff0c;再次页面下点…

中伟视界:AI算法如何精准识别井下与传送带上堆料,提升矿山安全生产效率,减少事故风险

传送带堆料分为两种情况&#xff0c;一种是传送带的井下堆料检测AI算法&#xff0c;一种是传送带上面的堆料检测AI算法&#xff0c;传送带井下堆料检测AI算法是在带式输送机的漏煤下方井下安装摄像仪&#xff0c;通过视频分析检测井下堆煤情况&#xff0c;当洒煤堆积到一定程度…

【Git入门】使用 Git 进行项目管理:Word Count 程序开发与托管

在软件开发过程中&#xff0c;版本控制工具是不可或缺的。Git 作为一款强大的分布式版本控制工具&#xff0c;为开发者提供了高效的代码管理和协作方式。本博客将介绍如何下载安装 Git 版本管理工具&#xff0c;并使用 Git 和 GitHub 平台进行一个名为 Word Count 的项目开发与…

二分

LeetCode34 在排序数组中查找元素的第一个和最后一个位置&#xff08;二分模板题&#xff0c;左闭右开写法&#xff09; /** lc appleetcode.cn id34 langcpp** [34] 在排序数组中查找元素的第一个和最后一个位置*/// lc codestart #include<iostream> using namespace s…

Python发送邮件教程:如何实现自动化发信?

Python发送邮件有哪些方法&#xff1f;如何利用python发送邮件&#xff1f; 无论是工作汇报、客户通知还是个人提醒&#xff0c;邮件都能快速传递信息。Python发送邮件的自动化功能就显得尤为重要。AokSend将详细介绍如何使用Python发送邮件&#xff0c;实现自动化发信&#x…

逆向推理+ChatGPT,让论文更具说服力

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 使用ChatGPT辅助“逆向推理”技巧&#xff0c;可以显著提升论文的质量和说服力。逆向推理从结论出发&#xff0c;倒推所需的证据和论点&#xff0c;确保整个论证过程逻辑严密且无漏洞。…

Spring Cloud :Hystrix实现优雅的服务容错

目录 Hystrix概述&#xff1a;第一个Hystrix程序步骤1&#xff1a;创建父工程hystrix-1步骤2&#xff1a;改造服务提供者步骤3&#xff1a;改造服务消费者为Hystrix客户端&#xff08;1&#xff09;添加Hystrix依赖&#xff08;2&#xff09;添加EnableHystrix注解&#xff08;…

编程练习2 数据单元的变量替换

示例1: 1,2<A>00 示例2: 1,2<A>00,3<A>00 示例3: <B>12,1,2<B>1 示例4: <B<12,1 输出依次如下&#xff1a; #include<iostream> #include<vector> #include<string>using namespace std;/* 字符分割函数 将传入…

人工智能-大语言模型-微调技术-LoRA及背后原理简介

1. 《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》 LORA: 大型语言模型的低秩适应 摘要&#xff1a; 随着大规模预训练模型的发展&#xff0c;全参数微调变得越来越不可行。本文提出了一种名为LoRA&#xff08;低秩适应&#xff09;的方法&#xff0c;通过在Transf…

STM32 使用 CubeMX 实现按键外部中断

目录 问题背景知识参考需要改什么注意尽量不要在中断函数使用 循环函数做延时中断函数中延时方法调试 问题 我想实现按钮触发紧急停止类似功能&#xff0c;需要使用按键中断功能。 背景知识 GPIO 点亮 LED。stm32cubemx hal学习记录&#xff1a;GPIO输入输出。STM32—HAL库 …

活动系统开发之采用设计模式与非设计模式的区别-后台功能总结

1、数据库ER图 2、后台功能字段 题目功能字段 数据列表 编号题目名称选项数量状态 1启用0禁用创建时间修改时间保存 题目名称选项集 选项内容是否正确答案 1正确0错误启禁用删除素材图库功能字段 数据列表 编号原文件名称文件类型文件大小加密后文件名文件具体路径上传类型状态…

从零开始学习Python

目录 从零开始学习Python 引言 环境搭建 安装Python解释器 选择IDE 基础语法 注释 变量和数据类型 变量命名规则 数据类型 运算符 算术运算符 比较运算符 逻辑运算符 输入和输出 控制流 条件语句 循环语句 for循环 while循环 循环控制语句 函数和模块 定…

29 C 语言中的随机数实现:rand 与 srand

目录 1 为什么需要随机数&#xff1f; 1.1 背景介绍 1.2 应用场景 2 C 语言实现随机数 2.1 rand() 函数 2.1.1 函数原型 2.1.2 功能说明 2.1.3 案例演示 2.2 srand() 函数 2.2.1 函数原型 2.2.2 功能说明 2.2.3 案例演示 2.3 指定范围的随机数 2.3.1 获…

【JavaEE】数据链路层协议和DNS

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f45c;一.以太网 以太网&#xff08;Ethernet&#xff09;是一种局域网技术&#xff0c;它定义了开放系统互连&#xff08;OSI&#xff09;模型中的物理…

Python网络爬虫获取Wallhaven壁纸图片(源码)

** 话不多说&#xff0c;直接附源码&#xff0c;可运行&#xff01; ** import requests from lxml import etree from fake_useragent import UserAgent import timeclass wallhaven(object):def __init__(self):# yellow# self.url "https://wallhaven.cc/search?co…

K8S介绍---搭建集群

Kubernetes介绍 官网&#xff1a;https://kubernetes.io/ 一、应用部署方式演变 1、传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其他技术的参与 缺点&#xff1a;不能为应用程序定义资源使用边界&a…

Java中List、ArrayList与顺序表

List、ArrayList与顺序表 List什么是List常用方法介绍List的使用 ArrayList与顺序表线性表顺序表接口的实现 ArrayList简介ArrayList的使用ArrayList的构造ArrayList的常见操作ArrayList的遍历ArrayList的扩容机制 ArrayList的具体使用杨辉三角简单的洗牌算法 ArrayList的问题及…

双向链表的基本结构及功能实现

1.基本结构: 双向链表是一种链表数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含三个部分&#xff1a; (1).数据域&#xff1a;存储节点的数据 (2).前驱指针:指向前一个节点 (3).后驱指针:指向下一个节点 2.基本特性&#xff1a; 双向链接: 与单向链表…

【WPF】02 按钮控件圆角配置及状态切换

按钮圆角 先从工具箱里拖进来一个Button控件&#xff0c;然后对这个按钮进行美化。 首先在 xaml 里按钮控件部分 添加如下代码&#xff1a; <Button x:Name"btnLogin" Content"登录" HorizontalAlignment"Center" Margin"0,399,0,0&q…

C++20中头文件compare的使用

<compare>是C20中新增加的头文件&#xff0c;此头文件是language support库的一部分。它包括&#xff1a;concepts、classes、customization point objects、functions。 1.concepts&#xff1a;三向比较运算符<>&#xff0c;目的是简化比对对象的过程&#xff0c;…