简易版RAG实现

        之前玩过一次RAG(检索增强生成),链接,十分简陋,现在已经无用了,时隔1年半以后又再需要实现一次。其实现在做RAG已经算相对成熟了,要求不高的话甚至可以直接跑langchain-chatchat这类现成的。因为要应付交差,可能还是得开发。这一次又是没用框架,借助了AI,折腾了3天,回头看经验没攒多少,但因为很久没写过什么像样的代码了,还是找回了点曾经的感觉。功能很简单,简单的数据管理和对话,撑死就做个本科毕设而已。

      RAG的架构图已经有很多, 就是对用户的问题增加一个知识库检索的过程,然后把检索到的资料连同问题一起询问大模型得到最终答案。中间的细节会有很多,如果要求不高,其实就是在普通的对话过程前增加一个向量数据库的数据管理。

      向量数据库这里选择用嵌入式开发,找了一下有chromadb和milvus-lite两个,由于水平下降,折腾一天milvus失败了,换成chroma。回想一下没坚持跑通milvus应该不是很正确,可能是受到milvus各文章不统一,还有AI辅助代码不准的影响。其实milvus的接口明显更好看。

       大模型调用直接选择了网络API,用的siliconflow(顺便做一波邀请,给我涨点米)。它还提供了词嵌入的接口,用起来还算方便,而且有免费bge-m3模型。包括对话模型也有一些免费的比如GLM4-9B、qwen2.5-7B 。先照着官网文档用requests写了获取embeddings的,然后又找到它推荐用openai库进行对话交互。

       整个过程除了废了的第一天以外,花费最多的应该就是前端。streamlit虽然简单,但是很多功能都得现查现用。第一次用navigation,我记得很多年前只能用sidebar.radio + 第三方美化库来实现; 第一次搞对话聊天的交互,官网有文档,确实也简单,不过我一直想做成聊天分成两部分,右侧用来显示检索结果。首先用columns布局来分。但是聊天输入也就是st.chat_input() 功能无法在column里置底,试了多次就是不行。也就是说st.chat_input只有放在纯粹的页面才会置地,否则就是跟正常控件布局一样,代码写在哪,页面就展现在哪。这点从官网文档中原话 :When st.chat_input is used in the main body of an app, it will be pinned to the bottom of the page.  研究了chat_message的输出方式才解决这个问题,就是把输入框和输出框分开用。

      另外还有一个折腾的地方是右侧检索结果的展示, 我希望结果固定,不要跟着页面滚动。因为正常左侧聊天内容不断往上堆积,聊天输入置底会让页面往下滚动,如果此时右侧正常的输出检索结果,那就得滚上去看内容。于是问怎么破,反正没有一个AI解决了,都是说用css,但是用起来总有问题,只有kimi给了个正确的方式,用了个“<div style="position: fixed;” 而且居然宽度正好合适。但是输出这段div 和st其他输出方式又不关联,所以最后只能用最笨的办法,就是直接把结果拼在这段html源码里输出。最后还研究了一下APIKEY这类安全相关信息的存放位置,保存进 ./streamlit/secrets.toml似乎更专业点。

      编码感受还是AI辅助对那些重复而不重要的地方反而效果更好,比如文本分chunk,我没用langchain,让AI模仿那个splitter,一次通过。比如获取网络请求什么的。通义灵码有个AI程序员,能帮你直接对着代码去修改,体验比纯对话好,但是效果还是一般,下次试试cline。

      如果用了langchain其他框架估计核心代码10行搞定了,从质量和积累经验的角度是有点后悔,不过还是那句话写代码折腾对我来说还是挺值得的,代码就先不放了,等交差完了再说。下一步我肯定是要用AI开发一些小功能,比如能批量解决把内容手动贴到word、网页里,估计又要浪费很多时间去踩坑。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

指针的介绍2后

1.二级指针 1.1二级指针的介绍 二级指针是指向指针的指针 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int a 100;int* pa &a;int** ppa &pa;printf("a %d\n", a);printf("&a(pa) %p\n", pa);prin…

Android开发基础知识

1 什么是Android&#xff1f; Android&#xff08;读音&#xff1a;英&#xff1a;[ndrɔɪd]&#xff0c;美&#xff1a;[ˈnˌdrɔɪd]&#xff09;&#xff0c;常见的非官方中文名称为安卓&#xff0c;是一个基于Linux内核的开放源代码移动操作系统&#xff0c;由Google成立…

【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)

羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?typebbshttps://blog.csdn.net/2401_82648291?typebbs 在本篇文章中&#xff0c;博主将带…

一个基于Python+Appium的手机自动化项目~~

本项目通过PythonAppium实现了抖音手机店铺的自动化询价&#xff0c;可以直接输出excel&#xff0c;并带有详细的LOG输出。 1.excel输出效果: 2. LOG效果: 具体文件内容见GitCode&#xff1a; 项目首页 - douyingoods:一个基于Pythonappium的手机自动化项目&#xff0c;实现了…

【Unity3D】实现Decal贴花效果,模拟战旗游戏地形效果

目录 一、基础版 二、Post Process 辉光Bloom效果 矩形渐隐 涉及知识点&#xff1a;Decal贴花、屏幕后处理Bloom、屏幕空间构建世界空间、ChracterController物体移动、Terrain地形创建 一、基础版 Unity 2019.4.0f1 普通渲染管线&#xff08;非URP、非HDRP&#xff09; UR…

03:Heap代码的分析

Heap代码的分析 1、内存对齐2、Heap_1.c文件代码分析3、Heap_2.c文件代码分析4、Heap_4.c文件代码分析5、Heap_5.c文件代码分析 1、内存对齐 内存对齐的作用是为了CPU更快的读取数据。对齐存储与不对齐存储的情况如下&#xff1a; 计算机读取内存中的数据时是一组一组的读取的…

javascript-es6 (一)

作用域&#xff08;scope&#xff09; 规定了变量能够被访问的“范围”&#xff0c;离开了这个“范围”变量便不能被访问 局部作用域 函数作用域&#xff1a; 在函数内部声明的变量只能在函数内部被访问&#xff0c;外部无法直接访问 function getSum(){ //函数内部是函数作用…

自动驾驶中的多传感器时间同步

目录 前言 1.多传感器时间特点 2.统一时钟源 2.1 时钟源 2.2 PPSGPRMC 2.3 PTP 2.4 全域架构时间同步方案 3.时间戳误差 3.1 硬件同步 3.2 软件同步 3.2.3 其他方式 ① ROS 中的 message_filters 包 ② 双端队列 std::deque 参考&#xff1a; 前言 对多传感器数据…

方豆子(递归)

方豆子 思路&#xff1a;很典的一道递归题&#xff0c;但当时没想到怎么递归/(ㄒoㄒ)/~~。赛后看了大佬的讲解知道要将这个图形看成由四个小正方形组成的大正方形&#xff0c;递归参数可以设置成&#xff08;r1,c1,r2,c2,good)表示正方形的左上角坐标和右下角坐标以及当前这个正…

正反转电路梯形图

1、正转联锁控制。按下正转按钮SB1→梯形图程序中的正转触点X000闭合→线圈Y000得电→Y000自锁触点闭合&#xff0c;Y000联锁触点断开&#xff0c;Y0端子与COM端子间的内部硬触点闭合→Y000自锁触点闭合&#xff0c;使线圈Y000在X000触点断开后仍可得电。 Y000联锁触点断开&…

JWT实现单点登录

文章目录 JWT实现单点登录JWT 简介存在问题及解决方案登录流程后端程序实现前端保存Tokenstore存放信息的缺点及解决 校验流程&#xff1a;为gateway增加登录校验拦截器 另一种单点登录方法&#xff1a;Token&#xff0b;Redis实现单点登录 JWT实现单点登录 登录流程&#xff…

*胡闹厨房*

前期准备 详细教程 一、创建项目 1、选择Universal 3D,创建项目 2、删除预制文件Readme:点击Remove Readme Assets,弹出框上点击Proceed 3、Edit-Project Setting-Quality,只保留High Fidelity 4、打开 Assets-Settings ,保留URP-HighFidelity-Renderer 和 URP-High…

【深度学习】线性回归的简洁实现

线性回归的简洁实现 在过去的几年里&#xff0c;出于对深度学习强烈的兴趣&#xff0c;许多公司、学者和业余爱好者开发了各种成熟的开源框架。 这些框架可以自动化基于梯度的学习算法中重复性的工作。 目前&#xff0c;我们只会运用&#xff1a; &#xff08;1&#xff09;通…

Java 网络原理 ②-IP协议

这里是Themberfue 经过五节课的传输层协议的讲解&#xff0c;接下来我们将进入网络层协议——IP协议的讲解了~~~ IP协议 IP 相信大家在日常生活中或多或少都听过&#xff0c;你的IP地址是什么&#xff1f;192.168.0.1 ......✨IP 其实是个网络层协议&#xff0c;即互联网协议&…

PETSc源码分析:Nonlinear Solvers

本文结合PETSc源代码&#xff0c;总结PETSc中的非线性方程组求解器。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 注2&#xff1a;文章内容会不定期更新。 参考文献 Balay S. PETSc/TAO Users Manual, Revision 3.22. Argonne National …

嵌入式C语言:结构体的多态性之结构体中的void*万能指针

目录 一、void*指针在结构体中的应用 二、实现方式 2.1. 定义通用结构体 2.2. 定义具体结构体 2.3. 初始化和使用 三、应用场景 3.1. 内存管理函数 3.2. 泛型数据结构&#xff08;链表&#xff09; 3.3. 回调函数和函数指针 3.4. 跨语言调用或API接口&#xff08;模拟…

反向代理模块。。

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

构建旧系统:打造可维护系统的艺术

作者&#xff1a;来自 Elastic Saman Nourkhalaj 软件开发人员有很多不同的任务&#xff0c;但我们每个人都必须审查旧代码。无论是检查以前的版本还是查看过去某人如何解决问题&#xff0c;遗留代码都是工作的一部分。但是你是否曾经审查过以前的版本并感到沮丧并问 “谁编写了…

PAT (Basic Level) Practice 乙级1031-1040

制作不易&#xff0c;大家的点赞和关注就是我更新的动力&#xff01; 由于这些题全是大一寒假刷的&#xff0c;部分还是c语言&#xff0c;部分的解题方法比较复杂&#xff0c;希望大家体谅。有问题欢迎大家在评论区讨论&#xff0c;有不足也请大家指出&#xff0c;谢谢大家&am…

BUUCTF 蜘蛛侠呀 1

BUUCTF:https://buuoj.cn/challenges 文章目录 题目描述&#xff1a;密文&#xff1a;解题思路&#xff1a;flag&#xff1a; 相关阅读 CTF Wiki Hello CTF NewStar CTF buuctf-蜘蛛侠呀 BUUCTF&#xff1a;蜘蛛侠呀 MISC&#xff08;时间隐写&#xff09;蜘蛛侠呀 题目描述&am…