从零开始入门 LangChain

前言

最近一直在做 RAG 相关的内容,也学习了一段时间 LangChain 框架的用法。

本篇文章中将和大家讲述什么是 LangChain ,以及 LangChain 解决了现在大模型发展的哪些问题,然后会讲解LangChain 中基础的概念和组件。在此基础上,我们会深入的分析一下 LangChain 具体有哪一些优势,最后,将向大家介绍一些开源的基于 LangChain 的项目,来感受这个框架在实际产品中是如何使用和落地的。

一、LangChain 是什么

LangChain 是一个开源的基于 LLM 的上层应用开发框架,LangChain 提供了一系列的工具和接口,让开发者可以轻松地构建和部署基于 LLM 的应用 。LangChain 围绕将不同组件“链接”在一起的核心概念构建,简化了与 GPT-3.5、GPT-4 等 LLM 合作的过程,使得我们可以轻松创建定制的高级用例。

LangChain 已经成为大模型应用开发的最主流框架(之一),23 年 1 月的众多 AI Hackathon 决赛项目使用 LangChain。2023 年融资 3000w+ 美刀(红杉)。

目前, LangChain 支持 Python 和 TypeScript 两种语言。如果大家想体验 LangChain ,建议使用 python 语言,简单,易上手。

二、LangChain 解决了什么问题

通过上面的概念,我们可以看到 LangChain 实际上是基于大语言模型上层的一个应用框架,那么 LangChain 具体解决了大模型时代的哪些问题才让他脱颖而出呢。具体来说,主要有以下几个方面:

1.模型接口的统一

现在的大模型除了大家熟知的 ChatGPT,还有 Meta 开源的 LLaMA,清华大学的 GLM 等,这些模型的使用方法包括 api 和推理方式都相差甚远,如果你想从使用 ChatGPT 切换到调用 LLaMA,需要花费不少的精力去开发前置的模型使用模块,会有大量重复繁琐的工作。而 LangChain 对好多常见的 API 和大模型做了封装,可以直接拿来就用,节省了大量的时间。

2.打破了 LLM 提示词和返回内容 token 限制,为最新知识的检索、推理提供了更大的前景

像 ChatGPT 这样的语言模型,数据只更新到 2021 年,如何让大模型回答和学习到之后的知识就是一个很重要的问题。而且 ChatGPT 的 API 是有提示词和返回内容的限制的,3.5 是 4k,4 则是 8k,而我们往往需要从自己的数据、自己的文档中获取特定的信息,这可能是一本书、一个 PDF 文件、一个带有专有信息的数据库。这些信息的 token 数量会远高于 4k 的阈值,直接使用大模型是无法获取到相应的知识的,因为超过阈值的信息就被截断了。

LangChain 提供了对向量数据库的支持,能够把超长的 txt、pdf 等通过大模型转换为 embedding 的形式,存到向量数据库中,然后利用数据库进行检索。这样就可以支持更多长度的输入,解放了 LLM 的优势。

三、LangChain 的基本概念

LangChain 能解决大模型的两个痛点,包括模型接口复杂、输入长度受限离不开自己精心设计的模块。根据LangChain 的最新文档,目前在 LangChain 中一共有六大核心组件,分别是模型的输入输出 (Model I/O)、数据连接 (Data Connection)、内存记忆(Memory)、链(Chains)、代理(Agent)、回调(Callbacks)。下面我们将分别讲述每一个模块的功能和作用。

目前,最新的官网中将数据连接部分改为了检索(Retrieval),但基本内容差异不大。

一)Model I/O

模型是任何 LLM 应用中最核心的一点,LangChain 可以让我们方便的接入各种各样的语言模型,并且提供了许多接口,主要有三个组件组成,包括模型(Models),提示词(Prompts)和解析器(Output parsers)。

image.png

图片信息来自 LangChain 官网

1.Models

LangChain 中提供了多种不同的语言模型,按功能划分,主要有两种。

  • 语言模型(LLMs):我们通常说的语言模型,给定输入的一个文本,会返回一个相应的文本。常见的语言模型有 GPT3.5,chatglm,GPT4All 等。
from langchain.llms import OpenAI
llm = OpenAI(openai_api_key="...")

  • 聊天模型(Chat model):可以看做是封装好的拥有对话能力的 LLM,这些模型允许你使用对话的形式和其进行交互,能够支持将聊天信息作为输入,并返回聊天信息。这些聊天信息都是封装好的结构体,而非一个简单的文本字符串。常见的聊天模型有 GPT4、Llama 和 Llama2,以及微软云 Azure 相关的 GPT 模型。
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI(openai_api_key="...")

2.Prompts

提示词是模型的输入,通过编写提示词可以和模型进行交互。LangChain 中提供了许多模板和函数用于模块化构建提示词,这些模板可以提供更灵活的方法去生成提示词,具有更好的复用性。根据调用的模型方式不同,提示词模板主要分为普通模板以及聊天提示词模板。

1.提示模板(PromptTemplate

  • 提示模板是一种生成提示的方式,包含一个带有可替换内容的模板,从用户那获取一组参数并生成提示
  • 提示模板用来生成 LLMs 的提示,最简单的使用场景,比如“我希望你扮演一个代码专家的角色,告诉我这个方法的原理 {code}”。
  • 类似于 python 中用字典的方式格式化字符串,但在 langchain 中都被封装成了对象

一个简单的调用样例如下所示:

from langchain import PromptTemplate


template = """\
You are a naming consultant for new companies.
What is a good name for a company that makes {product}?
"""

prompt = PromptTemplate.from_template(template)
prompt.format(product="colorful socks")

输出结果:

# 实际输出
You are a naming consultant for new companies.
What is a good name for a company that makes colorful socks?

聊天提示模板(ChatPromptTemplate

  • 聊天模型接收聊天消息作为输入,这些聊天消息通常称为 Message,和原始的提示模板不一样的是,这些消息都会和一个角色进行关联。
  • 在使用聊天模型时,建议使用聊天提示词模板,这样可以充分发挥聊天模型的潜力。

一个简单的使用示例如下:

from langchain.prompts import (
    ChatPromptTemplate,
    PromptTemplate,
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)
template="You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])

# get a chat completion from the formatted messages
chat_prompt.format_prompt(input_language="English", output_language="French", text="I love programming.").to_messages()

输出结果:

[SystemMessage(content='You are a helpful assistant that translates English to French.', additional_kwargs={}),
     HumanMessage(content='I love programming.', additional_kwargs={})]

3.Output parsers

语言模型输出的是普通的字符串,有的时候我们可能想得到结构化的表示,比如 JSON 或者 CSV,一个有效的方法就是使用输出解析器。

输出解析器是帮助构建语言模型输出的类,主要实现了两个功能:

  1. 获取格式指令,是一个文本字符串需要指明语言模型的输出应该如何被格式化
  2. 解析,一种接受字符串并将其解析成固定结构的方法,可以自定义解析字符串的方式

一个简单的使用示例如下:

from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI

from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field, validator
from typing import List

model_name = 'text-davinci-003'
temperature = 0.0
model = OpenAI(model_name=model_name, temperature=temperature)
# Define your desired data structure.
class Joke(BaseModel):
    setup: str = Field(description="question to set up a joke")
    punchline: str = Field(description="answer to resolve the joke")
    
    # You can add custom validation logic easily with Pydantic.
    @validator('setup')
    def question_ends_with_question_mark(cls, field):
        if field[-1] != '?':
            raise ValueError("Badly formed question!")
        return field
 # Set up a parser + inject instructions into the prompt template.
parser = PydanticOutputParser(pydantic_object=Joke)
prompt = PromptTemplate(
    template="Answer the user query.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()}
)
# And a query intended to prompt a language model to populate the data structure.
joke_query = "Tell me a joke."
_input = prompt.format_prompt(query=joke_query)
output = model(_input.to_string())
parser.parse(output)

输出结果:

Joke(setup='Why did the chicken cross the road?', punchline='To get to the other side!')

二)Data Connection

有的时候,我们希望语言模型可以从自己的数据中进行查询,而不是仅依靠自己本身输出一个结果。数据连接器的组件就允许你使用内置的方法去读取、修改,存储和查询自己的数据,主要有下面几个组件组成。

  • 文档加载器(Document loaders):连接不同的数据源,加载文档。
  • 文档转换器(Document transformers):定义了常见的一些对文档加工的操作,比如切分文档,丢弃无用的数据
  • 文本向量模型(Text embedding models):将非结构化的文本数据转换成一个固定维度的浮点数向量
  • 向量数据库(Vector stores):存储和检索你的向量数据
  • 检索器(Retrievers):用于检索你的数据

三)Chains

只使用一个 LLM 去开发应用,比如聊天机器人是很简单的,但更多的时候,我们需要用到许多 LLM 去共同完成一个任务,这样原来的模式就不足以支撑这种复杂的应用。

为此 LangChain 提出了 Chain 这个概念,也就是一个所有组件的序列,能够把一个个独立的 LLM 链接成一个组件,从而可以完成更复杂的任务。举个例子,我们可以创建一个 chain,用于接收用户的输入,然后使用提示词模板将其格式化,最后将格式化的结果输出到一个 LLM。通过这种链式的组合,就可以构成更多更复杂的 chain。

在 LangChain 中有许多实现好的 chain,以最基础的 LLMChain 为例,它主要实现的就是接收一个提示词模板,然后对用户输入进行格式化,然后输入到一个 LLM,最终返回 LLM 的输出。

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

llm = OpenAI(temperature=0.9)
prompt = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)

from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)

# Run the chain only specifying the input variable.
print(chain.run("colorful socks"))

LLMChain 不仅支持 llm,同样也支持 chat llm,下面是一个调用示例:

from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
)
human_message_prompt = HumanMessagePromptTemplate(
        prompt=PromptTemplate(
            template="What is a good name for a company that makes {product}?",
            input_variables=["product"],
        )
    )
chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt])
chat = ChatOpenAI(temperature=0.9)
chain = LLMChain(llm=chat, prompt=chat_prompt_template)
print(chain.run("colorful socks"))

四)Memory

大多数的 LLM 应用程序都会有一个会话接口,允许我们和 LLM 进行多轮的对话,并有一定的上下文记忆能力。但实际上,模型本身是不会记忆任何上下文的,只能依靠用户本身的输入去产生输出。而实现这个记忆功能,就需要额外的模块去保存我们和模型对话的上下文信息,然后在下一次请求时,把所有的历史信息都输入给模型,让模型输出最终结果。

而在 LangChain 中,提供这个功能的模块就称为 Memory,用于存储用户和模型交互的历史信息。在 LangChain 中根据功能和返回值的不同,会有多种不同的 Memory 类型,主要可以分为以下几个类别:

  1. 对话缓冲区内存(ConversationBufferMemory),最基础的内存模块,用于存储历史的信息
  2. 对话缓冲器窗口内存(ConversationBufferWindowMemory),只保存最后的 K 轮对话的信息,因此这种内存空间使用会相对较少
  3. 对话摘要内存(ConversationSummaryMemory),这种模式会对历史的所有信息进行抽取,生成摘要信息,然后将摘要信息作为历史信息进行保存。
  4. 对话摘要缓存内存(ConversationSummaryBufferMemory),这个和上面的作用基本一致,但是有最大 token 数的限制,达到这个最大 token 数的时候就会进行合并历史信息生成摘要

值得注意的是,对话摘要内存的设计出发点就是语言模型能支持的上下文长度是有限的(一般是 2048),超过了这个长度的数据天然的就被截断了这个类会根据对话的轮次进行合并,默认值是 2,也就是每 2 轮就开启一次调用 LLM 去合并历史信息。

from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history")
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("whats up?")

参考官方的教程,Memory 同时支持 LLM 和 Chat model。

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory

# llm 
llm = OpenAI(temperature=0)
# Notice that "chat_history" is present in the prompt template
template = """You are a nice chatbot having a conversation with a human.

Previous conversation:
{chat_history}

New human question: {question}
Response:"""
prompt = PromptTemplate.from_template(template)
# Notice that we need to align the `memory_key`
memory = ConversationBufferMemory(memory_key="chat_history")
conversation = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True,
    memory=memory
)
conversation({"question": "hi"})

下面是使用 Chat model 调用 Memory 的示例。

from langchain.chat_models import ChatOpenAI
from langchain.prompts import (
    ChatPromptTemplate,
    MessagesPlaceholder,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory

llm = ChatOpenAI()
prompt = ChatPromptTemplate(
    messages=[
        SystemMessagePromptTemplate.from_template(
            "You are a nice chatbot having a conversation with a human."
        ),
        # The `variable_name` here is what must align with memory
        MessagesPlaceholder(variable_name="chat_history"),
        HumanMessagePromptTemplate.from_template("{question}")
    ]
)
# Notice that we `return_messages=True` to fit into the MessagesPlaceholder
# Notice that `"chat_history"` aligns with the MessagesPlaceholder name.
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
conversation = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True,
    memory=memory
)
conversation({"question": "hi"})

五)Agents

代理的核心思想就是使用 LLM 去选择对用户的输入,应该使用哪个特定的工具去进行操作。这里的工具可以是另外的一个 LLM,也可以是一个函数或者一个 chain。在代理模块中,有三个核心的概念。

1、代理(Agent),依托于强力的语言模型和提示词,代理是用来决定下一步要做什么,其核心也是构建一个优秀的提示词。这个提示词大致有下面几个作用:

  • 角色定义,给代理设定一个符合自己的身份
  • 上下文信息,提供给他更多的信息来要求他可以执行什么任务
  • 丰富的提示策略,增加代理的推理能力

2、工具(Tools),代理会选择不同的工具去执行不同的任务。工具主要给代理提供调用自己的方法,并且会描述自己如何被使用。工具的这两点都十分重要,如果你没有提供可以调用工具的方法,那么代理就永远完不成自己的任务;同时如果没有正确的描述工具,代理就不知道如何去使用工具。

3、工具包(Toolkits),LangChain 提供了工具包的使用,在一个工具包里通常包含 3-5 个工具。

Agent 技术是目前大语言模型研究的一个前沿和热点方向,但是目前受限于大模型的实际效果,仅 GPT 4.0 可以有效的开展 Agent 相关的研究。我们相信在未来,随着大模型性能的优化和迭代,Agent 技术应该能有更好的发展和前景。

六)Callbacks

回调,字面解释是让系统回过来调用我们指定好的函数。在 LangChain 中就提供了一个这样的回调系统,允许你进行日志的打印、监控,以及流式传输等其他任务。通过直接在 API 中提供的回调参数,就可以简单的实现回调的功能。LangChain 内置了许多可以实现回调功能的对象,我们通常称为 handlers,用于定义在不同事件触发的时候可以实现的功能。

不管使用 Chains、Models、Tools、Agents,去调用 handlers,均通过是使用 callbacks 参数,这个参数可以在两个不同的地方进行使用:

  • 构造函数中,但它的作用域只能是该对象。比如下面这个 LLMChain 的构造函数可以进行回调,但这个回调函数对于链接到它的 LLM 模型是不生效的。
LLMChain(callbacks=[handler], tags=['a-tag'])

  • 在 run()/apply() 方法中调用,只有当前这一次请求才会相应这个回调函数,但是当前请求包含的子请求都会调用这个回调。比如,使用了一个 chain 去触发这个请求,连接到它的 LLM 模型也会调用这个回调。
chain.run(input, callbacks=[handler])

四、LangChain 的优势

和 LangChain 类似的 LLM 应用开发框架:

  • OpenAI 的 GPT-3.5/4 API
  • Hugging Face 的 Transformers(多模态机器学习模型,支持上千预训练模型)
  • Google 的 T5(NLP 框架)等

LangChain 的优势:

  • 能力更强,更新 by days
    • 代码设计优雅,模块化程度高,Chain、Agent、Memory 模块的抽象程度高,便于结合应用
    • 集成工具完善,从数据预处理、LLM 模型、向量化、图数据库等
  • 支持常用 LLM 和大量商业化 NLP 模型
    • 商业化:Azure OpenAI、OpenAI
    • 开源:Hugging Face、GPT4All
  • 有大量的 LLM 用例供参考

五、基于 LangChain 的应用

从上文中,我们了解了 LangChain 的基本概念,以及主要的组件,利用这些能帮助我们快速上手构建 app。LangChain 能够在很多使用场景中进行应用,包括但不限于:

  • 个人助手和聊天机器人;能够记住和你的每一次互动,并进行个性化的交互
  • 基于文档的问答系统;在特定文档上回答问题,可以减少大模型的幻觉问题
  • 表格数据查询;提供了对结构化数据的查询功能,如 CSV,PDF,SQL,DataFrame 等
  • API 交互;可以对接不同语言模型的API,并产生交互和调用
  • 信息提取;从文本中提取结构化的信息,并输出
  • 文档总结;利用 LLM 和 embedding 对长文档进行压缩和总结

六、LangChain 的缺点

从实际使用体验来讲,这并不是一个完美的框架,也存在不少问题。

比如,LangChain 的提示词模板其实就是封装了字符串的类,但是 LangChain 中有很多类型的提示词模板,没有看出明显区别,而且也没有安全性,冗余比较多。而且有一些提升词是默认写好的,要修改的话,需要看源码才知道应该修改什么地方。

LangChain 内部封装了很多调用过程,debug 的过程比较困难。一旦出现了问题,排查所花费的时间可能会比较长。

之前有爆出过 LangChain 的代码在调用 python 去执行 agent 的时候会存在安全漏洞,有可能通过注入攻击的方式产生危险。但是这些类似的漏洞,需要官方去修复才可以,会给我们开发带来不必要的麻烦。

LangChain 的文档过于简单了,如果要实现一些官方没有提供的方法就需要动一些脑筋。

总结

LangChain 作为一个新兴的开源 LLM 开发框架,它的设计理念和一些实现方法都有值得我们借鉴的地方。当然一个开源项目必然有自己的优点的同时也会存在不少的缺点。我们在实际使用的时候,应该按照自己的需求和实际情况去选择,切记,不要简单的因为网上的评论而做出选择。毕竟,好不好用,只有你自己才清楚。

那么,我们该如何学习大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、大模型全套的学习路线

学习大型人工智能模型,如GPT-3、BERT或任何其他先进的神经网络模型,需要系统的方法和持续的努力。既然要系统的学习大模型,那么学习路线是必不可少的,下面的这份路线能帮助你快速梳理知识,形成自己的体系。

L1级别:AI大模型时代的华丽登场

L2级别:AI大模型API应用开发工程

L3级别:大模型应用架构进阶实践

L4级别:大模型微调与私有化部署

一般掌握到第四个级别,市场上大多数岗位都是可以胜任,但要还不是天花板,天花板级别要求更加严格,对于算法和实战是非常苛刻的。建议普通人掌握到L4级别即可。

以上的AI大模型学习路线,不知道为什么发出来就有点糊,高清版可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

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

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

相关文章

经纬恒润成功研发LRR610雷达先进算法!

好消息!经纬恒润搭载Arbe芯片组的LRR610 4D成像雷达算法开发出先进的后点云算法,并已圆满完成集成工作,这标志着智能驾驶感知系统迈向了一个新的里程碑。 经纬恒润自主开发的成像雷达算法,可以有效地跟踪数百个运动和静止目标&am…

亿级数据过滤和布隆过滤器

如何高效实现存在判断 在刷抖音时你有刷到过重复的推荐内容 吗?这么多的推荐内容要推荐给这么多的用户,它是怎么保证每个用户在看推荐内容时,保证不会出现之前已经看过的推荐视频呢?也就是说,抖音是如何实现 推送去重…

java 工作排序(Job Sequencing Problem)

给定一个作业数组,其中每个作业都有一个截止期限,如果作业在截止期限之前完成,则可获得相关利润。此外,每个作业都占用一个单位时间,因此任何作业的最小可能截止期限都是 1。如果一次只能安排一项作业,则最…

开源规则引擎LiteFlow项目应用实践

本文介绍基于开源规则引擎LiteFlow,如何开发规则设计器,在低代码平台中集成规则引擎,并在项目中实现应用的效果。由于低代码平台使用规则引擎实现了逻辑编排的需求,所以本文中的叫法为“逻辑设计”、“逻辑编排”、“逻辑流引擎”…

RabbitMQ学习笔记(二)SpringAMQP的使用、消息转换器

文章目录 前言3 SpringAMQP3.1 介绍3.2 简单队列模型3.3 工作队列模型3.4 发布/订阅模型3.4.1 Fanout广播模型3.4.2 Direct定向模型3.4.3 Topic通配符模型 3.5 消息转换器 前言 RabbitMQ学习笔记(一)RabbitMQ部署、5种队列模型 3 SpringAMQP 3.1 介绍 AMQP(Adva…

白酒:产地与白酒品牌形象的建设与推广

云仓酒庄豪迈白酒作为中国白酒市场中的知名品牌,其产地与品牌形象的建设与推广对于提升品牌竞争力和市场份额具有重要意义。产地作为白酒品质和特色的重要标志,对于品牌形象的塑造和推广具有关键作用。 首先,云仓酒庄豪迈白酒的产地是其品质和…

AI降痕工具使用指南:如何有效降低AIGC疑似度

随着人工智能技术的突飞猛进,AI生成内容(AIGC)已被广泛用于学术论文撰写中,提高效率同时也带来了原创性的挑战。面对日益严格的学术审查,一个突出的问题是:使用AI代写的论文能否通过内容检测?因…

第二证券股票杠杆:4分钟直线涨停!这一赛道,AH股集体爆发!

今日早盘,A股继续小幅震动收拾,首要股指涨跌互现,两市个股跌多涨少,成交有萎缩的趋势。 盘面上,医药、中字头、旅游、房地产等板块相对活跃,混合实践、玻璃基板、AI手机PC、光刻机等板块跌幅居前。 “中字…

活动投票小程序源码系统 礼物道具活动多多 前后端分离 带完整的安装代码包以及搭建教程

系统概述 在当今数字化快速发展的时代,小程序已成为连接用户与商家、内容与服务的重要桥梁。特别是活动投票类小程序,因其便捷性、互动性和参与性,受到了广大用户的热烈追捧。为了满足市场对高质量、易操作的活动投票小程序的需求&#xff0…

别慌!不知道如何处理#开头的字符串时,需要先了解一下什么是NCR

最近进行接口测试时抓包发现请求响应中有类似下面这些字符 起初试图对这些编码尝试各种decoder操作来一探其真身,遗憾的是均已失败告终(后来发现,这些编码可以在浏览器中正常显示)。最后得知这种奇怪的编码格式并不是编码,而是一种…

ClickHouse 实现用户画像(标签)系统实践

文章目录 前言用户画像概述用户画像系统介绍用户画像系统的需求描述用户画像系统的需求分析用户画像系统的架构 关键技术实现(Clickhouse SQL)分析阶段运营阶段 基于ClickHouse的用户画像系统的优点 前言 本文介绍一个ClickHouse应用案例—用户画像系统…

AI工具:解锁智能时代办公自动化的新篇章

工欲善其事,必先利其器。 随着AI技术与各个行业或细分场景的深度融合,日常工作可使用的AI工具呈现出井喷式发展的趋势,AI工具的类别也从最初的AI文本生成、AI绘画工具,逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…

AIGC| 有手就行的AI绘画教程!Midjourney+Stable Diffusion 结合!全程干货,速来学习!

大家好,我是画画的小强 AI绘画工具的出现, 让设计岗的同事更会画画了, 还让策划/制片/三维/后期/运营……也能“画”一画了。 今天小强就教一教大伙,萌新小白都能迅速上手的AI绘画教程, 从零开始,产出…

静态网页实现-人脸识别-案例(web)

🤳人脸识别(web) 基于开源大模型,将人脸识别功能整合到网页中,提供用户友好的界面和强大的功能。 核心功能 人脸轮廓识别: 通过深度学习算法,精确识别人脸的轮廓,包括眼睛、鼻子、嘴巴等关键部…

Java18+​App端采用uniapp+开发工具 idea hbuilder智能上门家政系统源码,一站式家政服务平台开发家政服务

Java18​App端采用uniapp开发工具 idea hbuilder智能上门家政系统源码,一站式家政服务平台开发 家政服务 家政服务是一个专为家政服务人员设计的平台,该平台旨在提供便捷、高效的工作机会,同时确保服务质量和客户体验。 以下是关于家政服务师…

【耗时十个小时】程序员最趁手的SVM算法,学完你会哭着感谢努力的自己!

❤ 纯 干 货 ❤ 在这之前咱们已经接触了 各个算法的优缺点的总结,以及8个回归类算法、7个正则化算法的总结、5 个集成算法模型的全部总结! 感兴趣的可以翻到之前看看~ 咱们今天就大概一起学习一下关于SVM的方方面面。 线性支持向量机 非线性支持向量…

干货 | SDR RFSoC技术框图大放送(附资源)

软件无线电(SDR) 本文参考《Software Defined Radio with Zynq UltraScale RFSoc》,全文共744页。需要的可以给公众号 迪普微科技 发送“SDR”。

动态规划——打家劫舍问题

198. 打家劫舍 问题描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一…

MathorCup挑战赛获奖名单公示,第九届研讨会及颁奖典礼即将举行

近日,备受瞩目的2024年第十四届MathorCup高校数学建模挑战赛圆满落幕,竞赛组委会于近日公示了获奖名单初稿。本届竞赛自2024年4月12日至16日举行,吸引了来自全国740所高校的9119支队伍踊跃参与,其中包括本科生、研究生、专科生及教…

Java流程控制习题--打印三角形及debug运用

1.打印三角形 使用for循环的嵌套进行运算,思考代码实现的思维方式 2.debug可显示代码每一步的运行步骤,使我们更好的了解代码的运行, debug使用方法:在代码的左侧排序处单机,在点击右上角的蜘蛛图标即可