原文链接:https://mp.weixin.qq.com/s/VF0gSTUGwoz_hV-K-6cpIw
随着做的项目越来越复杂,功能越来越多,用户越来越搞不懂系统怎么用,传统的做法就是不断的完善的文档。但是众所周知,用户最不喜欢看的东西就是文档了,用户只喜欢答案。
所以这个项目的出发点就是这个,输入文档,直接返回用户想要的答案。
在这里插入图片描述

本项目是我的尝试的学习的项目,全部代码开源,github地址放在原文链接。由于个人财力有限,体验网站用的服务器性能一般所以速度较慢,感兴趣可以交流交流源码。体验地址:http://chat.zhiwei3306.com/
整体设计思路是对上传的文档进行矢量化存储,之后对话的时候在矢量数据库中检索出对话必要的知识,将知识放入大模型上下文进行对话。专业点说其实就是RAG(检索、增强、生成)检索增强生成,就是一般大模型的联网搜索使用的技术,不同在于:大模型是直接用的搜索引擎检索,而这个项目使用的是用户自己上传的文档。

第一步需要上传文档,目前支持pdf、txt、docx格式,上传模型后,项目会提取文档中的文本内容(所以暂不支持图片,自己的服务器性能有限),提取的矢量的方法使用开源模型“GTE中文通用文本表示模型”,使用faiss保存和检索,对文档进行矢量化切分。
在这里插入图片描述
对于较大的文件会分成几个批次进行处理,平均一次处理1k字
第二步,带入上下文并进行对话,对话大模型用的是Qwen3-0.6B的版本(同样迫于服务器性能选择这个较低参数的模型)。通过增加上下文的方式,提高垂直领域大模型生成对话内容的准确性。
关键代码:

# 构建消息列表,将知识库内容单独作为system角色消息
messages = []
messages.append({"role": "system", 
"content": f"基于以下知识库内容回答问题:\n{knowledge_content}"})
# 添加历史记录(不包含之前的system消息)
for msg in user_history:
   messages.append(msg)
# 添加用户问题
messages.append({"role": "user", "content": user_input})
# 进入大模型处理
text = self.tokenizer.apply_chat_template(messages)
# 结果处理
# 更新用户历史记录,只保存用户和助手的对话
user_history.append({"role": "user", "content": user_input})
user_history.append({"role": "assistant", "content": response})

最后将用户的对话以及结果记录下来,供下次大模型调用使用。
最终效果例子如下:
在这里插入图片描述
使用的文档内容如下:
在这里插入图片描述
在这里插入图片描述

可以看出效果还是不错的,可以基本找到对应内容回答。
整个项目都是使用ai辅助编写的,ai并不是什么难事,只要学习,理解,应用,就不必害怕。ai就像互联网,时间会证明他的价值。但也无需太焦虑,互联网的出现也不是一蹴而就的,如今不会用互联网的人不也过得好好的?保持清醒,保持开发即可。
(项目还做了下优化,由于线上服务器实在太差,矢量化的过程实在太久,所以做了几个通用的矢量数据库供体验)

项目还存在很多优化的空间
如使用更好的服务器,目前使用的大模型仅仅是入门级别的模型,我使用的服务器也仅仅是一般的cpu服务器,并没有使用gpu加速。
简单想了下后续的优化方向,就想到有很多办法优化,如:
使用更多的提示词优化输出效果,避免错误的幻觉和错误的数据。
使用更标准的文档,比如Q&A格式的文档,可以大大提高准确度,我测试的文档只是网上随便找的。
进行矢量化的时候,现在是按字数进行切分的,有时候切分的位置比较尴尬会把一个问题切成两部分,导致结果不对,比较好的效果还是要按段落切分。
等等更多的措施可以优化项目,个人学习中,欢迎查看原文github点个star,文章点个爱心支持下。你有什么意见或好想法交流吗?

欢迎关注我的公众号:阿伟的水杯,获得更多信息与支持

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐