用LLM搭建100个应用:从0到1搭建自己的Windows贾维斯

news2024/9/24 13:16:54

从ChatGPT发布至今,确实所有的应用都值得用大模型重新做一遍。国内外对基底大模型卷了又卷,新生的应用也在模型的迭代过程中,起起伏伏。

可以坚信的是,AGI的方向和每个时代人们永远在变的不变的需求。

而求外不如求己,生活中的点点滴滴,就是我这个小码农的产品经理,所以也决定开个系列,监督自己,整合下学到的东西给自己留个记录。

第一个应用灵感来源于钢铁侠的Jarvis,喊一声可以帮你做任何事。

例如,我有事情在忙,我没法操作手机和电脑,需要Jarvis帮我用微信哄一哄老婆先。

这时候Jarvis接收到我的信息,解析出操作步骤和内容,执行打开微信,搜索老婆,再输入“老婆,我等等就回来跪榴莲。”并发送,完毕。

当然,说不玄乎点就是一个超级智能体 + 多感知 + 多机互联。

根据上述Jarvis场景,我们拆解详细的技术方案:

  • 智能体:我们有大模型,结合自己写plan,写workflow
  • 多感知:做个电脑应用,支持键盘输入+语音输入
  • 多机互联:自动抓取windows窗体,到特定模块实现交互(这里可能不止是多个系统终端、网页,也可以不断地加入其他新的终端交互形式,但我们暂时以操作windows窗体为目标)

完整项目☞:github.com/metaimagine… ⭐持续更新,欢迎Star⭐

下面我们开始第一部分吧!

语言:Python

ASR:[Sherpa-onnx]

LLM:[Deepseek]

Agent框架:[Agently]

一、 接入ASR

这里使用👉[Sherpa-onnx],实测用cpu都跑得六六的。

因为我们语音交互,必不可少用到麦克风,我们直奔主题: image.png

1. 安装依赖

pip install sounddevice sherpa_onnx

2. 代码

其中,使用带节点检测的代码: [github.com/k2-fsa/sher…] 也可以直接用我改后的,新建文件microphone_asr.py,填入:

#!/usr/bin/env python3

# Please refer to
# https://k2-fsa.github.io/sherpa/onnx/pretrained_models/online-paraformer/paraformer-models.html#
# to download pre-trained sherpa
import os.path
import queue
from typing import Generator

import sounddevice as sd
import sys
import logging
import sherpa_onnx

logger = logging.getLogger(__name__)

class AsrHandler:
    def __init__(self, model_path, debug=False):
        self.recognizer = None
        self.sentence_q = queue.Queue()
        self.init_recognizer(model_path)
        self.debug = debug

    def init_recognizer(self, model_path):
        encoder = os.path.join(model_path, "encoder.int8.onnx")
        decoder = os.path.join(model_path, "decoder.int8.onnx")
        tokens = os.path.join(model_path, "tokens.txt")
        self.recognizer = sherpa_onnx.OnlineRecognizer.from_paraformer(
            tokens=tokens,
            encoder=encoder,
            decoder=decoder,
            num_threads=2,
            sample_rate=16000,
            feature_dim=80,
            enable_endpoint_detection=True,
            rule1_min_trailing_silence=2.4,
            rule2_min_trailing_silence=1.2,
            rule3_min_utterance_length=300,  # it essentially disables this rule
        )

    @staticmethod
    def show_devices():
        devices = sd.query_devices()
        if len(devices) == 0:
            logger.info("No microphone devices found")
            sys.exit(0)

        logger.info(devices)
        default_input_device_idx = sd.default.device[0]
        logger.info(f'Use default device: {devices[default_input_device_idx]["name"]}')

    def handle(self) -> Generator:
        logger.info("Microphone Asr Started! Please speak...")

        # The model is using 16 kHz, we use 48 kHz here to demonstrate that
        # sherpa-onnx will do resampling inside.
        sample_rate = 48000
        samples_per_read = int(0.5 * sample_rate)  # 0.1 second = 100 ms

        stream = self.recognizer.create_stream()

        last_result = ""
        segment_id = 0
        try:
            with sd.InputStream(
                channels=1, dtype="float32", samplerate=sample_rate
            ) as s:
                while True:
                    samples, _ = s.read(samples_per_read)  # a blocking read
                    samples = samples.reshape(-1)
                    stream.accept_waveform(sample_rate, samples)
                    while self.recognizer.is_ready(stream):
                        self.recognizer.decode_stream(stream)

                    is_endpoint = self.recognizer.is_endpoint(stream)

                    result = self.recognizer.get_result(stream)

                    if result and (last_result != result):
                        last_result = result
                        if self.debug: logger.info("\r{}:{}".format(segment_id, result))
                    if is_endpoint:
                        if result:
                            if self.debug:logger.info("\r{}:{}".format(segment_id, result))
                            segment_id += 1
                            # generator result
                            yield result

                        self.recognizer.reset(stream)
        except sd.PortAudioError as e:
            logger.exception(f"no input device found: {e}")

if __name__ == "__main__":
    try:
        asr_gen = AsrHandler(model_path="YOUR_MODEL_DIR_PATH").handle()
        for chunk in asr_gen:
            print("ASR Result : ", chunk)
    except KeyboardInterrupt:
        print("\nCaught Ctrl + C. Exiting")

3. 模型下载

模型下载指导: [k2-fsa.github.io/sherpa/onnx…] 实际上,就是里边wget的地址,我直接给其中一个模型地址的: [hub.nuaa.cf/k2-fsa/sher…] 下载后需要双解压(.tar.bz2),不清楚的可以问LLM。

4. 运行

解压后,把路径填到上述文件的YOUR_MODEL_DIR_PATH中,

运行python microphone_asr.py代码即可。

运行截图

至此,ASR部分大功告成。

二、基于Agently接入大模型

这一部分讲解如何结合LLM + ASR,实现流畅交互。

接入LLM免不了后续的管理,如workflow、长短期记忆等等,那就需要引入个Agent框架,可选方案有llama-index、langchain、Agently。而从易用性、可视化上,后者Agently则比较契合我们,主打一个上手就用。

[Agently官网]

1. 安装

pip install -U Agently

2. 调用大模型

创建agent.py设置环境变量API_KEY \ API_URL \ MODEL,加入以下代码运行之:

import os
import Agently
from dotenv import load_dotenv

load_dotenv()

agent_factory = Agently.AgentFactory()
agent_factory \
    .set_settings("current_model", "OpenAI") \
    .set_settings("model.OpenAI.auth", {"api_key": os.environ["API_KEY"]}) \
    .set_settings("model.OpenAI.url", os.environ["API_URL"]) \
    .set_settings("model.OpenAI.options", {"model": os.environ["MODEL"]})

agent = agent_factory.create_agent("agent_id_1", is_debug=True)

agent \
    .input("Hello, how are you?") \
    .start()

显示以下内容,说明调试成功: image.png

关联ASR和LLM

我们需要实现个简单的 [ 麦克风说法 - 大模型显示回复 ] 的流程,就需要将asr从语音转到的文字,作为问题传给LLM大模型,让大模型回复。

在ASR部分我们知道,ASR输出的是个生成器Generator,生成的内容是单句检测出来的文本,调用方法为:

asr_gen = AsrHandler(model_path="YOUR_MODEL_DIR_PATH").handle()
for sentence in asr_gen:
    process(sentence)

那么,对应LLM在Agently框架下,即为:

for sentence in asr_gen:
    agent \
        .input(sentence) \
        .start()

整合后的代码如下:

import os
import Agently
from dotenv import load_dotenv

load_dotenv()

#!/usr/bin/env python3

# Please refer to
# https://k2-fsa.github.io/sherpa/onnx/pretrained_models/online-paraformer/paraformer-models.html#
# to download pre-trained sherpa
import os.path
import queue
from typing import Generator

import sounddevice as sd
import sys
import logging
import sherpa_onnx

logger = logging.getLogger(__name__)

class AsrHandler:
    def __init__(self, model_path, debug=False):
        self.recognizer = None
        self.sentence_q = queue.Queue()
        self.init_recognizer(model_path)
        self.debug = debug

    def init_recognizer(self, model_path):
        encoder = os.path.join(model_path, "encoder.int8.onnx")
        decoder = os.path.join(model_path, "decoder.int8.onnx")
        tokens = os.path.join(model_path, "tokens.txt")
        self.recognizer = sherpa_onnx.OnlineRecognizer.from_paraformer(
            tokens=tokens,
            encoder=encoder,
            decoder=decoder,
            num_threads=2,
            sample_rate=16000,
            feature_dim=80,
            enable_endpoint_detection=True,
            rule1_min_trailing_silence=2.4,
            rule2_min_trailing_silence=1.2,
            rule3_min_utterance_length=300,  # it essentially disables this rule
        )

    @staticmethod
    def show_devices():
        devices = sd.query_devices()
        if len(devices) == 0:
            logger.info("No microphone devices found")
            sys.exit(0)

        logger.info(devices)
        default_input_device_idx = sd.default.device[0]
        logger.info(f'Use default device: {devices[default_input_device_idx]["name"]}')

    def handle(self) -> Generator:
        logger.info("Microphone Asr Started! Please speak...")

        # The model is using 16 kHz, we use 48 kHz here to demonstrate that
        # sherpa-onnx will do resampling inside.
        sample_rate = 48000
        samples_per_read = int(0.5 * sample_rate)  # 0.1 second = 100 ms

        stream = self.recognizer.create_stream()

        last_result = ""
        segment_id = 0
        try:
            with sd.InputStream(
                channels=1, dtype="float32", samplerate=sample_rate
            ) as s:
                while True:
                    samples, _ = s.read(samples_per_read)  # a blocking read
                    samples = samples.reshape(-1)
                    stream.accept_waveform(sample_rate, samples)
                    while self.recognizer.is_ready(stream):
                        self.recognizer.decode_stream(stream)

                    is_endpoint = self.recognizer.is_endpoint(stream)

                    result = self.recognizer.get_result(stream)

                    if result and (last_result != result):
                        last_result = result
                        if self.debug: logger.info("\r{}:{}".format(segment_id, result))
                    if is_endpoint:
                        if result:
                            if self.debug:logger.info("\r{}:{}".format(segment_id, result))
                            segment_id += 1
                            # generator result
                            yield result

                        self.recognizer.reset(stream)
        except sd.PortAudioError as e:
            logger.exception(f"no input device found: {e}")

if __name__ == "__main__":
    agent_factory = Agently.AgentFactory()
    agent_factory \
        .set_settings("current_model", "OpenAI") \
        .set_settings("model.OpenAI.auth", {"api_key": os.environ["API_KEY"]}) \
        .set_settings("model.OpenAI.url", os.environ["API_URL"]) \
        .set_settings("model.OpenAI.options", {"model": os.environ["MODEL"]})

    agent = agent_factory.create_agent("agent_id_1", is_debug=True)

    try:
        asr_gen = AsrHandler(model_path=".models/asr/sherpa/sherpa-onnx-streaming-paraformer-bilingual-zh-en").handle()
        for sentence in asr_gen:
            agent \
                .input(sentence) \
                .start()
    except KeyboardInterrupt:
        print("\nCaught Ctrl + C. Exiting")

三、结束

本文讲述了实现windows上Jarvis的简单技术方案,同时完成了ASR和LLM的接入,实现了二者的丝滑交互。

下一篇将会进入交互模块,如何展示Agent的强大功能,如何实现窗体交互。

在这里插入图片描述

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

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

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

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

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

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

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

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

在这里插入图片描述

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

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

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

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

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

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

在这里插入图片描述

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

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

相关文章

人像后期精修 调色+精修笔记(精修+化妆+美术)

色彩调节 关于调色曲线的学习: 学习链接:一看就懂的曲线调色教程【手机摄影后期】_哔哩哔哩_bilibili 从左向右就是由暗部越来越到亮部 越靠近右侧的越是亮部 精修常用技巧 学习视频:【PS精修教程】2024最详细最全的PS人像精修全套68集&a…

机器学习入门(五):K近邻算法API K值选择问题

目录 1. K 近邻算法 API 1.1 Sklearn API介绍 1.2 鸢尾花分类示例代码 1.3 小结 2. K 值选择问题 2.1 K取不同值时带来的影响 2.2 如何确定合适的K值 2.3 GridSearchCV 的用法 2.4 小结 1. K 近邻算法 API K近邻(K-Nearest Neighbors, KNN)算法作…

(附源码)SSM动漫展示系统的开发-计算机毕设 25454

SSM动漫展示系统的开发 摘 要 21世纪,全球网络化,科技在突飞猛进。我们的生活也随之发生了极大的变化。随着计算机的普及,我们社会和经济生活中的各个领域也在发生改变。人们进行信息交流的深度与广度在不断增加,这使得传统的行业模式也要跟随…

【乐吾乐大屏可视化组态编辑器】发送指令

发送指令 在线使用:https://v.le5le.com/ 发送指令是指将数据通过通信接口下发到设备 1. 拖动图元(以按钮为例)到画布,右侧切换到交互面板,添加单击事件。 2. 点击“添加动作”,动作类型选择“发送数据”…

图像文本擦除无痕迹!复旦提出EAFormer:最新场景文本分割新SOTA!(ECCV`24)

文章链接:https://arxiv.org/pdf/2407.17020 git链接:https://hyangyu.github.io/EAFormer/ 亮点直击 为了在文本边缘区域实现更好的分割性能,本文提出了边缘感知Transformer(EAFormer),该方法明确预测文…

JS 【详解】sourcemap

sourcemap 的作用 JS 上线时要压缩、混淆,线上的 JS 报错信息无法识别行、列,sourcemap 可解决这个问题 sourcemap 的原理 sourcemap 文件中,保存了 JS 代码压缩后和压缩前的对应关系 怎样找到 sourcemap 文件 方法1:将 JS 的后缀…

以太彩光网 VS PON网络 谁更适合企业级园区

耿望阳 中建协绿建与智能分会专家委副主任、华南理工大学建筑设计研究院电气(智能化)顾问总工 光进铜退的背后,折射的是时代的变迁,技术的进步。自2009年起,光纤技术至今早已潜移默化渗透到人们工作和生活每个角落,全光网已经具备了未来的确定性,而对于企业级市场来说,该怎么…

c语言第12天

指针的引入 为函数修改实参提供支持。 为动态内存管理提供支持。 为动态数据结构提供支持。 为内存访问提供另一种途径。 指针概述 内存地址:系统为了内存管理的方便,将内存划分为一个个的内存单元(1个内存单元占1个字 节)&…

opencv 深度图视差图可视化案例

参考:https://www.cnblogs.com/zyly/p/9373991.html(图片这里面下载的) https://blog.csdn.net/He3he3he/article/details/101053457 双目测距论文: http://www.shcas.net/jsjyup/pdf/2016/9/%E5%9F%BA%E4%BA%8E%E5%8F%8C%E7%9B%AE%E7%AB%8B%E4%BD%93%E8%A7%86%E8%A7%89%E…

【51蛋骗鸡矩阵键盘组合键的使用】2021-12-28

组合键以第一按键所在的行列除外可以和任意的按键组合,每一个都可以和剩下的9个组合。 unsigned char JianPanShaoMiao(/*使用行列反转扫描法*/) { unsigned char H15,L240,Ys0;P1H;if(P1!15){ while(Ys);//消抖HP1;P1L;LP1;while(Ys);//消抖 // while(P1!240);/…

Temu测评自养号的基本概念和目的

在跨境电商领域,自养号的创建与维护已成为提升业务效率、规避平台风险的关键策略。实现稳定、高效、安全的Temu测评自养号运营。 环境系统构建:掌握核心技术,规避依赖风险 市场上的现成解决方案往往缺乏定制化风控能力,自建系统则…

车载 | 硬体: 教你如何进行校准高通QCA6595的Wi-Fi频偏

在高通QCA6595产品在投入使用前,进行频率校准是关键步骤,以保障其与其他设备的顺畅搜索和连接稳定性。本文旨在提供一份全面的操作指南,助您完成校准流程。 首先,根据下图指示,完成QCA6595芯片与电脑、测试仪器之间的…

软件测试下的AI之路(6)

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。 💎声明:博主日常工作较为繁忙,文章会不定期更新,各类行业或职场问题欢迎大家…

智改数转:传统企业数字化转型的新机遇

引言 在当今全球化与科技高速发展的时代,数字化和智能化浪潮正以前所未有的速度改变着各行各业的运营方式。作为现代经济的重要组成部分,传统企业面临着来自市场和技术的双重压力。面对新兴技术驱动的新商业模式的冲击,以及不断变化的消费者期…

【后端速成 Vue】实现动态表白墙

前言: 通过前面几篇的文章的讲解,已经学习到了很多的 Vue 指令了,那么现在就将学习到的指令利用起来,做一个小的 demo。 最终效果图: 通过效果图可以发现,一共有这几个功能: ● 渲染列表&…

Raft分布式存储

文章目录 前言一、项目大纲二、Raft模块1.Raft介绍2.大致内容Leader与选举日志同步、心跳raft日志的两个特点 3.主要流程1. raft类的定义2.启动初始化3.竞选leaderelectionTimeOutTicker:doElectionsendRequestVoteRequestVote 4.日志复制、心跳leaderHearBeatTickerdoHeartBea…

华媒舍:6种明星代言推广策略,轻松吸引消费者目光!

1. 背书代言 背书代言是最常见的明星代言策略之一,也是最直接有效的一种方式。背书代言通过让明星以自己的名义、形象和声誉来推荐特定产品或服务,以吸引消费者的关注和购买意愿。这种策略依托于明星在社交媒体、电视广告等渠道的影响力,可以…

【npm】如何将自己的插件发布到npm上

前言 简单说下 npm 是什么: npm 是一个 node 模块管理工具,也是全球最大的共享源。 npm 工具与 nodejs 配套发布,便利开发人员共享代码。npm 主要包括 npm 官方网站、CLI(控制台命令行工具)、和 registry(…

【可能是全网最丝滑的LangChain教程】二十、LangChain进阶之Chains

我们笑着说再见,却深知再见遥遥无期。 01 Chain介绍 在LangChain 中,“Chain” 是指一系列可以串联起来执行特定任务的组件或模型。这些链条可以包括预处理、模型调用、后处理等步骤,它们共同工作以完成一个复杂的语言处理任务。 咱说点人话…

3:svgicon的使用的整体步骤

1:在src下创建icons文件放入svg文件的icon,并切创建index.js, 来处理icon 主要创建:1:src/icons/svg/svg格式icon 2:src/icons/index.js 2:src/icons/index.js 写入代码如下(注释比较明确&#…