大语言模型应用与传统程序的不同
大语言模型(LLM) 被描述的神乎其神,无所不能,其实,大语言模型只是一个模型,它能够理解和生成自然语言,唯有依靠应用程序才能够发挥作用。例如,基于大模型可以构建一个最简单的会话机器人,需要有IO 模型,将用户的提问发送给大模型,大模型得到回应后,通过输出模块将问答反馈给用户。为了使大模型能够准确地理解用户的提问,LLM 应用程序要给它合适的提示(Prompt),所有的函数都有合适的描述(Description)。
可以将大语言模型应用是看作一个基于自然语言描述的的程序。传统的条件,循环,状态判断也都是由LLM 完成的。所以,同样结构的LLM 应用,使用不同的LLM,或者不同的提示和描述,其效果的是不同的。这一点与传统的程序是不同的。
从关注程序的语法转向语义的表达是AI时代的最大转变。
各种大语言模型应用架构
AI应用的五层基石理论
AI应用的的架构, 初创公司Seednapse AI创始人提出构建AI应用的五层基石理论,受到业界关注。
- Models,也就是我们熟悉的调用大模型API。
- Prompt Templates,在提示词中引入变量以适应用户输入的提示模版。
- Chains,对模型的链式调用,以上一个输出为下一个输入的一部分。
- Agent,能自主执行链式调用,以及访问外部工具。
- Multi-Agent,多个Agent共享一部分记忆,自主分工相互协作。
提示工程
提示工程,也称为上下文提示,是指如何与 LLM 通信以在不更新模型权重的情况下引导其行为以获得所需结果的方法。这是一门实证科学,提示工程方法的效果在模型之间可能会有很大差异,因此需要大量的实验和启发式方法。
langchain 链
如同计算机程序一样,当AI 完成复杂的任务时,需要若干的步骤,或者称为组件,这些组件通过一定的顺序链接起来执行,这便是langchain 的核心思想。
链( Chains )是一个非常通用的概念,它指的是将一系列模块化组件(或其他链)以特定方式组合起来,以实现共同的用例。
链(Chain)是对多个独立组件进行端到端封装的一种方式。
简单的说,就是把自然语言输入、关联知识检索、Prompt组装、可用Tools信息、大模型调用、输出格式化等这些LLM 应用中的常见动作,组装成一个可以运行的“链”式过程。链可以直接调用。
最常用的链类型是LLMChain(LLM链),它结合了PromptTemplate(提示模板)、Model(模型)和Guardrails(守卫)来接收用户输入,进行相应的格式化,将其传递给模型并获取响应,然后验证和修正(如果需要)模型的输出。
LCEL表达式语言
LCEL 的全称是"LangChain Expression Language",langchain 表达语言。是一种声明式方法,可以轻松地将链组合在一起。
最基本和常见的用例是将提示模板和模型链接在一起。为了了解这是如何工作的,
创建一个链条,它接受一个主题并生成一个笑话:
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAIprompt = ChatPromptTemplate.from_template("tell me a short joke about {topic}")
model = ChatOpenAI(model="gpt-4")
output_parser = StrOutputParser()chain = prompt | model | output_parserchain.invoke({"topic": "ice cream"})
输出
"为什么冰淇淋从不被邀请参加派对?\n\n因为当事情变热时,它们总是滴下来!
使用LCEL将不同的组件组合成一个单一的链条:
chain = prompt | model | output_parser
例子
from langchain_community.vectorstores import DocArrayInMemorySearch
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from langchain_openai.chat_models import ChatOpenAI
from langchain_openai.embeddings import OpenAIEmbeddingsvectorstore = DocArrayInMemorySearch.from_texts(["harrison worked at kensho", "bears like to eat honey"],embedding=OpenAIEmbeddings(),
)
retriever = vectorstore.as_retriever()template = """Answer the question based only on the following context:
{context}Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()
output_parser = StrOutputParser()setup_and_retrieval = RunnableParallel({"context": retriever, "question": RunnablePassthrough()}
)
chain = setup_and_retrieval | prompt | model | output_parserchain.invoke("where did harrison work?")
在这种情况下,组合的链条是:
chain = setup_and_retrieval | prompt | model | output_parser
智能体(Agent)
在大模型语境下,可以理解成能自主理解、规划、执行复杂任务的系统。
Agent 包含了一组工具,由大模型不断地思考,选择合适的工具,获得最后的结果。
上面的循环也能够使用下面的流程图来表达。
从这个意义上讲,Agent 是一个循环体。在Agent 中,LLM 起到了推理的作用,它可以讲用户的需求分解成若干的任务,选择合适的工具去执行。 Agent 就像一个“小工”(比如一个瓦匠),告诉他要完成的工作,以及一些工具。并且简单的教他一些注意事项,小工就开干了。他会选择不同的工具,直到工作完成。
Agent 的效果很大程度上取决于大模型的理解能力,同样的Agent ,使用不同的大语言模型,其效果变化很大。另外一个重要的因素是提示和描述,在大语言模型应用中,每个工具(函数) 都有一段描述,大语言模型依靠阅读并理解工具的描述来决定使用哪一个工具。
agent 内部有一个类似运行时(runtime) 的程序(AgentExecutor )。
next_action = agent.get_action(...)
while next_action != AgentFinish:observation = run(next_action)next_action = agent.get_action(..., next_action, observation)
return next_action
multi-Agent(langGraph )
langGraph 是langchain的库,用于构建多Agent 工作流(multi-Agent workFlow)
LangGraph 的核心概念之一是状态。每个图形执行都会创建一个状态,该状态在执行时在图形中的节点之间传递,并且每个节点在执行后使用其返回值更新此内部状态。图形更新其内部状态的方式由所选图形类型或自定义函数定义。
LangGraph本质上是一个状态机。这里的图就是状态图。与传统的状态图类似,它也具有节点(Node)和边(edges)。它被称为认知架构的一类。
LangGraph 将黑盒的 AgentExecutor 透明化,允许开发者定义内部的细节结构(用图的方式),从而实现更强大的功能。那么就可以用LangGraph 来重新实现原来的 AgentExecutor,即实现一个最基础的 ReAct范式的 Agent 应用。
每个代理都可以有自己的提示符、LLM、工具和其他自定义代码,以便与其他代理进行最佳协作。
下面是一个基于langGraph 的例子
from langchain_openai import ChatOpenAI
from langchain_core.messages import BaseMessage, HumanMessage
from langgraph.graph import END, MessageGraph
from langchain_core.tools import tool
from langgraph.prebuilt import ToolNode
from typing import Literal
import os
os.environ['OPENAI_API_KEY'] ="sk-xxxxxxxxxxxxxxxxx"
os.environ['OPENAI_BASE_URL'] ="https://api.chatanywhere.tech/v1"
model = ChatOpenAI(temperature=0)@tool
def multiply(first_number: int, second_number: int):"""Multiplies two numbers together."""return first_number * second_number
model = ChatOpenAI(temperature=0)
model_with_tools = model.bind_tools(tools=[multiply])graph = MessageGraph()graph.add_node("oracle", model_with_tools)tool_node = ToolNode([multiply])
graph.add_node("multiply", tool_node)
graph.add_edge("multiply", END)
graph.set_entry_point("oracle")
def router(state: list[BaseMessage]) -> Literal["multiply", "__end__"]:tool_calls = state[-1].additional_kwargs.get("tool_calls", [])if len(tool_calls):return "multiply"else:return ENDgraph.add_conditional_edges("oracle", router)
runnable = graph.compile()
result=runnable.invoke(HumanMessage("What is 123 * 456??"))
print(result)
构建的图结构
大模型应用的关键是大模型本身
尽管大模型应用程序看上去与传统的程序架构相似的。但是它们是截然不同的,传统程序的循环和跳转是根据条件判断的,是确定的。而大语言模型的跳转,循环是依靠大模型的判断和推理,使用不同的大语言模型,应用执行的效果是不同的。LLM 应用的另一个重要的地方,就是各种提示和描述。比较确切的描述能够提升大语言模型应用的效果。说句不太贴切的话“大语言模型的应用程序的执行全靠大模型”猜“。调试LLM 应用的感觉就像训练一个小狗。很多程度靠”狗脑子十分灵光“。
相关文章:

大语言模型应用与传统程序的不同
大语言模型(LLM) 被描述的神乎其神,无所不能,其实,大语言模型只是一个模型,它能够理解和生成自然语言,唯有依靠应用程序才能够发挥作用。例如,基于大模型可以构建一个最简单的会话机…...

MySQL换路径(文件夹)
#MySQL作为免费数据库很受欢迎,即使公司没有使用,自己也可以用。它是一个服务,在点击CtrlAltDelete选择任务管理器后,它在服务那个归类里。 经常整理计算机磁盘分类的小伙伴,如果你们安装了MySQL,并且想移…...

企业诚信管理:构建顾客忠诚的高性价比之道
在当今竞争激烈的市场环境中,企业若想脱颖而出,赢得顾客的长期青睐,必须找到一种高效且高性价比的策略来维系顾客忠诚。售后服务作为这种策略的核心,不仅解决了顾客在购买后的各种问题,还在无形中提升了顾客对品牌的信…...

如何利用pandas解析html的表格数据
如何利用pandas解析html的表格数据 我们在编写爬虫的过程中,经常使用的就是parsel、bs4、pyquery等解析库。在博主的工作中经常的需要解析表格形式的html页面,常规的写法是,解析table表格th作为表头,解析td标签作为表格的行数据 …...

hadoop疑难问题解决_NoClassDefFoundError: org/apache/hadoop/fs/adl/AdlFileSystem
1、问题描述 impala执行查询:select * from stmta_raw limit 10; 报错信息如下: Query: select * from sfmta_raw limit 10 Query submitted at: 2018-04-11 14:46:29 (Coordinator: http://mrj001:25000) ERROR: AnalysisException: Failed to load …...

文件传输基础——Java IO流
系列文章目录 文章目录 系列文章目录前言一、文件的编码二、File类的使用三、RandomAccessFile类的使用 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用…...

Mysql时间操作
一、MySql时间戳转换 select unix_timestamp(); #获取时间戳格式时间 select FROM_UNIXTIME(1717399499); #将时间戳转换为普通格式时间二、Mysql时间相加减结果转换为秒 方法1:time_to_sec(timediff(endTime, startTime)) SELECTDISTINCT(column1),min(last_mo…...

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:无人机自主飞行软件平台
案例简介 北京泛化智能科技有限公司(gi)所主导开发的 Generalized Autonomy Aviation System (GAAS) 是为无人机以及城市空中交通 (UAM, Urban Air Mobility) 所设计的开源无人机自主飞行框架。通过 SLAM、路径规划和 Global Optimization Graph 等功能…...

weak的底层原理
weak 引用在 iOS 中通过维护一个全局的弱引用表来实现。当弱引用的对象被释放时,所有指向它的弱引用会被自动置为 nil,从而防止悬挂指针。 弱引用表(Weak Table)的键和值 理解弱引用表的键和值对于理解 weak 引用的底层机制非常重…...

03-3.1.3 栈的链式存储的实现
👋 Hi, I’m Beast Cheng👀 I’m interested in photography, hiking, landscape…🌱 I’m currently learning python, javascript, kotlin…📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…...

传输协议TCP-原理部分
传输控制协议TCP(Transmission Control Protocol)一种基于连接的可靠的稳定的无重复的传输协议。 1、TCP头部信息 TCP协议头部信息如下: 一共占用20个字节 16位源端口号:发送进程的主机端口16位目的端口号:接收主机…...

【android】设置背景图片
改变值,可显示zai在 在theves下面的两个value都要增加名字代码 <item name"windowActionBar">false</item><item name"android:windowNoTitle">true</item><item name"android:windowFullscreen">tru…...

Java微服务实战:使用Spring Boot构建高效服务
引言 在当今的软件开发实践中,微服务架构已成为推动快速开发和部署的关键因素之一。与传统的单体应用相比,微服务架构提供了更高的灵活性和可维护性。本文将探讨如何使用Java和Spring Boot来构建一个微服务应用,介绍基本概念,并通…...

【大模型】基于Hugging Face调用及微调大模型(1)
文章目录 一、前言二、Transformer三、Hugging Face3.1 Hugging Face Dataset3. 2 Hugging Face Tokenizer3.3 Hugging Face Transformer3.4 Hugging Face Accelerate 四、基于Hugging Face调用模型4.1 调用示例4.2 调用流程概述4.2.1 Tokenizer4.2.2 模型的加载4.2.3 模型基本…...

书生·浦语大模型全链路开源体系-笔记作业4
XTuner 微调 LLM:1.8B、多模态、Agent 引自:Tutorial/xtuner/personal_assistant_document.md at camp2 InternLM/Tutorial GitHub 1. XTuner介绍 引自:欢迎来到 XTuner 的中文文档 — XTuner 0.1.18.dev0 文档 1.1. 什么是 XTuner ? X…...

chrome调试手机网页
前期准备 1、 PC端安装好chrmoe浏览器 2、 安卓手机安装好chrmoe浏览器 3、 数据线 原文地址:https://lengmo714.top/343880cb.html 手机打开调试模式 进入手机设置,找到开发者模式,然后启用USB调试 打开PC端chrome调试功能 1、点击chr…...

Halcon 双相机标定与拼图(一)
一、概述 最近有一个多相机标定的项目,大概是4个相机来标定,同一坐标系,然后拼接图,之前双相机标定的时候也大概看看,所以今天就找了那个halcon 案例多学一下,后面我打算做一个对位贴合的东西,…...

计算机网络学习记录 应用层 Day6
你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github https://github.com/Qiuner ⭐️ gitee https://gitee.com/Qiuner 🌹 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我…...

如何编辑pdf文件内容?3种PDF编辑方法分享
如何编辑pdf文件内容?在当今数字化时代,PDF文件因其跨平台兼容性和保持原样不变的特点,在办公、学习、生活等多个领域得到了广泛应用。然而,PDF文件的不可编辑性也让许多用户感到困扰。你是否曾经遇到过需要修改PDF文件内容&#…...

汇总!7种大模型的部署方法!
我们如何在本地部署运行私有的开源大型语言模型(LLMs)呢?本文将向您梳理七种实用的方法及如何选择。 Hugging Face的Transformers 这是一个强大的Python库,专为简化本地运行LLM而设计。其优势在于自动模型下载、提供丰富的代码片段…...

什么是函数?在C语言中如何定义一个函数
函数是编程中用于执行特定任务的一组指令的集合。它有一个名称(即函数名),可以通过该名称在程序中多次调用该函数以执行相同的任务。这有助于提高代码的可重用性和可维护性。 在C语言中,函数的定义通常包括以下几个部分ÿ…...

Stable Diffusion——四种模型 LoRA(包括LyCORIS)、Embeddings、Dreambooth、Hypernetwork
目前 Stable diffusion 中用到主要有四种模型,分别是 Textual Inversion (TI)以 Embeddings 为训练结果的模型、Hypernetwork 超网络模型、LoRA(包括 LoRA 的变体 LyCORIS)模型、Dreambooth 模型。 视频博主 koiboi 用…...

MySQL深分页,limit 100000,10 优化
文章目录 一、limit深分页为什么会变慢二、优化方案2.1 通过子查询优化(覆盖索引)回顾B树结构覆盖索引把条件转移到主键索引树 2.2 INNER JOIN 延迟关联2.3 标签记录法(要求id是有序的)2.4 使用between...and... 我们日常做分页需…...

Linux[高级管理]——使用源码包编译安装Apache网站
🏡作者主页:点击! 👨💻Linux高级管理专栏:点击! ⏰️创作时间:2024年5月31日14点20分 🀄️文章质量:96分 在Linux系统上编译和安装Apache HTTP Server是…...

Docker+JMeter+InfluxDB+Grafana 搭建性 能监控平台
JMeter原生报告的缺点: 无法实时共享 报告信息的展示不美观 需求方案 为了解决上述问题,可以通过 InfluxDB Grafana解决 : InfluxDB :是一个开源分布式指标数据库,使用 Go 语言编写,无需外部依赖 应用&am…...

NoSQL实战(MongoDB搭建主从复制)
什么是复制集? MongoDB复制是将数据同步到多个服务器的过程; 复制集提供了数据的冗余备份并提高了数据的可用性,通常可以保证数据的安全性; 复制集还允许您从硬件故障和服务中断中恢复数据。 保障数据的安全性 数据高可用性 (2…...

【讯为Linux驱动开发】3.内核空间和用户空间
【问】内存空间的组成部分?? 内存空间分为内核空间和用户空间 1.内核空间控制硬件资源,提供系统调用接口,保护系统自身安全稳定 2.用户空间实现业务逻辑 【问】如何进入内核空间使用硬件资源? 1.系统调用 2.软中断 3.…...

AI论文:一键生成论文的高效工具
说到这个问题,那真的得看你对“靠谱”的定义是怎样的啦? 众所周知,写论文是一项极其耗时间的事情,从开始的选题到文献资料搜索查阅,大纲整理等等一大堆的繁杂工作是极艰辛的。用AI写论文就不一样了,自动化…...

申请医疗设备注册变更时,需要补充考虑网络安全的情况有哪些?
在申请医疗器械设备注册变更时,需要补充网络安全的情况主要包括以下几点: 网络安全功能更新:如果医疗器械的自研软件发生网络安全功能更新,或者合并网络安全补丁更新的情形,需要单独提交一份自研软件网络安全功能更新…...