LazyLLM教程 | 第16讲:实战:打造具备宏观问答与图表生成功能的论文问答的RAG系统

【企业知识助手·Agent 实战】如何构建 Agent 运行态可观测体系:从行为基线漂移检测到成本预算治理的深度实战 核心原理:运行态可观测的本质是把"单点阈值"升级为"与基线的分布距离"——埋点回答发生了什么,基线比较回答这是否还正常关键结论:deny 率没有单向好坏语义,必须双边告警 + known-good / known-bad 双哨兵仲裁;成本归因的终点是单位经济与预算三线一位;评测分数入库让质量拥有趋势线。 阅读详情

在前面的课程中,我们利用所学的 RAG 知识,搭建了一个基于论文的问答系统。但是当论文数量比较多时,针对一些统计信息,比如某个方向的论文数量、某个会议的论文数量等,如果只通过传统的 RAG 是没办法对这些信息进行检索的。

对此,本章将先简单回顾之前内容,并在此基础上再做升级,完成一个集统计分析和知识问答功能于一体的智能问答系统。


一、上节回顾

为了更好地理解本章内容,我们先简要回顾前两章的关键内容。

第14讲介绍了论文问答系统的构建过程,依次讲解了核心组件,如解析器、retriever、reranker 等,并展示了如何逐步搭建一个完整的 RAG 系统。同时,我们也探讨了一些进阶技巧,以提升系统的性能与灵活性。

不过,这一系统仍属于传统 RAG 架构。在第15讲中,我们进一步指出了传统 RAG 在处理统计类问题时的局限性,并提出了应对思路,如结合 SQL 数据库、Text2SQL 技术及 sql_tool 工具。然而,前章仅提出了理论方案,尚未给出完整的实践示例。

因此,本章将在此基础上,结合实际案例,构建一个更完整、 更具实用性的统计问答系统,进一步拓展 RAG 在结构化数据处理方面的能力。


二、本节概览

在本讲中,我们将在已有的论文问答系统基础上进一步拓展其功能,使系统不仅能够进行知识问答,还具备处理统计分析任务的能力。为此,我们需要对传统的 RAG 架构进行调整,增强其在统计场景下的适应性。

由于知识问答与统计问答在处理逻辑和所依赖的信息类型上存在显著差异,采用统一的 pipeline 来应对两种需求在实践中存在较大困难。因此,我们在原有 RAG pipeline 的基础上新增了一条专门处理统计任务的 pipeline,实现从【图1】到【图2】的系统结构变化。

图1 原论文系统架构图

图2 具备统计能力的问答系统架构图

在复用现有模块的基础上,我们新增了用于数据库查询、统计分析和图表生成的统计分析 pipeline。该 pipeline 与 RAG pipeline 并行运行,并通过一个意图识别模块进行统一调度。该模块负责判断用户查询属于知识问答还是统计分析,从而引导请求进入合适的处理流程。

为实现这一增强系统,我们还需要引入若干关键的技术模块。接下来将在完成数据准备后逐一介绍这些新增模块及其在系统中的作用。


三、数据准备

这里我们以 ArXivQA(https://github.com/taesiri/ArXivQA)数据集为例,从 Papers-2024.md 中抽取了前面100篇来演示,在执行代码之前您需要先下载Papers-2024.md,可以离线下载或者以下命令进行下载。该文件包含了论文信息和下载链接。

wget https://raw.githubusercontent.com/taesiri/ArXivQA/main/Papers-2024.md -O 2024.md

我们需要从两方面去准备数据:

  1. 知识库(下载论文文件到指定目录下) ,用于知识问答;

  2. 数据库(构建论文信息的表格存入本地数据库),用于统计问答,论文信息如title、author等。

以下脚本可以同时实现将论文下载到指定文件夹同时构建论文信息的数据库。

(代码块GitHub链接🔗:https://github.com/LazyAGI/Tutorial/blob/7abc91dbb82a007a78731845dd8c360ac0cc1e75/rag/codes/chapter16/CreateDataBase.py#L1)

import re
import requests
import time
import json
from tqdm import tqdm
from bs4 import BeautifulSoup

# 下载文件的函数
def spider(url, save_dir='./rag_data/papers'):
    response = requests.get(url)

    # 检查请求是否成功
    res = {}
    if response.status_code == 200:
        # 解析网页内容
        soup = BeautifulSoup(response.text, 'html.parser')
        elements = soup.find_all(class_='title mathjax')
        for ele in elements:
            res['title'] = ele.get_text().replace("Title:", '')
        elements = soup.find_all(class_='authors')
        authors = []
        for ele in elements:
            links = ele.find_all('a')
            for link in links:
                authors.append(link.get_text())
        res['author'] = ';'.join(authors)
        elements = soup.find_all(class_='tablecell subjects')
        for ele in elements:
            res['subject'] = ele.get_text()

        # 保存论文
        file_path = os.path.join(save_dir, res['title'] + '.pdf')
        with open(file_path, 'wb') as f:
            f.write(response.content)
        print(f"已保存 PDF 到 {file_path}")
        return res

    else:
        print(f"网页加载失败,状态码:{response.status_code}")


def get_information():
    with open('2024.md')as f:
        texts = f.readlines()[2:102]

    reses = []
    for text in tqdm(texts):
        abs_url = re.findall(r'\[.*?\]\((https?://arxiv.*?)\)', text)
        if len(abs_url) > 0:
            res = spider(abs_url[0])
            reses.append(res)
            time.sleep(5)

    with open('test.txt', 'w')as f:
        json.dump({"data": reses}, f)

上面这是一个获取文档信息脚本,负责解析 2024.md 中的数据,并取100篇为例,然后解析对应的 url ,然后通过获取每个 url 对应的论文标题、作者和主题的信息,并记录下来。

(代码块GitHub链接🔗:https://github.com/LazyAGI/Tutorial/blob/7abc91dbb82a007a78731845dd8c360ac0cc1e75/rag/codes/chapter16/CreateDataBase.py#L52)

import sqlite3
import json


def write_into_table():
    with open('test.txt', 'r')as f:
        data = json.load(f)

    data = data['data']

    # 连接到 SQLite 数据库(如果数据库不存在,它会被创建)
    conn = sqlite3.connect('papers.db')
    cursor = conn.cursor()

    # 创建表格
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS papers (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT,
        author TEXT,
        subject TEXT
    )
    ''')

    # 插入数据
    for paper in data:
        cursor.execute('''
        INSERT INTO papers (title, author, subject)
        VALUES (?, ?, ?)
        ''', (paper['title'], paper['author'], paper['subject']))

    # 提交并关闭连接
    conn.commit()
    conn.close()

上面的代码是根据获取的信息,创建对应的数据库信息,并把记录信息写入,用于 SQL Call 的查询。

现在完成数据准备,我们得到了固定目录下已经下载好的论文:

以及数据库文件papers.db 。


四、依赖模块详解

为了构建支持统计分析的问答系统,我们需要掌握几个核心模块的原理和实现方式,分别包括意图识别、SQL 调用、统计分析及图表生成。

(一)意图识别

首先是意图识别模块。该模块的主要职责是分析用户的输入内容,判断其意图属于传统的知识问答,还是涉及到结构化数据处理的统计问答。

LazyLLM内置了用于对意图进行分析的 IntentClassifier 类,具体介绍如下:

IntentClassifier是一个基于语言模型的意图识别器,用于根据用户提供的输入文本及对话上下文识别预定义的意图,并通过预处理和后处理步骤确保准确识别意图。

对于 IntentClassifier ,我们提供了以下参数:

  • llm: 用于意图识别的语言模型对象,OnlineChatModule或TrainableModule类型

  • intent_list (list): 包含所有可能意图的字符串列表。可以包含中文或英文的意图。

  • prompt (str): 用户附加的提示词。

  • constrain (str): 用户附加的限制。

  • examples (list[list]): 额外的示例,格式为 [[query, intent], [query, intent], …]。

  • return_trace (bool, 可选): 如果设置为 True,则将结果记录在trace中。默认为 False。

ch_prompt_classifier_template = """
## role:意图分类器
你是一个意图分类引擎,负责根据对话信息分析用户输入文本并确定唯一的意图类别。{user_prompt}

## 限制:
你只需要回复意图的名字即可,不要额外输出其他字段,也不要进行翻译。{user_constrains}

## 注意:
{attention}

## 文本格式
输入文本为JSON格式,"human_input"中内容为用户的原始输入,"intent_list"为所有意图名列表

## 示例
User: {{"human_input": "北京明天天气怎么样?", "intent_list": ["查看天气", "搜索引擎检索", "查看监控", "周报总结", "聊天"]}}
Assistant:  查看天气
{user_examples}

## 历史对话
人类和助手之间的聊天记录存储在下面的 <histories></histories> XML 标记中。
<histories>
{history_info}
</histories>

输入文本如下:
"""  # noqa E501

在 IntentClassifier 内,内置了如上所示的模板,用于将上述参数传入给大模型。IntentClassifier 的调用非常简单,下面就是两个完整调用的例子:

(代码块GitHub链接🔗:https://github.com/LazyAGI/Tutorial/blob/7abc91dbb82a007a78731845dd8c360ac0cc1e75/rag/codes/chapter16/intent_classifier.py#L1)

import lazyllm
from lazyllm.tools import IntentClassifier

classifier_llm = lazyllm.OnlineChatModule()
chatflow_intent_list = ["翻译服务", "天气查询", "内容推荐", "金融行情查询"]
classifier = IntentClassifier(classifier_llm, intent_list=chatflow_intent_list)

while True:
    query = input("输入您的问题:\n")
    print(f"\n识别到的意图是:\n {classifier(query)}\n" + "-"*40)

# 今天天气怎么样 ➔ 天气查询
# A股行情怎么样 ➔ 金融行情查询
# 给我推荐一部科幻电影 ➔ 内容推荐
# 帮我把这边论文译为中文 ➔ 翻译服务

1.意图识别-高级用法

通过with语法,使得意图识别模块能够直接跟随具体的指令。

base = TrainableModule('internlm2-chat-7b')
with IntentClassifier(base) as ic:
    ic.case['聊天', base]
    ic.case['语⾳识别', TrainableModule('SenseVoiceSmall')]
    ic.case['图⽚问答', TrainableModule('Mini-InternVL-Chat-2B-V1-5').deploy_method(deploy.LMDeploy)]
    ic.case['画图', pipeline(base.share().prompt(painter_prompt),
    TrainableModule('stable-diffusion-3-medium'))]
    ic.case['⽣成⾳乐', pipeline(base.share().prompt(musician_prompt), TrainableModule('musicgen-small'))]
    ic.case['⽂字转语⾳', TrainableModule('ChatTTS')]
    WebModule(ic, history=[base], audio=True, port=8847).start().wait()

使用方式有case[a, b],case[a: b]和case[a::b]三种,可以根据个人习惯选择使用三者无区别:

with IntentClassifier(base) as ic:
    ic.case['聊天', base]
    ic.case['语⾳识别': TrainableModule('SenseVoiceSmall')]
    ic.case['图⽚问答'::TrainableModule('Mini-InternVL-Chat-2B-V1-5').deploy_method(deploy.LMDeploy)]

(二)Sql Manager

接下来,我们解决统计问答流程中的第一环节:数据库查询与数据获取。

在之前的学习内容中,虽然我们以 SQLite 为例讲解了数据库的基本使用流程,但在真实的生产环境里,使用的数据库种类远不止 SQLite。

常见的关系型数据库还包括 MySQL、PostgreSQL、SQL Server、Oracle 等,而在云端,诸如阿里云 RDS、腾讯云 CynosDB、AWS RDS 这样的数据库服务也被广泛使用。

为了方便地连接和操作不同类型的数据库,我们可以使用 Python 中非常流行的 ORM 框架——SQLAlchemy。

SQLAlchemy 提供了统一的数据库操作接口,不仅支持本地数据库,也支持各种主流云数据库,极大地提升了数据库交互的灵活性和可扩展性。

以下为通过SQLAlchemy连接本地和远程数据库的代码。

from sqlalchemy import create_engine

# 创建 SQLite 本地数据库连接
engine = create_engine('sqlite:///local_database.db')
# 创建远程 MySQL 数据库连接
# 格式:mysql+pymysql://用户名:密码@服务器地址:端口/数据库名
engine = create_engine('mysql+pymysql://user:password@host:3306/database_name')

# 测试连接
with engine.connect() as connection:
    result = connection.execute("SELECT 1")
    print(result.fetchone())

在 lazyllm 框架中,也对这一功能进行了封装,提供了内置的 SQLManager 模块。通过 SQLManager,用户可以非常简单地连接本地或云上的数据库,统一调用 SQL 查询、执行 SQL-call 相关操作,无需关心底层连接的复杂细节。只需在配置中指定数据库地址、账号密码等信息,就可以一键启动数据库交互能力,为后续的结构化问答打下坚实基础。

(代码块GitHub链接🔗:https://github.com/LazyAGI/Tutorial/blob/7abc91dbb82a007a78731845dd8c360ac0cc1e75/rag/codes/chapter16/sql_manager.py#L1)

from lazyllm.tools import SqlManager

# 连接本地数据库
sql_manager = SqlManager("sqlite", None, None, None, None, db_name="papers.db",   tables_info_dict=table_info)
# 连接远程数据库
# sql_manager = SqlManager(type="PostgreSQL", user="", password="", host="",port="", name="",)

# 查询所有论文数量
res = sql_manager.execute_query("select count(*) as total_papser from papers;")
>>> [{"total_papser": 100}]

# 查询带有 LLM 的论文标题
res = sql_manager.execute_query("select title from papers where title like '%LLM%'")
>>> [{"title": "AmpleGCG: Learning a Universal and Transferable Generative Model of Adversarial Suffixes for Jailbreaking Both Open and Closed LLMs"}, {"title": "Learning to Localize Objects Improves Spatial Reasoning in Visual-LLMs"}, {"title": "LLMs in Biomedicine: A study on clinical Named Entity Recognition"}, {"title": "VLLMs Provide Better Context for Emotion Understanding Through Common Sense Reasoning"}]

注意,db_name 参数需要传入构建好的数据库文件路径,tables_info_dict 参数需传入数据库基本信息字典(表名、列名等),我们以论文数据库为例,基本信息的定义如下。

table_info = {
    "tables": [{
        "name": "papers",
        "comment": "论文数据",
        "columns": [
            {
                "name": "id",
                "data_type": "Integer",
                "comment": "序号",
                "is_primary_key": True,
            },
            {"name": "title", "data_type": "String", "comment": "标题"},
            {"name": "author", "data_type": "String", "comment": "作者"},
            {"name": "subject", "data_type": "String", "comment": "领域"},
        ],
    }]
}

(三)Sql Call

SQL Call 模块依赖于Sql Manager,它能够根据用户问题生成符合语义意图的 SQL 查询语句,并对接后端数据库获取原始数据。这一模块不仅是统计分析的入口,也是确保结果准确性的关键。

我们先来看一下数据准备阶段我们已经构建的数据库文件 papers.db 的内容,该库中只有一张表,包含文章的title、author 和 subject 信息:

接下来开始定义 sql call:

  • 通过指定数据库名称和数据表信息创建 sql_manager,同时实例化一个大模型用于实现text2sql。

  • 将二者传入以构建一个 SQL Call 工作流

该工作流支持将自然语言查询转化为 SQL 语句并执行查询,最终返回结果。

(代码块GitHub链接🔗:https://github.com/LazyAGI/Tutorial/blob/7abc91dbb82a007a78731845dd8c360ac0cc1e75/rag/codes/chapter16/sql_call.py#L1)

from lazyllm.tools import SqlManager, SqlCall

sql_manager = SqlManager("sqlite", None, None, None, None, db_name="papers.db",   tables_info_dict=table_info)
sql_llm = lazyllm.OnlineChatModule()
sql_call = SqlCall(sql_llm, sql_manager, 
  use_llm_for_sql_result=False)

query = "库中一共多少篇文章"
print(sql_call(query))
>>> [{"total_papers": 200}]
while True:
    query = input("请输入您的问题:")
    print("answer:")
    print(sql_call(query))
# 库中一共多少篇论文
# 库中最多的三个subject是什么
# 查询数据库并返回 subject 包含Computer Vision的论文题目的结果

(四)统计分析agent

获取数据的问题解决后,我们将进入统计分析的核心流程。本模块基于sql call实现整条统计分析pipeline,可以看作一个面向统计任务的智能agent,能够根据用户问题自动完成 数据库查询 → 数据分析 → 图表生成 → 结果汇总 的完整闭环流程。为用户提供图文并茂的答案。

1. 代码编写

我们首先定义两个工具(Tool),分别用于 SQL 查询 和 代码执行,并将它们作为可选工具提供给 Agent,支持其在执行任务过程中完成数据库查询和统计分析。

  • run_sql_query 方法基于上一节构建的 SQL Call 工作流封装而成,Agent 可在从用户查询中解析出 SQL 相关需求后调用该方法,获取结构化查询结果。

  • run_code 方法用于接收并执行大模型生成的统计分析代码。该方法会返回关键结果或报错信息,为大模型下一步的决策和行动提供反馈依据。

这两个工具配合使用,使 Agent 能够动态完成从数据获取到分析执行的全流程任务。

@fc_register("tool")
def run_sql_query(query):
    """
    Automatically generates and executes an SQL query based on a natural language request.

    Given a natural language query describing a data retrieval task, this function generates the corresponding SQL 
    statement, executes it against the database, and returns the result.

    Args:
        query (str): A natural language description of the desired database query.

    Returns:
        list[dict]: A list of records returned from the SQL query, where each record is represented as a dictionary.
    """
    sql_manager = SqlManager("sqlite", None, None, None, None, db_name="papers.db", tables_info_dict=table_info)
    sql_llm = lazyllm.OnlineChatModule(source="sensenova")
    sql_call = SqlCall(sql_llm, sql_manager, use_llm_for_sql_result=False)
    return sql_call(query)


@fc_register("tool")
def run_code(code: str):
    """
    Run the given code in a separate thread and return the result.

    Args:
        code (str): code to run.
    Returns:
        dict: {
            "text": str,
            "error": str or None,
        }
    """
    result = {
        "text": "",
        "error": None,
    }

    def code_thread():
        nonlocal result
        stdout = io.StringIO()
        try:
            with contextlib.redirect_stdout(stdout):
                exec_globals = {}
                exec(code, exec_globals)
        except Exception:
            result["error"] = traceback.format_exc()
        result["text"] = stdout.getvalue()

    thread = threading.Thread(target=code_thread)
    thread.start()
    thread.join(timeout=10)

    if thread.is_alive():
        result["error"] = "Execution timed out."
        thread.join()  

    return result

注意!在撰写函数时,一定要在函数下方加上注释,格式如下:

def myfunction(arg1: str, arg2: Dict[str, Any], arg3: Literal["aaa", "bbb", "ccc"]="aaa"):
       '''
       Function description ...

       Args:
              arg1 (str): arg1 description.
              arg2 (Dict[str, Any]): arg2 description
              arg3 (Literal["aaa", "bbb", "ccc"]): arg3 description
       '''

在大模型调用该函数时,将通过函数的描述,以及参数的表述,决定何时调用以及传入参数。

接下来我们实现agent定义,这里我们使用lazyllm内置的ReactAgent工具,将前文中定义的两个工具传入tools参数,即可实现模型自动调用。

ReactAgent是按照 Thought->Action->Observation->Thought…->Finish 的流程,一步一步的通过LLM和工具调用来显示解决用户问题的步骤,最后输出最终答案。

from lazyllm.tools.agent import ReactAgent

agent = ReactAgent(
        llm=lazyllm.OnlineChatModule(stream=False),
        tools=['run_code', 'run_sql_query'],
        return_trace=True,
        max_retries=3,
    )

然后基于上述agent,我们定义prompt,并搭建支持统计问题的sql问答流程:

sql_prompt = """
你是一位资深数据科学家,需要基于给定的问题进行必要的统计分析和绘图,来回答用户提出的统计问题。
你的工作流程如下:

1. 理解问题并进行数据查询
   - 拆解问题中需要查询数据库的部分,调用相应工具进行数据获取。

2. 判断根据数据是否可直接得出统计问题的答案  
   - 如果数据可以直接回答统计问题,则直接输出结果,必要时补充绘制图表。
   - 如果不足以回答,则先进行必要的数据分析,再根据需要绘制图表。

3. 通过编写代码并执行并获取结果的方式实现数据分析和绘图
   - 编写完整可执行的 Python 代码,包含所有必要的 import、数据加载、分析逻辑、绘图代码、结果输出。  
   - 使用常见数据科学工具包(如 pandas、numpy、scikit-learn 等)进行数据分析。  
   - 使用可视化工具(如 matplotlib、seaborn)进行图表绘制。

4. 图像保存  
   - 所有生成的图像必须保存到以下路径:  
     {image_path}
   - 保存成功后,使用以下格式将图片展示在最终回答中(Answer部分)(image_name为保存的文件名,image_path为完整路径): 
     ![image_name](image_path)

5. 错误处理  
   - 如果代码执行失败,请根据报错信息自动修改代码并重新执行,直到成功。

问题:  
{query}

"""

with pipeline() as sql_ppl:
    sql_ppl.formarter = lambda query: sql_prompt.format(query=query, image_path=IMAGE_PATH) 
    sql_ppl.agent = ReactAgent(
            llm=lazyllm.OnlineChatModule(stream=False),
            tools=['run_code', 'run_sql_query'],
            return_trace=True,
            max_retries=3,
        )
    sql_ppl.clean_output = lazyllm.ifs(lambda x: "Answer:" in x, lambda x: x.split("Answer:")[-1], lambda x:x)

if __name__ == '__main__':
    lazyllm.WebModule(sql_ppl, port=23456, static_paths=image_save_path).start().wait()

五、构建支持统计分析的论文问答系统

在掌握了系统所依赖的各项关键技术之后,我们便可以开始动手构建一个实际可用的系统,以支持统计分析与知识问答的融合能力。

整个系统的架构如下:

image.png

代码实现

我们来看怎么利用上文已经给出的结构搭建完整的多功能问答工作流。整体思路如下:

我们首先分别定义两个子工作流:

  • chat_ppl:用于处理基于 RAG(Retrieval-Augmented Generation)的通用问答任务;

  • sql_ppl:用于处理与统计分析相关的 SQL 问答任务。

随后,在主工作流中引入一个意图识别模块,用于解析用户的查询意图,并据此在 chat_ppl 与 sql_ppl 两条子工作流中选择适合的路径进行处理。通过这样的结构设计,系统能够根据用户问题的类型自动匹配合适的工作流,实现对自然语言问答和统计分析任务的统一调度与处理。

注意,在第9、10行,我们通过模块导入的方式导入在第14讲介绍的rag pipeline(build_paper_rag())和上文定义的 sql pipeline(build_statistical_agent()),在此不在重复编码。

(代码GitHub链接🔗:https://github.com/LazyAGI/Tutorial/blob/7abc91dbb82a007a78731845dd8c360ac0cc1e75/rag/codes/chapter16/statistical_agent.py#L1)

import lazyllm
from lazyllm import OnlineChatModule, pipeline, _0
from lazyllm.tools import IntentClassifier

from statistical_agent import build_statistical_agent
from paper_rag import build_paper_rag

# 构建 rag 工作流和统计分析工作流
rag_ppl = build_paper_rag()
sql_ppl = build_statistical_agent()

# 搭建具备知识问答和统计问答能力的主工作流
def build_paper_assistant():
    llm = OnlineChatModule(source='qwen', stream=False)
    intent_list = [
        "论文问答",
        "统计问答",
    ]

    with pipeline() as ppl:
        ppl.classifier = IntentClassifier(llm, intent_list=intent_list)
        with lazyllm.switch(judge_on_full_input=False).bind(_0, ppl.input) as ppl.sw:
            ppl.sw.case[intent_list[0], rag_ppl]
            ppl.sw.case[intent_list[1], sql_ppl]

    return ppl

if __name__ == "__main__":
    main_ppl = build_paper_assistant()
    lazyllm.WebModule(main_ppl, port=23459, static_paths="./images").start().wait()

然后我们就可以启动这个工作流了。我们使用WebModule来启动服务,通过 WebModule 把上面定义的工作流创建成一个 web 服务,这里需要注意,启动 WebModule 时,需要传入图片的保存路径,这样就可以把该目录设置为静态目录,gradio 就可以直接访问该目录下的图片文件了。

当 web 服务启动成功后,则根据启动后的 ip 和 port,我们就可以在浏览器中体验使用了。

(一)简单统计问题(不需要画图)

image.png

处理流程分析:

  1. 用户输入query “库中一共有多少篇论文”

  2. 大模型提取数据查询问题"库中一共多少篇论文" 调用SqlCall:

input: 
"库中一共多少篇论文"

text2sql:
select count(*) as total_papser from papers;

output:
[{"total_papers": 100}]

3. 模型判断该结果已经可以回答query的问题,直接输出回答”库中一共有100篇论文“。

【附:执行日志】

image.png

(二)简单统计问题(需要画图)

image.png

处理流程分析:

1. 用户输入query “根据数据库里的数据,告诉我最多的三个subject是什么,并绘制柱状图”

2. 大模型将对传入的query进行分析,判定需要调用run_sql_query工具获取数据,其会调用lazyllm内置的Sql调度工具SqlCall,它可以自动执行相应的sql查询语句,从数据库中获得相应的结果,结果如下。

input:
 "找出数据库中数量最多的三个subject及其数量"

text2sql:
select subject, count(*) as count
from papsers
group by count desc
limit 3;

output:
[{"subject": "\nComputer Vision and Pattern Recognition (cs.CV)", "count": 25}, {"subject": "\nRobotics (cs.RO)", "count": 6}, {"subject": "\nComputation and Language (cs.CL)", "count": 5}]

3. 模型判断该结果已经可以回答query的问题,不需要进一步进行统计分析,但是query中包含作图需求,因此其编写仅用于作图的python代码并调用run_code工具执行,以下为大模型编写的代码。

import matplotlib.pyplot as plt
import numpy as np

# 数据
labels = ['Computer Vision and Pattern Recognition (cs.CV)', 'Robotics (cs.RO)', 'Computation and Language (cs.CL)']
counts = [25, 6, 5]

# 创建柱状图
x = np.arange(len(labels))
width = 0.35
fig, ax = plt.subplots()
rects = ax.bar(x, counts, width)

# 添加标签、标题和刻度
ax.set_ylabel('Count')
ax.set_title('Top Three Subjects')
ax.set_xticks(x)
ax.set_xticklabels(labels, rotation=45)

# 显示图表
plt.tight_layout()
image_path = './images/top_three_subjects.png'
plt.savefig(image_path)

4. 作图完成后大模型根据图片路径并整合之前的结果为用户生成最终的图文并茂的回答。

【附:执行日志】

image.png

(三)复杂统计问题(需要画图)

image.png

处理流程分析:

1. 用户输入query “查询数据库中所有论文的题目,基于题目内容将论文聚类为5类,每类分别列举几个文章,并用柱状图展示每类的论文数量”

2. 大模型提取数据查询问题"库中一共多少篇论文" 调用SqlCall:

input: 
"查询库中所有论文题目"

text2sql:
select title from papers;

output:
["View Selection for 3D Captioning via Diffusion Ranking", "The Role of Language Imbalance in Cross-lingual Generalisation: Insights from Cloned Language Experiments", "OSWorld: Benchmarking Multimodal Agents for Open-Ended Tasks in Real Computer Environments", "Ferret-v2: An Improved Baseline for Referring and Grounding with Large Language Models", "Rho-1: Not All Tokens Are What You Need", "Lyapunov-stable Neural Control for State and Output Feedback: A Novel Formulation", "On Unified Prompt Tuning for Request Quality Assurance in Public Code Review", "AmpleGCG: Learning a Universal and Transferable Generative Model of Adversarial Suffixes for Jailbreaking Both Open and Closed LLMs", "High-Dimension Human Value Representation in Large Language Models", "Overparameterized Multiple Linear Regression as Hyper-Curve Fitting", ...]

3. 模型编写程序进一步进行统计分析任务,并调用 run code 工具执行。

(完整代码GitHub链接🔗:https://github.com/LazyAGI/Tutorial/blob/7abc91dbb82a007a78731845dd8c360ac0cc1e75/rag/codes/chapter16/chat_sql_qa.py#L1)

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import os

# Load data
data = ["View Selection for 3D Captioning via Diffusion Ranking", "The Role of Language Imbalance in Cross-lingual Generalisation: Insights from Cloned Language Experiments", "OSWorld: Benchmarking Multimodal Agents for Open-Ended Tasks in Real Computer Environments", "Ferret-v2: An Improved Baseline for Referring and Grounding with Large Language Models", "Rho-1: Not All Tokens Are What You Need", "Lyapunov-stable Neural Control for State and Out..."]
# Create DataFrame
df = pd.DataFrame(data, columns=['title'])

# Vectorize titles
tfidf = TfidfVectorizer(stop_words='english')
X = tfidf.fit_transform(df['title'])

# Perform K-means clustering
kmeans = KMeans(n_clusters=5, random_state=42)
df['cluster'] = kmeans.fit_predict(X)

# Count papers per cluster
cluster_counts = df['cluster'].value_counts().sort_index()

# Plot cluster counts
plt.figure(figsize=(10, 6))
cluster_counts.plot(kind='bar', color='skyblue')
plt.title('Number of Papers per Cluster')
plt.xlabel('Cluster')
plt.ylabel('Count')
plt.xticks(rotation=0)

# Save plot
os.makedirs('./images', exist_ok=True)
image_path = './images/cluster_counts.png'
plt.savefig(image_path)
plt.close()

# Print cluster counts and example titles
print("Cluster Counts:")
print(cluster_counts)
print("\nExample Titles per Cluster:")
for cluster in range(5):
    print(f"\nCluster {cluster}:")
    print(df[df['cluster'] == cluster]['title'].head(3).to_string(index=False))

print(f"\nImage saved at: {image_path}")

4. 执行完毕后大模型接收到图片路径和每类的结果,为用户生成图文并茂的回答。

【附:运行日志】

image.png

image-2.png

(四)知识问答

image.png

至此,我们构建了一个同时具备知识库问答与统计分析能力的智能问答系统。该系统不仅支持用户围绕文献内容进行语义提问,还能够针对数据库中的结构化信息执行统计分析与图表绘制,从而支持全局的数据观察需求。


六、RAG论文系统综合多模态方案

image.png

主要代码实现:

# 构建 rag 工作流和统计分析工作流
rag_ppl = build_paper_rag()
sql_ppl = build_statistical_agent()

# 搭建具备知识问答和统计问答能力的主工作流
def build_paper_assistant():
    llm = OnlineChatModule(source='qwen', stream=False)
    vqa = lazyllm.OnlineChatModule(source="sensenova",\
        model="SenseNova-V6-Turbo").prompt(lazyllm.ChatPrompter(gen_prompt))

    with pipeline() as ppl:
        ppl.ifvqa = lazyllm.ifs(
            lambda x: x.startswith('<lazyllm-query>'),
            lambda x: vqa(x), lambda x:x)
        with IntentClassifier(llm) as ppl.ic:
            ppl.ic.case["论文问答", rag_ppl]
            ppl.ic.case["统计问答", sql_ppl]

    return ppl

if __name__ == "__main__":
    main_ppl = build_paper_assistant()
    lazyllm.WebModule(main_ppl, port=23459, static_paths="./images", encode_files=True).start().wait()


扩展阅读:从知识库构建数据库

代码实现:

import lazyllm
from lazyllm.tools import SqlManager

# 创建SQL管理器
sql_manager = SqlManager(db_type="SQLite", user=None,
   password=None, host=None, port=None, db_name="doc.db")
# 创建知识库
documents = lazyllm.Document(dataset_path='/path/to/kb', create_ui=False)
# 配置提取字段
refined_schema = [
    {"key": "document_title", "desc": "The title of the paper.", "type": "text"},
    {"key": "author_name", "desc": "The names of the author of the paper.", "type": "text"},
    {"key": "keywords", "desc": "Key terms or themes discussed in the paer.", "type": "text"},
    {"key": "content_summary", "desc": "A brief summary of the paper's main content", "type": "text"},
]
# 知识库连接到SQL并设置待提取字段
documents.connect_sql_manager(
    sql_manager=sql_manager,
    schma=refined_schema,
    force_refresh=True,
)
# 开始提取知识库到数据集
documents.update_database(llm=lazyllm.OnlineChatModule(source="qwen"))
# 展示提取到的内容:
str_result = sql_manager.execute_query(f"select * from {documents._doc_to_db_processor.doc_table_name}")
print(f"str_result: {str_result}")

效果展示:

image.png

[
    {
        "lazyllm_uuid": "2c42c181-bc26-43ca-a822-505b22f5d19e",
        "lazyllm_created_at": "2025-05-16 19:10:12.014368",
        "lazyllm_doc_path": "/path/to/pdfs/DeepSeek_R1.pdf",
        "document_title": "DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning",
        "author_name": "DeepSeek-AI",
        "keywords": "DeepSeek-R1-Zero, DeepSeek-R1, reinforcement learning, reasoning models, multi-stage training, open-source, dense models, distilled models, Qwen, Llama",
        "content_summary": "The paper introduces the first-generation reasoning models, DeepSeek-R1-Zero and DeepSeek-R1. DeepSeek-R1-Zero is trained using large-scale reinforcement learning without supervised fine-tuning and demonstrates strong reasoning capabilities but faces challenges such as poor readability and language mixing. To improve upon this, DeepSeek-R1 incorporates multi-stage training and cold-start data before reinforcement learning, achieving performance comparable to OpenAI-o1-1217 on reasoning tasks. The research community is supported by the open-sourcing of DeepSeek-R1-Zero, DeepSeek-R1, and six dense models distilled from DeepSeek-R1 based on Qwen and Llama."
    }
]


更多技术内容,欢迎移步 “LazyLLM” 讨论!

《AI实战嵌入式Agent +MCP+skill》课时2.5|定时器实战 本课讲解定时器时基单元原理,通过PSC、ARR、CNT三寄存器配合实现精确周期控制。以84MHz时钟为例,计算得PSC=8399、ARR=9999可实现1秒溢出周期。采用HAL_TIM_Base_Start_IT启动定时器更新中断,在HAL_TIM_PeriodElapsedCallback中处理周期任务,实现非阻塞、高精度的定时。相比HAL_Delay的阻塞式延时,定时器中断方案不占用主循环,支持并发操作,是嵌入式系统中实现周期任务的高效方式。 阅读详情

相关推荐

ENVI 5.3与IDL 8.5安装指南:从下载到激活的完整流程

本文提供了一份详细的ENVI 5.3与IDL 8.5安装教程,涵盖从获取安装包、运行主程序、安装许可证到关键文件替换的完整流程。指南重点解决了激活过程中的常见问题,并分享了个人实践经验,旨在帮助用户,特别是遥感图像处理初学者,一次性顺利完成软件部署,为后续的科研与开发工作奠定基础。

weixin_29213827的博客 545

6 款电商 AI 图片生成软件实测|国内 + 跨境卖家工具清单

电商 AI 作图工具已经从 "能不能用" 进入了 "好不好用" 的阶段。对于绝大多数卖家而言,现在的 AI 工具已经可以覆盖 60%-80% 的基础商品图需求,显著降低拍摄和设计成本。选择工具的核心逻辑不是 "哪款最强",而是 "哪款最适配你的品类、平台规模和团队能力"。垂直电商工具胜在工作流效率,通用生图工具强在创意上限,模板类工具赢在上手速度。建议根据自身业务阶段,搭配 1-2 款主力工具 + 1 款辅助工具,形成适合自己的视觉生产流程。

Mardi_Ladin的博客 277

智慧工地算法视频分析服务器区域入侵检测AI视频分析技术在煤矿的实战应用

通过实时分析和处理井下视频资料,智慧矿山算法视频分析服务器不仅能够及时发现并预警人员违规行为和设备异常状况,还能够通过智能分析预防潜在的安全风险,从而显著提高煤矿的安全管理水平和生产效率。

EasyDarwin开源社区技术博客 559

我用 GPUWorks 在 M1 Pro 上搭了个发票识别原型

公司里经常要看电子发票。我想先做个小原型:把 PDF 发给一个自己部署的图文模型,让它提取发票类型、日期、交易双方和金额,再把结果交给同事核对。这个原型不用先接财务系统,先看看从部署到调用要走多少步,模型返回的内容能不能帮上忙。

鸽芷咕的博客 1万+

oh-my-zsh详细安装与主题插件配置

使用Linux的小伙伴都知道默认shell是bash,但是对于喜欢折腾,喜欢酷炫的我们bash怎能够用。zsh的作为一种shell,功能更强大,但是配置复杂。后来,有大佬创建了一个名为oh-my-zsh的开源项目,使用方便,功能强大。 下面就去oh-my-zsh的配置。 ①安装zsh 想要安装oh-my-zsh,首先得安装zsh,输入命令 sudo apt-get install zsh 界面如下 ②查看是否安装成功 输入命令 zsh --version 可以查看安装zsh的版本..

惜洛-Jankin的博客 2万+

多维时空数据介绍(4)多维栅格数据构建

上图中包含了经度、纬度和时间三个维度,其变量为经度、纬度、时间以及降雨量,对应的变量单位为东经多少度、北纬多少度、阳历1895-1-1日开始多少天以及每年降雨多少毫升,其中经度数值4个、纬度数值3个、时间数值2个都是一维的数据,而降雨量是一个包含经度、纬度、时间的三维数组,数值有4*3*2=24个。在GeoScene 中NetCDF数据可以用做多种多维时空数据的数据源,进行创建、可视化和分析,它可以是多维栅格数据、时空立方体,还可以是体元图层,区别在于其所要表示的内容和目的。变量又分为坐标变量和属性变量。

你好,我是小张同学! 1286

医疗 AI 有两种,别混着谈:一个改流程,一个改范式

InfoXMed 是面向医生、医学生和医学科研人员的 AI 医学工具平台,提供文献检索、全文翻译、AI 解读、指南查询和题库练习等功能,辅助临床学习、科研汇报与医学备考。原文是日本医学会杂志(JMA Journal)的一篇综述(Review Article):基本事实:这一点必须先说清:这篇论文提出的是一个研究纲领。它文中的"预测"指的是科学设想,不是可以拿来用的临床预测能力。文中甚至自己承认了一个硬缺口(见第三节)。本文只谈它的术语辨析与科学方法论,不转述任何可作为临床依据的预测或处置主张。这篇论文的全部

2601_96948740的博客 193

麒麟v10系统安装

麒麟v10系统安装

喜文BLOG 1万+

在Codex 让AI模型 拥有长期智能记忆

本文介绍Claude-Mem V15新功能——智能记忆召回,解决AI遗忘、重复提示、执行不一致等问题。通过本地部署claude-mem,实现自动记录决策(如数据库选型)、跨会话智能召回,支持记忆写入、检索、遗忘全流程闭环。相比传统记忆方案,其基于Hooks自动捕获工具调用,结构化存储,可追溯、可共享、可清理,显著提升工程效率与协作一致性,是长期项目中理想的“工作黑匣子”与“工程脑”。

米莱虾 250

YOLOv9改进策略 | Conv篇 | 2024最新ECCV最新大感受野的小波卷积WTConv助力YOLOv9有效涨点

本文给大家带来的改进机制是一种新的卷积层,称为WTConv(小波卷积层),它利用小波变换(WT)来解决卷积神经网络(CNN)在实现大感受野时遇到的过度参数化问题。WTConv的主要目的是通过对输入数据的不同频率带进行处理,使CNN能够更有效地捕捉局部和全局特征,WTConv成功解决了CNN在感受野扩展中的参数膨胀问题,提供了一种更为高效、鲁棒且易于集成的卷积层解决方案,我将其用于二次创新YOLOv9中的RepNCSPELAN4机制可以减少一定的参数量和计算量,达到一个可观的轻量化作用。

Snu77的博客 1539

Python爬虫博客:如何抓取时事新闻信息 —— 从各大新闻网站获取实时新闻数据

发送请求:向目标新闻网站发送 HTTP 请求,获取网页内容。解析网页:使用解析库(如)从网页中提取新闻标题、摘要、内容、发布时间等。绕过反爬虫机制:使用代理、设置请求头、模拟浏览器行为等策略绕过反爬虫技术。数据存储与清洗:将抓取的数据保存到本地文件或数据库中,并进行清洗,确保数据的可用性。在抓取过程中,我们还会面对很多实际问题,比如反爬虫技术、分页抓取、动态加载的内容等。接下来,我们将逐步介绍如何使用不同技术抓取静态和动态网页,并对抓取的内容进行处理。Scrapy。

2201_76125261的博客 2130

您您这可以把问小白的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭

第三层是格式编译层。这个决策背后的判断很清晰:一个批量导出工具的价值,不在于“试三次”,而在于你真正用它处理了几十份技术文档、访谈记录或课程讲义之后,它是否值得留在你的工作流里。问小白的会话列表通过分页接口加载,AI导出鸭 在页面运行时建立旁路监听,捕获每一次分页请求返回的完整对话清单,包括会话 ID、标题、时间戳和隐藏的元数据字段。让AI导出回归优雅——这句话说的是:导出不该是体力活,而应该是一次完整的、可预期的文件交付。注意:这里的“批量”指的是左侧列表里的多个独立会话,不是一条会话内的多轮对话。

laoyunsi的博客 219

提升YOLOv8检测精度的边界框损失函数Focaler-IoU与InnerFocalerIoU的应用与效果

YOLOv8是一种常用的实时目标检测模型,基于CNN(卷积神经网络)结构并结合了一些改进技术以提高检测精度和速度。YOLOv8的核心在于边界框的预测和分类,而准确的边界框预测是提高模型整体性能的关键因素之一。在传统的IoU损失基础上,Focaler-IoU和InnerFocalerIoU进一步聚焦于边界框的边缘区域,通过调整损失权重,更好地关注难以检测的边界框,提高模型的鲁棒性和准确性。# 计算IoU# 计算Focaler-IoU损失在这里,我们定义了。

博客 1340

河道漂浮物目标检测数据集

目标检测,yolo,河道漂浮物目标检测数据集

DL_data_set的博客 172

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

AI 应用开发工程师技术实践:大模型接入、通用组件封装与性能优化

本文提出AI应用从PoC到生产的核心挑战:模型调用的持续可用、可控与可优化。通过构建统一LLM网关实现多供应商路由与故障转移,封装对话、工具调用与RAG组件以解耦业务逻辑,结合前缀缓存、批处理与流式背压治理等性能优化手段,形成“接通→接稳→接快”的工程路径,最终以工程化能力决定AI应用的生产可用性。

2301_79189962的博客 509

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

大模型 Embedding 与向量相似度详解

Embedding 解决的问题:计算机不懂文字,但懂数字│▼文本 → 向量(1024维浮点数数组)│▼相似度解决的问题:怎么判断两个向量(文本)有多接近│▼余弦相似度:看向量方向的夹角,越接近0°越相似│▼最终效果:语义搜索——理解意思,而非字面匹配一句话总结:Embedding 把文字变成数字,余弦相似度比较数字的方向,两者结合实现了"理解语义"的搜索。

T3165919332的博客 64

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

AI前沿日报 · 2026-11-04 | 祛魅时刻:Astra“纯读权重“神话的崩塌

①Astra"裸权重通吃"被spaCy创始人Honnibal精准祛魅——仅1/3实验真裸读,数学能力提升依赖Python+50次迭代;②Simon Willison用Qwen 3.8-27B端侧复现权重空间编程;③Nvidia开源Auto-Ontology自动知识图谱;④$800开源全域抓取机器人Stringman;⑤OpenAI悄然重开Codex训练开关引信任危机;⑥DeepMind发布Gemini 4 Argon机器人基础模型;⑦美国科技巨头隐性AI债务达3.2万亿美元,6个月增90%。

johnsong2009的博客 499

GPT-1 架构和计算细节

下面配合框图,对 GPT-1 的每个组件做公式展开 + 数值实例(配置:12 层 × 768,12 头,FFN 3072,词表 40478,共 117M 参数)。GPT-1 把翻译模型的编码器-解码器砍掉一半,只留解码器,然后以"预测下一个词"为目标在 BooksCorpus 上预训练。与 2017 原版的四个架构差异(框图中标 ★):h0=E[token]+Epos[position],E∈R40478×768, Epos∈R512×768h^0 = E[\text{token}] + E_{pos}[\

eloudy的专栏 227

终端 AI 审计与 “龙虾” 类智能体风险治理:从可见性到闭环溯源

生成式 AI 办公普及之后,数据泄露风险逐步下沉到终端。员工将合同、源代码、客户资料粘贴至公有大模型,以及龙虾(OpenClaw)这类本地开源 AI 智能体的滥用,成为企业安全新挑战。传统网络边界防护存在审计盲区,本文从风险链路拆解、核心能力模型、分级治理策略、落地踩坑点以及技术局限性多角度,分享终端侧 AI 安全治理的实践思路。

2401_86491085的博客 593

2.53 基于极稀疏指纹的室内定位注意力图元学习

该论文发表于IEEE Transactions on Mobile Computing(TMC)2026年6月,面向极稀疏指纹条件下的WiFi室内定位,针对指纹采集人力成本高、标记指纹稀缺时定位精度大幅下降的痛点,提出注意力图元学习模型AGML(Attentional Graph Meta‑Learning),结合图神经网络、元学习、两种指纹数据增强与分布对齐技术,在标记指纹极少的场景实现高精度室内定位,同时公开了多套真实+仿真定位数据集用于基准测试。场景:二维室内空间,障碍物造成信号遮挡,

weixin_42963026的博客 311

语音识别与语音合成的技术原理及应用

语音识别 #语音合成 #人工智能 #大模型。语音识别与语音合成的技术原理及应用。一、语音识别的核心原理。二、语音合成的核心原理。三、工程落地的主要难点。五、需要关注的现实问题。

weixin_62919816的博客 171

视觉推理是在看图,还是依赖语言先验猜答案?

问一张香蕉照片“它是什么颜色”,回答黄色可能来自看图,也可能来自常识。把香蕉换成红色,错误才显露出来;但答错仍可能是没看清颜色、没理解问题,或没有把看到的属性用于回答。**总正确率不能独自区分这些解释。**封面中的红色香蕉只是概念插画,不是论文测试样本。

weixin_44369324的博客 138

设计师工作室 GEO 实操:如何提升 AI 实体推荐概率

设计工作室 GEO 的本质,是把创意服务转化为 AI 可理解的结构化信息。核心动作可归纳为:区分事实与审美、建立实体图谱、预判用户提问、输出脱敏内容、搭建多信源、持续测试验证。梳理工作室的 6 个实体属性:品类、城市、流程、边界、团队、渠道。在官网或作品集平台发布至少 3 篇结构化项目复盘,只陈述事实。输出 1 篇「设计报价影响因素」科普内容,覆盖甲方高频提问。争取 1 次行业媒体或本地媒体专访,形成第三方信源。每周用「XX 城市 + 品类 + 设计工作室推荐」指令测试,记录出现频率。

goujunwe的博客 304

AI作图软件技术选型:从4个技术维度出发的实测对比

AI作图软件技术选型:从4个技术维度出发的实测对比

Vbaoke的博客 191

深入理解 Transformer:Decoder 与 Masked Attention 速查手册

写Decoder时直接套用Encoder自注意力代码,训练loss秒降、推理却不会生成?😵 这份速查手册按“症状→诊断→改法→代价→边界”组织,30秒帮你定位masked_fill、tril、causal_mask的正确写法,附可跑代码与对照表,让你彻底搞懂“为什么不能看到未来”。🔧

2601_94912102的博客 239

WorkBuddy 实战:一句话需求 → 七屏可交互原型,户外徒步 App 的 AI 设计全流程

WorkBuddy 实战:一句话需求 → 七屏可交互原型,户外徒步 App 的 AI 设计全流程,跟着博主一起来还原整个过程。

夜郎King的博客 3910
上一篇: LazyLLM教程 | 第15讲:大视角问答:RAG如何支持跨文档、跨维度总结
下一篇: LazyLLM教程 | 第17讲:企业级RAG:权限、共享与内容安全的全链路方案
商汤万象开发者
博客等级 码龄2年 174粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值