使用Llama Index与Streamlit实现一个从文本中提取专业术语和定义网页小程序

Llama Index有许多用例(语义搜索、摘要等),并且都有很好的记录。然而,这并不意味着我们不能将Llama Index应用到非常具体的用例中!

在本教程中,我们将介绍使用Llama Index从文本中提取专业术语和定义的设计过程,同时允许用户稍后查询这些术语。使用Streamlit,我们可以提供一种简单的方法来构建用于运行和测试所有这些的前端,并快速迭代我们的设计。

本教程假设您已经安装了Python3.9+和以下软件包:

  • llama-index-core
  • llama-index-llms-dashscope
  • llama-index-embeddings-dashscope
  • streamlit

在最基础的功能设计层面上,我们的目标是从文档中获取文本,提取术语和定义,然后为用户提供查询专业术语和定义知识库的方法。本教程将介绍Llama IndexStreamlit的功能,并希望为出现的常见问题提供一些有用的解决方案。

上传文本

第一步是为用户提供一种手动输入文本的方法。让我们使用Streamlit编写一些代码来提供此网页界面!使用以下代码并使用streamlit run app.py命令启动应用程序。

import streamlit as st

st.title("🦙 骆驼索引术语提取器 🦙")

document_text = st.text_area("输入原始文本")
if st.button("提取术语和定义") and document_text:
    with st.spinner("提取中..."):
        extracted_terms = document_text  # 这是一个临时的,下面是提取术语实现
    st.write(extracted_terms)

在这里插入图片描述

超级简单,对吧!但你会注意到这个应用程序还没有做任何有用的事情。要使用llama_index,我们还需要设置DashScope LLMLLM有很多可能的设置,所以我们可以让用户自己决定哪种设置最好。我们也应该允许用户设置用于提取术语的提示词(这也有助于我们调试出最有效的设置)。

LLM 设置

下一步给我们的应用引入了一些标签页,以将其分为提供不同功能的不同面板。让我们创建一个标签页用于 LLM 设置,另一个用于上传文本:

import streamlit as st


DEFAULT_TERM_STR = (
    "列出在上下文中定义的术语和定义的列表, "
    "每一行上有一对。 "
    "如果一个术语缺少它的定义,用你最好的判断。"
    "按如下方式书写每一行:\n术语: <term> 定义: <definition>"
)

st.title("🦙 骆驼索引术语提取器 🦙")

setup_tab, upload_tab = st.tabs(["设置", "上传/提取术语"])

with setup_tab:
    st.subheader("LLM 设置")
    api_key = st.text_input("在这里输入OpenAI API密钥", type="password")
    llm_name = st.selectbox("选择LLM模型?", ["qwen-turbo", "qwen-plus"])
    model_temperature = st.slider(
        "LLM Temperature", min_value=0.0, max_value=1.0, step=0.1
    )
    term_extract_str = st.text_area(
        "提取术语和定义的查询。",
        value=DEFAULT_TERM_STR,
    )

with upload_tab:
    st.subheader("提取和查询定义")
    document_text = st.text_area("输入原始文本")
    if st.button("提取术语和定义") and document_text:
        with st.spinner("提取中..."):
            extracted_terms = document_text  #默认提示符 临时定义,后面实现
        st.write(extracted_terms)

现在我们的应用有了两个标签页,这真的有助于组织应用的功能。你还会注意到我添加了一个默认的提示词用于提取术语——你可以稍后在尝试提取一些术语后更改它,这只是我在经过一些实验后得出的一个提示词。

说到提取术语,是时候添加一些函数来实现这一功能了!
在这里插入图片描述

提取和存储术语

现在我们已经能够定义LLM设置和输入文本,我们可以尝试使用Llama Index从文本中提取专业术语!

我们可以添加以下函数来初始化LLM,并使用它从输入文本中提取术语。

import os

import streamlit as st
from llama_index.core import Document, SummaryIndex
from llama_index.llms.dashscope import DashScope

DEFAULT_TERM_STR = (
    "列出在上下文中定义的术语和定义的列表, "
    "每一行上有一对。 "
    "如果一个术语缺少它的定义,用你最好的判断。"
    "按如下方式书写每一行:\nTerm: <term> Definition: <definition>"
)


def get_llm(llm_name, model_temperature, api_key, max_tokens=256):
    os.environ["DASHSCOPE_API_KEY"] = api_key
    return DashScope(emperature=model_temperature,model_name=llm_name, api_key=api_key, max_tokens=max_tokens)


def extract_terms(
        documents, term_extract_str, llm_name, model_temperature, api_key
):
    llm = get_llm(llm_name, model_temperature, api_key, max_tokens=1024)

    temp_index = SummaryIndex.from_documents(
        documents,
    )
    query_engine = temp_index.as_query_engine(
        response_mode="tree_summarize", llm=llm
    )
    terms_definitions = str(query_engine.query(term_extract_str))
    print(terms_definitions)
    terms_definitions = [
        x
        for x in terms_definitions.split("\n")
        if x and "Term:" in x and "Definition:" in x
    ]
    # 将文本解析为字典
    terms_to_definition = {
        x.split("Definition:")[0]
        .split("Term:")[-1]
        .strip(): x.split("Definition:")[-1]
        .strip()
        for x in terms_definitions
    }
    return terms_to_definition


st.title("🦙 骆驼索引术语提取器 🦙")

setup_tab, upload_tab = st.tabs(["设置", "上传/提取术语"])

with setup_tab:
    st.subheader("LLM 设置")
    api_key = st.text_input("在这里输入OpenAI API密钥", type="password")
    llm_name = st.selectbox("选择LLM模型?", ["qwen-turbo", "qwen-plus"])
    model_temperature = st.slider(
        "LLM Temperature", min_value=0.0, max_value=1.0, step=0.1
    )
    term_extract_str = st.text_area(
        "提取术语和定义的查询。",
        value=DEFAULT_TERM_STR,
    )

with upload_tab:
    st.subheader("提取和查询定义")
    document_text = st.text_area("输入原始文本")
    if st.button("提取术语和定义") and document_text:
        with st.spinner("提取中..."):
            extracted_terms = extract_terms(
                [Document(text=document_text)],
                term_extract_str,
                llm_name,
                model_temperature,
                api_key,
            )
        st.write(extracted_terms)

在这里插入图片描述

代码发生了很多变动,让我们花点时间来回顾一下代码发生的改变。

get_llm()基于setup选项卡中的用户配置实例化LLM。基于模型名称,我们需要使用适当的类(DashScope)。

extract_terms()函数是所有核心操作发生的地方。首先,我们使用max_tokens=1024调用get_llm(),因为我们不想在提取术语和定义时过多地限制模型(如果没有设置,默认值是256)。然后,我们定义Settings对象,将num_outputmax_tokens值对齐,并将块大小设置为不大于输出。当文档被Llama Index索引时,如果文档很大,它们会被分解成块(也称为节点),chunk_size设置这些块的大小。

接下来,我们创建一个临时摘要索引并传入我们的llm。摘要索引将读取索引中的每一条文本,这对于提取术语来说是完美的。最后,使用response_mode="tree_summarize "使用预定义的查询文本提取术语。此响应模式将自底向上生成一个摘要树,其中每个父节点总结其子节点。最后,返回树的顶部,它将包含我们提取的所有术语和定义。

最后,我们做一些次要的后期处理。我们假设模型遵循了说明,并在每行上放置了一个术语/定义对。如果一行缺少Term:或Definition:标签,我们跳过它。然后,我们将其转换为便于存储的字典!

保存提取的术语

现在我们可以提取术语了,我们需要将它们放在某个地方,以便以后查询它们。VectorStoreIndex现在应该是一个完美的选择!但除此之外,我们的应用程序还应该跟踪哪些项被插入到索引中,以便我们稍后可以检查它们。使用st.session_state,我们可以将当前的术语列表存储在会话字典中,每个用户都是唯一的!

首先,让我们添加一个特性来初始化全局向量索引,并添加另一个函数来插入提取的术语。

import os

import streamlit as st
from llama_index.core import Document, SummaryIndex, Settings, VectorStoreIndex
from llama_index.embeddings.dashscope import DashScopeEmbedding, DashScopeTextEmbeddingModels, \
    DashScopeTextEmbeddingType
from llama_index.llms.dashscope import DashScope



DEFAULT_TERM_STR = (
    "列出在上下文中定义的术语和定义的列表, "
    "每一行上有一对。 "
    "如果一个术语缺少它的定义,用你最好的判断。"
    "按如下方式书写每一行:\nTerm: <term> Definition: <definition>"
)

if "all_terms" not in st.session_state:
    st.session_state["all_terms"] = {}


def insert_terms(terms_to_definition):
    for term, definition in terms_to_definition.items():
        doc = Document(text=f"Term: {term}\nDefinition: {definition}")
        st.session_state["llama_index"].insert(doc)


@st.cache_resource
def initialize_index(api_key):
    Settings.embed_model = DashScopeEmbedding(
        api_key=api_key,
        model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,
        text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,
    )
    return VectorStoreIndex([])


def get_llm(llm_name, model_temperature, api_key, max_tokens=256):
    return DashScope(emperature=model_temperature, model_name=llm_name, api_key=api_key, max_tokens=max_tokens)


def extract_terms(
        documents, term_extract_str, llm_name, model_temperature, api_key
):
    llm = get_llm(llm_name, model_temperature, api_key, max_tokens=1024)

    temp_index = SummaryIndex.from_documents(
        documents,
    )
    query_engine = temp_index.as_query_engine(
        response_mode="tree_summarize", llm=llm
    )
    terms_definitions = str(query_engine.query(term_extract_str))
    print(terms_definitions)
    terms_definitions = [
        x
        for x in terms_definitions.split("\n")
        if x and "Term:" in x and "Definition:" in x
    ]
    # 将文本解析为字典
    terms_to_definition = {
        x.split("Definition:")[0]
        .split("Term:")[-1]
        .strip(): x.split("Definition:")[-1]
        .strip()
        for x in terms_definitions
    }
    return terms_to_definition


st.title("🦙 骆驼索引术语提取器 🦙")

setup_tab, upload_tab = st.tabs(["设置", "上传/提取术语"])

with setup_tab:
    st.subheader("LLM 设置")
    api_key = st.text_input("在这里输入OpenAI API密钥", type="password")
    llm_name = st.selectbox("选择LLM模型?", ["qwen-turbo", "qwen-plus"])
    model_temperature = st.slider(
        "LLM Temperature", min_value=0.0, max_value=1.0, step=0.1
    )
    term_extract_str = st.text_area(
        "提取术语和定义的查询。",
        value=DEFAULT_TERM_STR,
    )

with upload_tab:
    st.subheader("提取和查询定义")
    if st.button("初始化索引和重置术语"):
        st.session_state["llama_index"] = initialize_index(api_key)
        st.session_state["all_terms"] = {}
    if "llama_index" in st.session_state:
        st.markdown(
            "请在下面输入要提取术语的文本。"
        )
        document_text = st.text_area("输入原始文本")
        if st.button("提取术语和定义") and document_text:
            st.session_state["terms"] = {}
            terms_docs = {}
            with st.spinner("提取中..."):
                terms_docs.update(
                    extract_terms(
                        [Document(text=document_text)],
                        term_extract_str,
                        llm_name,
                        model_temperature,
                        api_key,
                    )
                )
            st.session_state["terms"].update(terms_docs)

        if "terms" in st.session_state and st.session_state["terms"]:
            st.markdown("提取术语")
            st.json(st.session_state["terms"])

            if st.button("是否插入术语?"):
                with st.spinner("正在插入术语"):
                    insert_terms(st.session_state["terms"])
                st.session_state["all_terms"].update(st.session_state["terms"])
                st.session_state["terms"] = {}
                st.rerun()

现在你真的开始使用Streamlit的强大功能了!让我们从upload上传标签下的代码开始。我们添加了一个按钮来初始化向量索引,并将其存储在全局的Streamlit状态字典中,同时重置当前提取的术语。然后,在从输入文本中提取术语之后,我们将提取的术语再次存储到全局状态中,并给用户一个机会来审查这些术语。如果按下插入按钮,那么我们将调用我们的插入术语函数,更新我们对已插入术语的全局跟踪,并从会话状态中移除最近提取的术语。
在这里插入图片描述

查询提取的术语/定义

提取并保存了术语和定义后,我们如何使用它们?用户如何记住之前保存的内容?我们可以简单地在应用程序中添加一些选项卡来处理这些功能。

import streamlit as st
from llama_index.core import Document, SummaryIndex, Settings, VectorStoreIndex
from llama_index.embeddings.dashscope import DashScopeEmbedding, DashScopeTextEmbeddingModels, \
    DashScopeTextEmbeddingType
from llama_index.llms.dashscope import DashScope, DashScopeGenerationModels

DEFAULT_TERM_STR = (
    "列出在上下文中定义的术语和定义的列表, "
    "每一行上有一对。 "
    "如果一个术语缺少它的定义,用你最好的判断。"
    "按如下方式书写每一行:\nTerm: <term> Definition: <definition>"
)

if "all_terms" not in st.session_state:
    st.session_state["all_terms"] = {}


def insert_terms(terms_to_definition):
    for term, definition in terms_to_definition.items():
        doc = Document(text=f"Term: {term}\nDefinition: {definition}")
        st.session_state["llama_index"].insert(doc)


def initialize_index(api_key: str):
    print('api_key', api_key)
    Settings.llm = DashScope(
        model_name=DashScopeGenerationModels.QWEN_TURBO, api_key=api_key, max_tokens=512
    )
    Settings.embed_model = DashScopeEmbedding(
        api_key=api_key,
        model_name=DashScopeTextEmbeddingModels.TEXT_EMBEDDING_V2,
        text_type=DashScopeTextEmbeddingType.TEXT_TYPE_DOCUMENT,
    )
    return VectorStoreIndex([])


def get_llm(llm_name, model_temperature, api_key, max_tokens=256):
    return DashScope(emperature=model_temperature, model_name=llm_name, api_key=api_key, max_tokens=max_tokens)


def extract_terms(
        documents, term_extract_str, llm_name, model_temperature, api_key
):
    llm = get_llm(llm_name, model_temperature, api_key, max_tokens=1024)

    temp_index = SummaryIndex.from_documents(
        documents,
    )
    query_engine = temp_index.as_query_engine(
        response_mode="tree_summarize", llm=llm
    )
    terms_definitions = str(query_engine.query(term_extract_str))
    print(terms_definitions)
    terms_definitions = [
        x
        for x in terms_definitions.split("\n")
        if x and "Term:" in x and "Definition:" in x
    ]
    # 将文本解析为字典
    terms_to_definition = {
        x.split("Definition:")[0]
        .split("Term:")[-1]
        .strip(): x.split("Definition:")[-1]
        .strip()
        for x in terms_definitions
    }
    return terms_to_definition


st.title("🦙 骆驼索引术语提取器 🦙")

setup_tab, terms_tab, upload_tab, query_tab = st.tabs(
    ["设置", "所有术语", "上传/提取术语", "查询术语"]
)

with setup_tab:
    st.subheader("LLM 设置")
    api_key = st.text_input("在这里输入OpenAI API密钥", type="password")
    llm_name = st.selectbox("选择LLM模型?", ["qwen-turbo", "qwen-plus"])
    model_temperature = st.slider(
        "LLM Temperature", min_value=0.0, max_value=1.0, step=0.1
    )
    term_extract_str = st.text_area(
        "提取术语和定义的查询。",
        value=DEFAULT_TERM_STR,
    )

with upload_tab:
    st.subheader("提取和查询定义")
    if st.button("初始化索引和重置术语"):
        st.session_state["llama_index"] = initialize_index(api_key)
        st.session_state["all_terms"] = {}
    if "llama_index" in st.session_state:
        st.markdown(
            "请在下面输入要提取术语的文本。"
        )
        document_text = st.text_area("输入原始文本")
        if st.button("提取术语和定义") and document_text:
            st.session_state["terms"] = {}
            terms_docs = {}
            with st.spinner("提取中..."):
                terms_docs.update(
                    extract_terms(
                        [Document(text=document_text)],
                        term_extract_str,
                        llm_name,
                        model_temperature,
                        api_key,
                    )
                )
            st.session_state["terms"].update(terms_docs)

        if "terms" in st.session_state and st.session_state["terms"]:
            st.markdown("提取术语")
            st.json(st.session_state["terms"])

            if st.button("是否插入术语?"):
                with st.spinner("正在插入术语"):
                    insert_terms(st.session_state["terms"])
                st.session_state["all_terms"].update(st.session_state["terms"])
                st.session_state["terms"] = {}
                st.rerun()

with terms_tab:
    with terms_tab:
        st.subheader("当前提取的术语和定义")
        st.json(st.session_state["all_terms"])

with query_tab:
    st.subheader("查询术语/定义!")
    st.markdown(
        (
            "LLM将尝试回答您的查询,并使用您插入的术语/定义来扩展它的答案。 "
            "如果一个项不在索引中,它将使用它的内部知识来回答。"
        )
    )
    if st.button("初始化索引和重置术语", key="init_index_2"):
        st.session_state["llama_index"] = initialize_index(api_key)
        st.session_state["all_terms"] = {}

    if "llama_index" in st.session_state:
        query_text = st.text_input("询问一个术语或定义:")
        if query_text:
            query_text = (
                    query_text
                    + "\n如果你找不到答案,那就尽你所能去回答这个问题。"
            )
            with st.spinner("生成回答..."):
                response = (
                    st.session_state["llama_index"]
                    .as_query_engine(
                        similarity_top_k=5,
                        response_mode="compact",
                    )
                    .query(query_text)
                )
            st.markdown(str(response))

虽然这大部分是基础性的,但有些重要的点需要注意:

  • 我们的初始化按钮与其它按钮有相同的文本。Streamlit会对此提出警告,因此我们提供了一个唯一的键来解决这个问题。
  • 查询中添加了一些额外的文本!这是为了尝试弥补索引没有答案的情况。
  • 在我们的索引查询中,我们指定了两个选项:
    • similarity_top_k=5 表示索引将获取与查询最接近的前5个匹配的术语/定义。
    • response_mode="compact" 表示尽可能多的文本将从5个匹配的术语/定义中用于每次LLM调用。如果没有这个设置,索引会对LLM进行至少5次调用,这可能会减慢用户的使用速度。

在这里插入图片描述
在这里插入图片描述

测试运行

好吧,实际上我希望我们在进行的过程中一直在测试。但现在,让我们尝试一次完整的测试。

  1. 刷新应用程序
  2. 输入您的LLM设置
  3. 转到查询选项卡
  4. 询问以下问题:什么是兔抱(bunnyhug)?
  5. 应用程序应该给出一些无意义的回答。如果你不知道的话,兔抱(bunnyhug)是加拿大草原地区人们用来指代连帽衫的另一种说法!
    6.让我们把这个定义添加到应用程序中。打开上传标签并输入以下文本:兔抱(bunnyhug)是用来描述连帽衫的一个常见术语。这个术语由加拿大草原地区的人们使用。
  6. 单击提取按钮。几分钟后,应用程序应该显示正确提取的术语/定义。单击插入术语按钮保存它!
  7. 如果我们打开术语选项卡,应该会显示我们刚刚提取的术语和定义。
  8. 回到查询选项卡,尝试询问兔抱是什么。现在,答案应该是正确的!

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

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

相关文章

迭代器边遍历边删除存在的问题

迭代器边遍历边删除存在的问题以及原理 01-问题 ​ 我们先来看看如下代码 public static void main(String[] args) {List<Integer> list new ArrayList<>();list.add(5);list.add(4);list.add(3);list.add(2);list.add(7);list.add(0);Iterator<Integer>…

CSP-J代码解析!最新2024CSP-J题解及参考代码

经过整理&#xff0c;老师已经整理了今年CSP-J复赛的题目和代码解析&#xff01; T4题目名称有误&#xff0c;更正&#xff1a;接龙&#xff01; 需要PDF版本的→malaoshi606 T1 扑克牌 poker 算法&#xff1a;模拟&#xff0c;桶数组思路&#xff1a;创建一个标记数组vis&…

贪心算法记录 - 下

135. 分发糖果 困难 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c…

OpenCV中的图像通道合并

在计算机视觉和图像处理领域&#xff0c;OpenCV是一个强大的工具库&#xff0c;它提供了从基本操作到复杂算法的广泛功能。今天&#xff0c;我们将通过一个简单的示例来探索OpenCV中的图像通道处理&#xff0c;特别是如何操作和理解BGR与RGB颜色空间的差异。 Lena图像&#xf…

LinkedList和链表(下)

1. 什么是LinkedList 在练习了单链表的自我实现和单链表的一些习题之后,我们正式来认识一下java提供的LinkedList,这是一种双向链表结构,在增删元素的时候效率比较高,不需要像ArrayList一样搬运元素.但是在查找方面效率比较低(需要遍历链表),ArrayList效率就比较高(直接由数组下…

JS+Springboot做一个交互Demo

背景&#xff1a;老大做了一个 SDK&#xff0c;包含字符加解密、文件加解密&#xff0c;要求能从前端访问&#xff0c;并且能演示的 Demo。 思路&#xff1a;html 写页面&#xff0c;js 发送请求&#xff0c;freemarker 做简单的参数交互&#xff0c;JAVA 后端处理。 一、项目依…

CSS 样式 box-sizing: border-box; 用于控制元素的盒模型如何计算宽度和高度

文章目录 box-sizing: border-box; 的含义默认盒模型 (content-box)border-box 盒模型 在微信小程序中的应用示例 在微信小程序中&#xff0c;CSS 样式 box-sizing: border-box; 用于控制元素的盒模型如何计算宽度和高度。具体来说&#xff0c; box-sizing: border-box; 会改…

【已解决】C# NPOI如何在Excel文本中增加下拉框

前言 上图&#xff01; 解决方法 直接上代码&#xff01;&#xff01;&#xff01;&#xff01;综合了各个大佬的自己修改了一下&#xff01;可以直接规定在任意单元格进行设置。 核心代码方法块 #region Excel增加下拉框/// <summary>/// 增加下拉框选项/// </s…

Python游戏开发超详细(基础理论知识篇)

一、引导&#xff1a; Python游戏开发是一个非常有趣且富有挑战性的领域。通过Python&#xff0c;你可以利用其强大的库和框架来创建各种类型的游戏&#xff0c;从简单的2D游戏到复杂的3D游戏。以下是第一课的基础理论知识&#xff0c;帮助你入门Python游戏开发。 二、理论知识…

中小企业设备资源优化:Spring Boot系统实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

部署seatunnel2.3.8

部署seatunnel web参考&#xff1a;SeaTunnel Web1.0.0安装_plugindiscoveryutil.getallconnectors-CSDN博客 配置&#xff1a;两台centos服务器&#xff0c;2master2worker 一、下载包 v2.3.8[bin] apache-seatunnel-2.3.8-bin.tar.gz 将包上传到master节点和worker节点所…

Python开发日记 -- 实现bin文件的签名

目录 1.数据的不同表现形式签名值不一样&#xff1f; 2.Binascii模块简介 3.问题定位 4.问题总结 1.数据的不同表现形式签名值不一样&#xff1f; Happy Muscle试运行了一段时间&#xff0c;组内同事再一次提出了新的需求&#xff1a;需要对bin文件签名。 PS&#xff1a;服…

使用代码编辑组件的npm包

使用代码编辑组件的npm包 文章说明核心代码运行截图源码下载 文章说明 我将书写的代码编辑组件打包为npm包&#xff0c;下载即可使用&#xff0c;目前是1.0.4版本&#xff0c;虽然功能还有一些bug&#xff0c;但是可以较为简单的使用 npm地址 核心代码 安装依赖 npm i bingbing…

H7-TOOL的LUA小程序教程第16期:脉冲测量,4路PWM,多路GPIO和波形打印(2024-10-25, 更新完毕)

LUA脚本的好处是用户可以根据自己注册的一批API&#xff08;当前TOOL已经提供了几百个函数供大家使用&#xff09;&#xff0c;实现各种小程序&#xff0c;不再限制Flash里面已经下载的程序&#xff0c;就跟手机安装APP差不多&#xff0c;所以在H7-TOOL里面被广泛使用&#xff…

OpenCV-物体跟踪

文章目录 一、物体跟踪的定义二、OpenCV中的物体跟踪算法三、OpenCV物体跟踪的实现步骤四、代码实现五、注意事项 OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c;它提供了丰富的功能来实现物体跟踪。以下是对OpenCV中物体跟踪的详细解释&#xff1a; 一、物体跟踪的…

清华大学《2022年+2021年822自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《清华大学822自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2022年真题 2021年真题 Part1&#xff1a;2022年2021年完整版真题 2022年真题 2021年真题…

论文笔记:通用世界模型WorldDreamer

整理了WorldDreamer: Towards General World Models for Video Generation via Predicting Masked Tokens 论文的阅读笔记 背景模型实验 背景 现有的世界模型仅限于游戏或驾驶等特定场景&#xff0c;限制了它们捕捉一般世界动态环境复杂性的能力。针对这一挑战&#xff0c;本文…

【若依笔记】-- 精简若依项目只保留系统管理

环境&#xff1a;最近项目需要计划使用若依来开发软件&#xff0c;使用若依有一个问题&#xff0c;若依代码框架还是比较冗余&#xff0c;不够精简&#xff0c;还有一点是若依Security权限校验&#xff0c;对于实现一对多的前台&#xff0c;比较麻烦&#xff0c;我这边的业务是…

大一物联网要不要转专业,转不了该怎么办?

有幸在2014年&#xff0c;踩中了物联网的风口&#xff0c;坏消息&#xff0c;牛马的我&#xff0c;一口汤都没喝上。 依稀记得&#xff0c;当时市场部老大&#xff0c;带我去上海参加电子展会&#xff0c;印象最深的&#xff0c;一些物联网云平台&#xff0c;靠着一份精美PPT&a…

【Python爬虫系列】_031.Scrapy_模拟登陆中间件

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈…