使用本地大语言模型和Langchain手搓免费的AI搜索问答助手

embedded/2024/9/25 23:23:59/

1 概述

语言模型虽然已经有了很多的背景知识,但针对模型训练之后新产生的内容,或者领域内的知识进行提问,大模型本身通常无法准确给出回应,一个常用的解决方法是,借助检索增强生成(RAG),将能够用于回答问题的相关上下文给到大模型,利用大模型强大的理解和生成能力,来缓解这个问题。

本文主要介绍如何借助搜索引擎,获取比较新的内容,并对这部分内容的问题进行回答。首先会简单介绍原理,然后是环境准备,代码介绍,最后会通过Chainlit,构造一个完整的AI搜索问答助手,完全免费。

本文所介绍方法,不需要使用付费大语言模型API,整个流程可以在一台笔记本电脑上运行。

最终效果如下:

可以看出,问到一些比较新的内容时,大模型也能结合网络搜索结果给出准确的回答。

2 基本原理

本文所介绍内容,总体依然是RAG,下面是总体处理流程,此流程图参考[此处]修改而来。

AI搜索问答并非现去互联网爬取数据,这样会来不及处理,通常都是借助搜索引擎。从搜过引擎获取到相关文档后,后续的所有流程,就跟一般的RAG完全一致了。

3 环境准备

3.1 操作系统

本文使用的所有组件、库,在Windows、Linux、macOS上都可以安装,理论上在这三个系统上都可以正常运行,但没有对所有系统做兼容性测试,下文以macOS 14.4 Sonoma系统,ARM系列芯片笔记本电脑的环境为例进行介绍。

3.2 Python环境准备

推荐使用Anaconda或者Miniconda准备Python环境,具体兼容的Python版本没有做完整测试,本文所使用的是Python 3.11.4。Python安装完成后,安装如下依赖包:

pip install -r requirements.txt

3.3 Ollama安装及模型下载

Ollama是一个能够在本地运行大语言模型的应用,可以直接在命令行中进行问答交互、或者使用相应的API(本文要用到的方式),以及使用第三方GUI工具,如Lobechat等。

3.3.1 模型下载

Ollama安装好之后,在命令行中,执行如下两条命令,下载相应的大语言模型和向量模型:

ollama pull qwen:7b
ollama pull znbang/bge:large-zh-v1.5-q8_0

在Ollama官方的[Models页面],提供了非常多支持的模型,如果对相关模型比较熟,可以根据机器的配置选择更大或更小的模型。

下载完成后,执行如下命令,进行二次确认,确保下图中框选的部分在列表中:

ollama list

使用如下命令,检查大语言模型是否可以正常工作:

ollama run qwen:7b

如果输出如上图所示内容,则说明大语言模型工作正常。输入/exit退出问答界面。

3.3.2 使用API

3.3.2.1 大语言模型

如果是依照本文,在本机安装Ollama,执行如下Python代码:

from AIN.html" title=langchain>langchain_community.llms.ollama import Ollamamodel_name = 'qwen:7b'
model = Ollama(base_url='http://localhost:11434', model=model_name)print(model('你是谁'))

如果输出如下内容,则表示API调用正常:

我是阿里云研发的大规模语言模型,我叫通义千问。

如果Ollama安装在其他机器,替换上述代码中的base_url

3.3.2.2 向量模型

类似大语言模型的部分,执行如下Python代码:

from AIN.html" title=langchain>langchain_community.embeddings import OllamaEmbeddingsembedding_model = OllamaEmbeddings(base_url='http://localhost:11434',model='znbang/bge:large-zh-v1.5-q8_0'
)
print(embedding_model.embed_query('你是谁'))

如果输出类似如下内容,则表明向量模型API调用正常:

[0.8701383471488953, 0.926769495010376, ...

3.4 搜索引擎API准备

许多搜索引擎都有专门的API,只需要两三行代码即可获取结果,但有些需要复杂的申请流程,有些则不合规,本文使用Bing中文版网页请求地址,借助BeautifulSoup库解析结果的方式,获取Bing搜索结果。

执行如下代码:

def search_with_bing(query):import requestsfrom bs4 import BeautifulSoupfrom urllib.parse import quote url = f'https://cn.bing.com/search?q={quote(query)}'headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'}resp = requests.get(url, headers=headers)soup = BeautifulSoup(resp.text, 'html.parser')result_elements = soup.select('#b_results > li')data = []for parent in result_elements:if parent.select_one('h2') is None:continuedata.append({'title': parent.select_one('h2').text,'abstract': parent.select_one('div.b_caption > p').text.replace('\u2002', ' '),'link': parent.select_one('div.b_tpcn > a').get('href')})return datasearch_with_bing('大语言模型')

如果结果类似如下所示,则表明执行成功:

[{'title': '什么是LLM大语言模型?Large Language Model,从量变到质变','abstract': '网页2023年4月17日 · 大语言模型(英文:Large Language Model,缩写LLM),也称大型语言模型,是一种人工智能模型,旨在理解和生成人类语言。. 它们在大量的文本数据上进行训练,可以执行广泛的任务,包括文本总结、翻译、情感分析等等。. LLM的特点是 规模庞大,包含数十亿的参数 ...','link': 'https://zhuanlan.zhihu.com/p/622518771'},{'title': '什么是大模型(LLMs)?一文读懂大型语言模型(Large ...','abstract': '网页2 天之前 · 大模型是指具有大规模参数和复杂计算结构的机器学习模型。 这些模型通常由 深度神经网络 构建而成,拥有数十亿甚至数千亿个参数。 大模型的设计目的是为了提高模型的表达能力和预测性能,能够处理更加复杂的任务和数据。 大模型在各种领域都有广泛的应用,包括自然语言处理、计算机视觉、语音识别和 推荐系统 等。 大模型通过训练海量数据 …','link': 'https://www.aigc.cn/large-models'},{'title': '一文读懂“大语言模型” - 知乎','abstract': '网页2023年7月17日 · 谷歌的 Gen AI 开发工具介绍. 2、大语言模型介绍. 2.1 大语言模型的定义. 大语言模型是深度学习的分支. 深度学习是机器学习的分支,大语言模型是深度学习的分支。 机器学习是人工智能AI)的一个子领域,它的核心是让计算机系统能够通过对数据的学习来提高性能。 在机器学习中,我们不是直接编程告诉计算机如何完成任务,而是提供大量 …','link': 'https://zhuanlan.zhihu.com/p/644183721'},
...

4 主要流程

4.1 使用搜索引擎检索互联网内容

使用上文提到的search_with_bing函数,直接调用即可

...
search_results = search_with_bing('大语言模型')
...

4.2 获取网页全文

此处简洁起见,使用requests库发送GET请求,获取网页全文。

4.3 文档解析、切片、向量化及检索

本文使用BeautifulSoup解析上文获取到原始HTML对应的文本html。通常使用这种方式解析的HTML效果比较差,可以使用Jina Reader、Firecrawl等库,获得更高质量的解析结果。

...soup = BeautifulSoup(html, 'html.parser')
item['body'] = soup.get_text()...

下方的代码,会对文本进行切片,进行向量化,并使用query获取检索结果:

...
text_splitter = RecursiveCharacterTextSplitter(["\n\n\n", "\n\n", "\n"],chunk_size=400,chunk_overlap=50
)
documents = [Document(item['body'],metadata={'href': item['href'], 'title': item['title']}
) for item in search_results.values()]
split_docs = text_splitter.split_documents(documents)
vectorstore = Chroma.from_documents(split_docs, embedding_model)
retriever = vectorstore.as_retriever(search_args={'k': 6})
retrieved_docs = retriever.get_relevant_documents(query)
context = '\n\n'.join([doc.page_content for doc in retrieved_docs])

4.4 Prompt构造

使用Prompt如下:

prompt = """请使用下方的上下文(<<<context>>><<</context>>>之间的部分)回答用户问题,如果所提供的上下文不足以回答问题,请回答“我无法回答这个问题”
<<<context>>>
{context}
<<</context>>>用户提问:{query}
请回答:
""".format(query=query, context=context)

5运行

完整代码访问https://github.com/Steven-Luo/AISearchQA获取。

首先完成第3节中的环境准备,然后执行如下命令:

sh start.sh

出现类似如下的界面,表明启动成功

可能大家都想学习AIDaMoXing.html" title=AI大模型>AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把全套AI技术和大模型入门资料、操作变现玩法都打包整理好,希望能够真正帮助到大家。

👉AIDaMoXing.html" title=AI大模型>AI大模型学习路线汇总👈
大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)
在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

👉大模型视频和PDF合集👈
观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述


http://www.ppmy.cn/embedded/47338.html

相关文章

【春秋云镜】Faculty Evaluation System未授权任意文件上传漏洞(CVE-2023-33440)

因为该靶场没有Write up,索性自己搞一下&#xff0c;方便别人&#xff0c;快乐自己&#xff01; 漏洞概述&#xff1a; Sourcecodester Faculty Evaluation System v1.0 is vulnerable to arbitrary code execution via /eval/ajax.php?actionsave_user. 漏洞复现&#xff…

与设备无关的I/O软件

目录 什么是设备无关的 I/O 软件&#xff1f; 设备无关的 I/O 软件的特征 设备无关的 I/O 软件的实现方法 设备无关的 I/O 软件的优势 设备无关 I/O 软件的好处 1. 一致的用户体验 2. 跨平台兼容性 3. 可访问性 4. 灵活性和可扩展性 5. 成本效率 6. 简化开发 示例分…

Discuz! X3.4发帖时间修改插件批量操作版

下载地址&#xff1a;Discuz! X3.4发帖时间修改插件批量操作版 发帖时间与回复时间说明 1、使用本插件修改发帖时间&#xff0c;则帖子中的回复楼层的时间会保持同步同间隔修改&#xff0c;所谓同步同间隔就是如果某个回复是在主题发布之后一小时回复的&#xff0c;那么修改之…

Altair® Inspire™ 加快仿真驱动设计,缩短产品上市时间

Inspire应用于产品开发生命周期的早期&#xff0c;通过协作加速了创新、结构高效的零件和装配体的创建、优化和研究。 Inspire 的用户体验屡获好评&#xff0c;用户可以在短短几个小时内掌握几何图形创建和修改操作&#xff0c;并且它还具有可靠的 Altair 求解器功能&#xff…

leetcode hot100 之 最长公共子序列

题目 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;…

社区版IDEA 最好用的Diagrams替代插件

Diagrams 是专业版IDEA功能&#xff0c;能很方便的生成类图。但在社区版中要比较方便的生成类图&#xff0c;就比较麻烦&#xff0c;虽然插件有一些但都不好用。 经过各种尝试对比还是SimpleUML更好用&#xff0c;SimpleUML 不能通过IDEA的插件界面安装&#xff0c;只能离线安装…

Freeswitch-soundtouch-变声开发

文章目录 一、介绍二、安装soundtouch2.1 源码安装方式&#xff08;推荐&#xff09;2.1.1下载源码2.1.2解压2.1.3 编译2.1.4 迁移&#xff08;可选&#xff09; 2.2 apt-get 安装 三、使用3.1 终端使用3.2 Freeswitch使用3.2.1编译Freeswitch的mod_soundtouch3.2.2启用 mod_so…

UML实战-BUG管理系统

概述 根据 UML建模的过程来进行一个完整系统的设计–Bug 管理系统。下面是一个标注 UML 设计过程的参考。 需求分析:用例图。系统分析:分析业务规则–状态图。系统分析:分析业务流程–活动图。系统设计:设计静态结构–类图和包图。系统设计:Action类被调用关系–序列图。…