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

embedded/2024/9/25 1:40:36/

前言

在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.ppmy.cn/embedded/116374.html

相关文章

软件测试面试题(6)——二面(游戏测试)

没想到测试题做完等了会儿就安排面试了&#xff0c;还以为自己会直接挂在测试题&#xff0c;这次面试很刺激。测试题总体来说不算太难&#xff0c;主要是实操写Bug那里真没经历过&#xff0c;所以写的很混乱。 我复盘一下这次面试的问题&#xff0c;这次面试是有两个面试官&…

【已解决】华为AR100-S路由器 恢复出厂后,找不到5G wifi的设置

前两帖讨论了华为AR100-S路由器&#xff1a; 一是用电脑浏览器访问web管理界面报错的解决&#xff0c;详情点这里&#xff01; https://blog.csdn.net/weixin_62598385/article/details/142215136 再就是如何回复出厂&#xff0c;也即如何复位&#xff0c; 详情点这里&#xff…

9.24 C++ 常成员,运算符重载

//my_string.cpp #include "my_string.h" #include <iostream> #include <cstring>using namespace std;My_string::My_string():size(15){this->ptr new char[size];this->ptr[0] \0; //表示串为空串this->len 0;}//有参构造My_…

基于Vue3组件封装的技巧分享

本文在Vue3的基础上针对一些常见UI组件库组件进行二次封装&#xff0c;旨在追求更好的个性化&#xff0c;更灵活的拓展&#xff0c;提供一些个人的思路见解&#xff0c;如有不妥之处&#xff0c;敬请指出。核心知识点$attrs,$slots 需求 需求背景 日常开发中&#xff0c;我们经…

【鸿蒙HarmonyOS NEXT】用户首选项Preference存储数据

【鸿蒙HarmonyOS NEXT】数据存储之用户首选项Preference 一、环境说明二、Preference运作机制三、示例代码加以说明四、小结 一、环境说明 DevEco Studio 版本&#xff1a; API版本&#xff1a;以12为主 二、Preference运作机制 应用场景&#xff1a; 用户首选项为应用提…

分享两个ADG监控脚本

分享两个监控脚本&#xff0c;用于监控Oracle ADG的状态&#xff0c;如果状态异常则发送邮件告警 脚本一&#xff1a; 利用语句查询日志的应用状态&#xff0c;如果长时间未应用则邮件告警&#xff0c;提醒DBA检查ADG的状态是否异常&#xff1b; 阈值条件&#xff1a;最近一…

Git:Git管理

目录 Git 文件管理检测文件状态 status跟踪新文件 add提交更新 commit撤销提交 Commit Git 校验和历史查看 log版本回退 resetgit 忽略文件 Git 分支管理Git 提交对象Git master分支Git 分支管理本地分支管理远程分支管理分支hotfix处理 Git 工作流常见分支冲突处理分支合并冲突…

QT Creator cmake 自定义项目结构, 编译输出目录指定

1. 目的 将不同的源文件放到不同的目录下进行管理&#xff0c; 如下&#xff1a; build: 编译输出目录 include: 头文件目录 rsources: 资源文件目录 src: cpp文件目录 2. 创建完cmake工程后修改CMakeLists.txt 配置 注 &#xff1a; 这里头文件目录是include, 所以在includ…