首页 > 其他分享 >使用本地大语言模型和Langchain手搓免费的AI搜索问答助手

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

时间:2024-05-23 21:56:09浏览次数:19  
标签:... 语言 AI 问答 模型 Langchain query model Ollama

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等。

Ollama官网下载并安装对应操作系统的Ollama,Ollama详细的安装配置,请参考Ollama官网

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 langchain_community.llms.ollama import Ollama

model_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 langchain_community.embeddings import OllamaEmbeddings

embedding_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 requests
    from bs4 import BeautifulSoup
    from 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:
            continue
        data.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 data

search_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

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

标签:...,语言,AI,问答,模型,Langchain,query,model,Ollama
From: https://www.cnblogs.com/stevenluo/p/18209452

相关文章

  • LSI 3008 RAID卡硬盘定位
    前提:系统上需要准备sas3ircu工具1、获取硬盘SN号 2、通过硬盘SN找到对应Enclosure和slot.从这里看Enc:2slot:1(这里的slot就是实际硬盘位置,服务器硬盘一般是从0开始,这里的slot1就是前置面板第二块盘)如果硬盘支持点灯操作,也可以通过上面命令点灯 ......
  • 上海站丨飞天技术沙龙 Serverless + AI 专场开启报名!
    活动简介“飞天技术沙龙——Serverless技术实践营”是一场以Serverless为主题的技术活动,通过一个下午的时间增进对Serverless技术的理解,快速上手,活动受众以关注Serverless技术的开发者、企业决策人、云原生领域创业者为主,活动形式为演讲、动手实操。Serverless和AI大......
  • AIRIOT智慧变电站管理解决方案
    随着社会电气化进程的加速,电力需求与日俱增,变电站作为电网的关键节点,其稳定性和智能化管理水平直接关系到整个电力系统的高效运作。传统变电站管理平台难以适应现代电力系统复杂管理需求,存在如下痛点:数据收集与处理局限性:传统平台依赖人工或简单的自动化系统进行数据收集与处理......
  • 容器的接口访问错误:Recv failure: Connection reset by peer,Gin
    goversiongo1.22.1windows/amd64Windows11+amd64x86_64x86_64GNU/Linux--- 开发了一个golang程序:基于Ginweb框架的服务,部署到了ECS的容器(docker)上,端口40000也暴露成功了。ben发布于博客园#dockerrun-itd--namego1-m128MB-p40000:40000go1:v......
  • Spring AI 抢先体验,5 分钟玩转 Java AI 应用开发
    SpringAI是Spring官方社区项目,旨在简化JavaAI应用程序开发,让Java开发者像使用Spring开发普通应用一样开发AI应用。SpringCloudAlibabaAI以SpringAI为基础,并在此基础上提供阿里云通义系列大模型全面适配,让用户在5分钟内开发基于通义大模型的JavaAI应用。......
  • 邀您参会丨飞天技术沙龙 AI 原生应用架构专场·北京站
    活动简介AI正在重塑应用的全生命周期流程,因此AI原生应用架构的设计,以及高效和稳定地运行,已成为企业的核心关注点。本次活动从代码生成、应用的部署、应用的运行和维护,分享阿里云更低成本、更高效率、更强稳定性、更高安全性的最佳实践。活动时间:2024年5月24日(周五)13:00......
  • 卷爆短剧出海:五大关键,由AIGC重构
    短剧高温下,谈谈AIGC的助攻路线。短剧,一个席卷全球的高温赛道。以往只是踏着霸总题材,如今,内容循着精品化、IP化的自然发展风向,给内容、制作、平台等产业全链都带来新机,也让短剧消费走向文化深处,触发更大的社会渲染力。从国内到全球,短剧行业亦然乘风。业内预测分......
  • Pairwise实现(Python篇)
    开篇:测试过程中,对于多参数参数多值的情况进行测试用例组织,之前一直使用【正交分析法】进行用例组织,说白了就是把每个参数的所有值分别和其他参数的值做一个全量组合,用Python脚本实现,就是itertools模块中product方法(又称笛卡尔积法)。组合生成器,例:importitertoolsa=(......
  • Pairwise实现(Java篇)
    importjava.util.HashMap;/***PairWise(成对)测试方法*author:likeqc*date:2021-4-411:06:59*/classPairWise{/***@paramstrString[][],二维数组,一维数组str[i]中存放第i个因素的因子*/privatestaticvoidsolution(String[][]s......
  • PhiData 一款开发AI搜索、agents智能体和工作流应用的AI框架
    引言在人工智能领域,构建一个能够理解并响应用户需求的智能助手是一项挑战性的任务。PhiData作为一个开源框架,为开发者提供了构建具有长期记忆、丰富知识和强大工具的AI助手的可能性。本文将介绍PhiData的核心优势、应用示例以及如何使用PhiData来构建自己的AI助手。PhiData的设......