大模型agent开发之基于知识库的聊天机器人

news/2024/10/21 20:14:59

1. 文本知识库的加载和分割

实现一个智能文档助手,基于已有知识库给向ai发起提问使ai能够基于知识库回答更加准确的答案,首先需要加载对应的文档,文档类型可以是docx,xlsx,md等格式。并且对文档进行分割,将其分割成一块一块的Document类型并转成list类型方便后续处理。

    def getFile(self):print(f"Attempting to load document: {self.doc}")doc = self.docloaders = {"docx": Docx2txtLoader,"pdf": PyPDFLoader,"excel": UnstructuredExcelLoader}file_extension = doc.split(".")[-1]loader_class = loaders.get(file_extension)if loader_class:try:print(f"Using loader: {loader_class.__name__}")loader = loader_class(doc)text = loader.load()print("Loaded text:", text)# 处理返回的 text 是 list 但内容是 Document 类型的情况if isinstance(text, list):processed_text = []for t in text:if isinstance(t, Document):processed_text.append(t)else:print(f"Unknown object type in list: {type(t)}")return processed_textelif isinstance(text, str):return [text]else:raise ValueError("Loaded content is neither string nor list of strings.")except Exception as e:print(f"Error loading {file_extension} file: {e}")print(f"Document path: {doc}")return Noneelse:print(f"Unsupported file extension: {file_extension}")return None

2. 文档向量化存储

将上述切割好的文档保存在类实例‘splitText’中选择‘all-MiniLM-L6-v2’文本嵌入模型,这是一种轻量级小模型。根据该模型对列表中的每个文本块进行向量化处理,然后通过Chroma向量化数据库保存生成的向量。

    # 向量化与向量存储def embeddingAndVectorDB(self):# 确保 self.splitText 不为空if not self.splitText or len(self.splitText) == 0:raise ValueError("Document list is empty. Please provide valid documents.")# 使用本地的预训练模型,如 'all-MiniLM-L6-v2'embedding_model = LocalEmbedding('sentence-transformers/all-MiniLM-L6-v2')page_texts = []for t in self.splitText:page_texts.append(t.page_content)print(f"page: {page_texts}")# 生成嵌入embeddings = embedding_model.embed_documents(page_texts)if not embeddings or len(embeddings) != len(page_texts):raise ValueError("Mismatch between document count and embedding count.")# 打印调试信息print(f"Documents: {self.splitText}")print(f"Embeddings: {embeddings}")# 使用 Chroma 存储这些向量db = Chroma.from_texts(texts=page_texts,  # 文档列表embedding=embedding_model  # 传入自定义的嵌入模型
        )return db

 3. 索引并使用自然语言找出相关文本块

在本模块中首先获取到向量数据库并与传入的问题一起根据余弦相似度算法计算出评分最高的文本块,并将文本块返回。

    # 提问并找到相关文本块(在向量存储时使用最大边际相似性和相似性打分)def askAndFindFiles(self, question):db = self.embeddingAndVectorDB()print(f"Vector DB created: {db}")  # 确保数据库创建成功retriever = db.as_retriever(search_type="similarity_score_threshold",search_kwargs={"score_threshold": 0.1, "k": 1})context = retriever.invoke(input=question)print(f"Retrieved documents: {context}")  # 确保检索到内容return context

4. 开始和文件聊天

首先需要传入知识库文本地址,然后引用获取问题的接口,该接口回将与问题相关的文本块返回来,然后将文本块拼接好传入到本地大模型中作为提示词。

# 和文本机器人聊天
def chatWithyl(question):_content = ""context = chat_yl.askAndFindFiles(question)for i in context:_content += i.page_contentmsgs = chat_yl.prompts.format_messages(context=_content, question=question)print(msgs)response = llm(msgs)print(f"answer: {response}")

最后运行向大模型提出某一领域问题,即可得到相关的答案。

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

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

相关文章

第6课 测试用例设计

1.黑盒测试方法2.白盒测试方法术语一: • 动态测试(dynamic testing):通过运行软件的组 件或 系统来测试软件 • 静态测试(static testing):对组件的规格说明书 进行 评审,对静态代码进行走查 • 正式评审(formal review):对评审过程及需求文 档的 一种特定评审 • …

转载 兔兔电脑机器码修改工具1.0

使用说明: 1.关闭**毒软件(1.易语言编写可能会误报 2.需要修改系统信息可能会被拦截); 2.管理员运行; 3.根据需要修改机器码(部分系统需要运行兼容性初始化) 4.修改主板会屏蔽网卡,所以要先修改网卡然后再修改主板; 5.重启电脑即可恢复,网卡修改不会恢复,需要手动改…

机器学习基本介绍

1、人工智能概述 人工智能发展必备三要素:数据 算法 计算力 CPU,GPU,TPU计算力之CPU、GPU对比:CPU主要适合I\O密集型的任务GPU主要适合计算密集型任务 1.1、工智能、机器学习和深度学习的关系人工智能和机器学习,深度学习的关系:机器学习是人工智能的一个实现途径深度学习…

考场环境 NoiLinux 测试

觉得还是有必要提前练一下 用的是官网的 NoiLinux.iso 全程断网下载 虽然不知道实机预安装系统时是不是断网的 NoiLinux,但是保险一点还是选了断网省选的时候,Windows 里只有画图和 Dev-C++分辨率非常构式,需要手动调分辨率,咱们电脑是 1920*1080(没找到适配这个电脑的分辨…

面试题速刷 - 知识广度2

有哪些前端攻击?如何预防? XSS 跨站脚本攻击预防:尖括号替换,Vue中用插值{}不会发生XSS攻击。 CSRF 跨站请求伪造预防:服务端严格控制跨域,验证机制二次确认 SameSite禁止第三方cookie 点击劫持演示一下:预防: 1.判断两个iframe域名是否一致 2.让当前网页只在自己ifram…

【小 w 的代数】(提供一种 n^2 log 的解法)

前言:卖点记录 CTH 的发言CTH:你这真是 n^3 的 CTH:我也不知道你线段树优化个啥,\(n^3 \log n\) CTH:你优化到哪了啊 CTH:你从赛时打这个题到现在 11 个小时了,你从 \(n^3\) 打到 \(n^3\log n\) 了 CTH:再怎么着,我也不会一道题调三天 CTH:我一直都说这么打这么打,你…