面向AI的开发:从大模型(LLM)、检索增强生成(RAG)到智能体(Agent)的应用
01 引言
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
随着人工智能技术的飞速发展,大型语言模型(LLM)、检索增强生成(RAG)和智能体(Agent)已经成为推动该领域进步的关键技术,这些技术不仅改变了我们与机器的交互方式,而且为各种应用和服务的开发提供了前所未有的可能性。正确理解这三者的概念及其之间的关系是做好面向AI编程开发的基础:
大模型(LLM) | 检索增强生成(RAG) | 智能体(Agent) | |
---|---|---|---|
大型语言模型(LLM),如GPT系列、BERT等,是利用大量文本数据训练的模型,能够生成连贯的文本、理解语言、回答问题等。 | 检索增强生成技术结合了传统的信息检索技术和最新的生成式模型。它先从一个大型的知识库中检索出与查询最相关的信息,然后基于这些信息生成回答。 | 智能体是指具有一定智能的程序或设备,能够感知环境并根据感知结果做出响应或决策的实体。它们可以是简单的软件程序或复杂的机器人。 | |
作用 | LLM作为基础技术,提供了强大的语言理解和生成能力,是构建复杂人工智能系统的基石。 | RAG可以视为在LLM基础上的扩展或应用,利用LLM的生成能力和外部知识库的丰富信息来提供更准确、信息丰富的输出。 | 智能体可以利用LLM进行自然语言处理,通过RAG技术获得和利用知识,以在更广泛的环境中做出决策和执行任务。它们通常位于应用层级,是对LLM和RAG技术在特定环境下的集成和应用。 |
从层级关系上看,大模型(LLM)提供了基础的语言理解和生成能力。在此基础上,检索增强生成(RAG)技术利用这种能力结合特定的知识库来生成更为准确和相关的输出。智能体(Agent)则在更高层次上使用LLM和RAG,结合自身的感知和决策能力,在各种环境中执行具体的任务。
因此,可以理解为LLM是基础,RAG是在LLM基础上的进一步应用,而智能体则是综合运用LLM和RAG以及其他技术,在更复杂环境中进行交互和任务执行的实体。这种关系体现了从基础技术到应用技术再到实际应用的逐级深入。随着技术的快速进步,如何更高效地利用这些大模型(LLM)来解决具体问题?如何通过检索增强生成(RAG)技术提高信息的准确性和相关性?以及如何设计能够有效集成LLM、RAG和其他AI技术的智能体?这些问题的解决,不仅需要深入理解这些技术的工作原理和应用场景,还需要探索它们之间的相互作用和集成方法。02
大模型(LLM)的概念与工程化实践
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将
大型语言模型(LLM),如OpenAI的GPT系列,是一种基于深度学习的自然语言处理技术。它们能够理解、生成、翻译文本,完成问答任务,甚至编写代码。这些模型通过在大规模文本数据上的预训练,学会了语言的复杂结构和丰富的知识,使其能够在没有明确指示的情况下执行各种语言任务。GPT系列模型基于变换器(Transformer)架构,这是一种高效的深度学习模型结构,特别适合处理序列数据,如文本。变换器利用自注意力(self-attention)机制,能够捕捉文本中长距离的依赖关系,这对于理解和生成自然语言(NLG)至关重要。
Chat(对话)
与“OpenAI最强大的模型GPT-4”进行对话,不止是文本的交互生成,还可以同时进行基于DALL-E的图文交互生成,以及从互联网实时获取最新知识进行辅助分析和生成。如下图:
GPTs(插件)
1. 告诉 GPT Builder向导(实际上这也是一个官方的GPTs)你要做什么,它会提示你可以这样说:"制作一个帮助生成新产品视觉效果的创意人 "或 "制作一个帮助我格式化代码的软件工程师"。如下图:
2. 输入“创建一个物流系统的技术支持工程师,帮助商家解答系统问题和处理异常订单”,接下来GPT Builder会和你做一些j简单的对话,比如征求你对于命名、Logo的建议等等,如下图:
4. 重点来了,在这里可以使用“Upload files”功能上传你自己的“知识库”文件给到大模型推理,文件可以是文档、表格、图片等多种格式,这可以理解是一种对LLM的“静态”增强。如下图:
6. 最后,你可以把你精心“调教”出来的“自定义模型”分享给任何人或者发布到OpenAI的GPTs商店,如下图:
API(开放接口)
如果你不想依赖于OpenAI的生态平台实现自己的AI应用和商业模式,但又想借助其提供的ChatGPT等基础能力,那么,通过调用其对外开放的API接口一直是最好的选择。因此,OpenAI在推出GPTs的同时,也快速的上线了“Assistant API” 的Beta版本,在这个版本中,你可以实现GPTs中提到的所有“增强”大模型的能力,并通过API的方式将其对外发布,供第三方应用调用,并且支持GPT-4模型(当然调用价格也是不菲),如下图:
03
检索增强生成(RAG)技术概述和应用
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将
通过上一章的介绍,你可以发现OpenAI已经大规模使用工程化的技术使用户能够基于自己的知识库对其GTP系列大模型进行“增强”,从而实现更加垂直化、个性化的能力。那么,如果你基于成本或安全的考虑,想在私域进行自有知识库的“增强”,甚至切换成其它的大模型来使用这个“增强”,就不得不考虑自行开发实现了,这时候就需要了解检索增强生成(RAG)概念和向量数据库技术的应用。
什么是检索增强生成
一般来说RAG的工作原理是:首先利用一个检索组件在知识库(这个过程一般使用向量数据库实现)中查找与用户查询相关的文档或数据,这一步骤确保了生成过程基于的是与查询高度相关的信息。随后,这些检索到的信息被送入一个生成模型(如GPT系列大模型),该模型结合检索到的信息和原始查询生成详尽的回答或内容。其核心流程如下图(参考:https://aws.amazon.com/cn/what-is/retrieval-augmented-generation):
为什么是向量数据库
1.介绍向量数据库的数学理论:相似性度量——余弦相似度和点积,曼哈顿距离(L1)和欧几里得距离(L2),https://cloud.tencent.com/developer/article/2336891
向量数据库一般基于嵌入模型(Embedding Models)将文本向量化,从而来完成推理。前面提到Google发布的BERT模型和OpenAI发布的GPT模型都能提供嵌入(Embedding)计算的能力,但一般BERT系列模型相对于GPT系列模型会“小”很多,这体现在参数数量和磁盘占用上,可以说是“小模型”和“大模型”之分,在做向量计算时该如何选择呢?简单的说它们的相同点都是基于深度学习“将数据转换为高维向量表示”。不同点在于小模型侧重于数据的有效关联判定和简单逻辑推理,而大模型则侧重于深入理解和生成文本等更复杂的任务,具体如下:
小模型 | 大模型 | |
---|---|---|
设计目标和用途 | 通常设计为特定任务的一部分,比如将单词、句子或文档转换为向量形式,这些向量随后用于各种任务(如聚类、相似度搜索等)。 | 为理解文本上下文并生成文本而设计的。可以直接用于生成文本、问答、提取摘要等任务。 |
模型规模和复杂性 | 往往相对简单,参数量少,专注于有效地将数据转换为嵌入向量。一般模型主体占用数百MB磁盘空间。 | 拥有极大的参数量(从几十亿到几百亿不等),设计更为复杂,可以捕获数据中的细微语义和结构。占用TB级磁盘空间(AI估算)。 |
训练数据和过程 | 训练通常基于特定任务的数据集,目标是学习良好的数据表示。 | 通过在庞大的数据集上进行预训练,学习语言的广泛特征和模式,然后可以在特定任务上进行微调(fine-tuning)以提高性能。 |
在向量数据库中的应用 | 产生的向量直接用于向量数据库中,以支持快速的相似性检索和推理。 | 产生的向量可以用于向量数据库。但通常更注重捕捉丰富的语义信息,在需要深度理解的应用场景中作用更大。 |
目前,在市场上可供选择的向量数据库产品越来越多了,其中Faiss(Facebook AI Similarity Search)、Milvus等产品已经可以用于企业级生产。
Chroma是2023年中旬发布的一个面向AI应用的开源向量数据库,简单、轻量、易用,是专门为自然语言处理(NLP)、图像分类、构建推荐系统和聊天机器人等领域的应用而设计的,非常适合用来快速构建和探索RAG应用。
举个例子
下面用实际Python代码展示一个基于Chroma向量数据库实现RAG关键步骤“文本推理”(对应3.1节示意图环节②③)的例子,分别使用“小模型”和“大模型”对中文文本进行向量化处理,然后针对三个问题进行推理,比较这两种不同模型得到的结果:
import chromadb
basePath = "/dev/chromadbDemo/"
chroma_client = chromadb.PersistentClient(path=basePath + "chromadata")
print("数据库已启动:" + str(chroma_client))
# ——————————————————————准备数据——————————————————————
# 红楼梦(千字概述,正常风格)
file_path_hlm = basePath + "book_HLM.txt"
# 金瓶梅(千字概述,正常风格)
file_path_jpm = basePath + "book_JPM.txt"
# 水浒传(千字概述,无厘头风格)
file_path_shz = basePath + "book_SHZ.txt"
# 指环王(千字概述,莎士比亚风格)
file_path_zhw = basePath + "book_ZHW.txt"
docs = [
open(file_path_hlm, "r", encoding="utf-8").read(),
open(file_path_jpm, "r", encoding="utf-8").read(),
open(file_path_shz, "r", encoding="utf-8").read(),
open(file_path_zhw, "r", encoding="utf-8").read(),
"不可以,早晨喝牛奶不科学",
"吃了海鲜后是不能再喝牛奶的,因为牛奶中含得有维生素C,如果海鲜喝牛奶一起服用会对人体造成一定的伤害",
"吃海鲜是不可以吃柠檬的因为其中的维生素C会和海鲜中的矿物质形成砷",
"吃海鲜是不能同时喝牛奶吃水果,这个至少间隔6小时以上才可以",
]
metas = [
{"source": file_path_hlm, "uris": file_path_hlm, "author": "曹雪芹"},
{"source": file_path_jpm, "uris": file_path_jpm, "author": "兰陵笑笑生"},
{"source": file_path_shz, "uris": file_path_shz, "author": "施耐庵"},
{"source": file_path_zhw, "uris": file_path_zhw, "author": "托尔金"},
{"source": "my_source1"},
{"source": "my_source2"},
{"source": "my_source3"},
{"source": "my_source4"},
]
ids = ["id-hlm", "id-jpm", "id-shz", "id-zhw", "id1", "id2", "id3", "id4"]
3. 定义处理数据的4个函数,分别是文本转向量的函数、插入数据表的函数以及2种不同模型创建数据集(可以理解为“数据库表”)的函数。
# ——————————————————————定义处理数据的函数——————————————————————
# 用于将文本输入转换为Bert嵌入向量,默认使用 bert-base-chinese 模型和分词器处理文本。
def bert_embedding(text, modelName="bert-base-chinese"):
from transformers import BertModel, BertTokenizer
tokenizer = BertTokenizer.from_pretrained(modelName)
model = BertModel.from_pretrained(modelName)
inputs = tokenizer(
text, return_tensors="pt", padding=True, truncation=True, max_length=512
)
outputs = model(**inputs)
embeddings = outputs.last_hidden_state[:, 0, :].detach().numpy()
return embeddings
# 插入数据
def setData(collection, embedding=None):
if embedding is None:
collection.upsert(
documents=docs,
metadatas=metas,
ids=ids,
)
else:
collection.upsert(
embeddings=embedding,
documents=docs,
metadatas=metas,
ids=ids,
)
return collection
# 使用指定的嵌入模型建数据集,不指定则默认为:Sentence Transformers all-MiniLM-L6-v2
def getDefaultEmbeddingCollection(embeddingModelName=""):
collection = chroma_client.get_or_create_collection(name="collection_default")
if embeddingModelName is None or not embeddingModelName:
# 默认的向量模型
setData(collection)
else:
embedding = bert_embedding(docs, embeddingModelName)
collection = setData(collection, embedding)
collection.name = "collection_" + embeddingModelName
return collection
# 使用OpenAI的text-embedding-ada-002模型建数据集
def getOpenAIEmbeddingCollection():
import chromadb.utils.embedding_functions as embedding_functions
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
api_key="[填入你的 OpenAI API Key]",
model_name="text-embedding-ada-002",
)
collection = chroma_client.get_or_create_collection(
name="collection_text-embedding-ada-002", embedding_function=openai_ef
)
setData(collection)
return collection
collections = chroma_client.list_collections()
print("现有数据集:" + str(collections))
# 三个问题,用来测试不同数据集和向量模型的推理能力
q1 = "我想了解中国四大名著"
q2 = "关于宋朝发生的故事"
q3 = "吃完海鲜可以喝牛奶吗?"
def testModel(collection, q, rtNum, embeddingModelName=None):
if embeddingModelName is None:
results = collection.query(query_texts=[q], n_results=rtNum)
print(q + " - 查询结果:" + str(results) + "\n")
else:
results = collection.query(
query_embeddings=bert_embedding(q, embeddingModelName), n_results=rtNum
)
print(q + " - 查询结果:" + str(results) + "\n")
有了以上的准备,就可以开始测试了。
modelName = "bert-base-chinese"
collection = getDefaultEmbeddingCollection(modelName)
print("当前collection:" + str(collection) + "\n")
testModel(collection, q1, 2, modelName) #问题1返回2笔推理结果
testModel(collection, q2, 3, modelName) #问题2返回3笔推理结果
testModel(collection, q3, 5, modelName) #问题3返回5笔推理结果
当前collection:name='collection_bert-base-chinese' id=UUID('d0fe761d-3e64-4b89-ab8a-59a7253d44a7') metadata=None tenant='default_tenant' database='default_database'
我想了解中国四大名著 - 查询结果:{'ids': [['id1', 'id4']], 'distances': [[202.48262633262166, 266.160556742396]], 'metadatas': [[{'source': 'my_source1'}, {'source': 'my_source4'}]], 'embeddings': None, 'documents': [['不可以,早晨喝牛奶不科学', '吃海鲜是不能同时喝牛奶吃水果,这个至少间隔6小时以上才可以']], 'uris': None, 'data': None}
关于宋朝发生的故事 - 查询结果:{'ids': [['id1', 'id3', 'id4']], 'distances': [[253.08461381250856, 300.2129506027819, 334.78790699255]], 'metadatas': [[{'source': 'my_source1'}, {'source': 'my_source3'}, {'source': 'my_source4'}]], 'embeddings': None, 'documents': [['不可以,早晨喝牛奶不科学', '吃海鲜是不可以吃柠檬的因为其中的维生素C会和海鲜中的矿物质形成砷', '吃海鲜是不能同时喝牛奶吃水果,这个至少间隔6小时以上才可以']], 'uris': None, 'data': None}
吃完海鲜可以喝牛奶吗? - 查询结果:{'ids': [['id1', 'id2', 'id4', 'id3', 'id-hlm']], 'distances': [[
173.57739555949934,
201.32507459764457,
202.22220711154088,
261.7239443921094,
452.04586252776966]], 'metadatas': [[{'source': 'my_source1'}, {'source': 'my_source2'}, {'source': 'my_source4'}, {'source': 'my_source3'}, {'author': '曹雪芹', 'source': '/dev/chromadbDemo/book_HLM.txt', 'uris': '/dev/chromadbDemo/book_HLM.txt'}]], 'embeddings': None, 'documents': [[
'不可以,早晨喝牛奶不科学',
'吃了海鲜后是不能再喝牛奶的,因为牛奶中含得有维生素C,如果海鲜喝牛奶一起服用会对人体造成一定的伤害',
'吃海鲜是不能同时喝牛奶吃水果,这个至少间隔6小时以上才可以',
'吃海鲜是不可以吃柠檬的因为其中的维生素C会和海鲜中的矿物质形成砷',
'《红楼梦》是清代曹雪芹创作的一部长篇小说,被誉为中国古代四大名著之一。该作品通过贾、王、史、薛四大家族的兴衰史,细腻地描绘了封建王朝末期的社会生活,深刻揭示了封建社会的腐朽与衰败……此处省略1000字'
]], 'uris': None, 'data': None}
解读一下关键信息:ids字段是返回的结果标识;distances字段是向量距离,意思是问题和结果的相关性,距离越短表示越相关;documents字段则是返回的具体结果数据。可以发现:
1.“bert-base-chinese”模型的distances一般算出来是百位数;
2.“小模型”是可以基于简短文本数据进行一些简单推理的,例如“bert-base-chinese”模型对问题3“吃完海鲜可以喝牛奶吗?”的推理结果“基本”合格;
然后我们使用“OpenAI text-embedding-ada-002”这样的“大模型”对问题进行推理测试。测试代码如下:
collection = getOpenAIEmbeddingCollection()
print("当前collection:" + str(collection) + "\n")
testModel(collection, q1, 2) #问题1返回2笔推理结果
testModel(collection, q2, 3) #问题2返回3笔推理结果
testModel(collection, q3, 5) #问题3返回5笔推理结果
当前collection:name='collection_text-embedding-ada-002' id=UUID('ec450ccf-8359-4bfb-ab2b-f4bde881cb06') metadata=None tenant='default_tenant' database='default_database'
我想了解中国四大名著 - 查询结果:{'ids': [['id-hlm', 'id-jpm']], 'distances': [[
0.38686231602994325,
0.401715835018107]], 'metadatas': [[{'author': '曹雪芹', 'source': '/dev/chromadbDemo/book_HLM.txt', 'uris': '/dev/chromadbDemo/book_HLM.txt'}, {'author': '兰陵笑笑生', 'source': '/dev/chromadbDemo/book_JPM.txt', 'uris': '/chromadbDemo/book_JPM.txt'}]], 'embeddings': None, 'documents': [[
'《红楼梦》是清代曹雪芹创作的一部长篇小说,被誉为中国古代四大名著之一。该作品通过贾、王、史、薛四大家族的兴衰史,细腻地描绘了封建王朝末期的社会生活,深刻揭示了封建社会的腐朽与衰败。小说以贾宝玉和林黛玉的爱情悲剧为主线,通过丰富的人物群像和错综复杂的情节展现了一个广阔的社会生活画卷……此处省略1000字',
'《金瓶梅》是中国文学史上的一部重要小说,被认为是明代中期的作品,作者一般被认为是兰陵笑笑生。这部小说以宋代开封为背景,详细描绘了主人公西门庆与他的家人、情人、朋友之间的复杂关系,以及由此引发的一系列社会和家庭冲突……此处省略1000字']], 'uris': None, 'data': None}
关于宋朝发生的故事 - 查询结果:{'ids': [['id-shz', 'id-jpm', 'id-zhw']], 'distances': [[
0.322985944455922,
0.3312445684997755,
0.33733609769548206]], 'metadatas': [[{'author': '施耐庵', 'source': '/dev/chromadbDemo/book_SHZ.txt', 'uris': '/dev/chromadbDemo/book_SHZ.txt'}, {'author': '兰陵笑笑生', 'source': '/dev/chromadbDemo/book_JPM.txt', 'uris': '/dev/chromadbDemo/book_JPM.txt'}, {'author': '托尔金', 'source': '/dev/chromadbDemo/book_ZHW.txt', 'uris': '/dev/chromadbDemo/book_ZHW.txt'}]], 'embeddings': None, 'documents': [[
'水浒传,一本让人眼花缭乱的古典名著,故事内容丰富得可以用来炒一大锅剧情泡面。整个故事发生在北宋时期,可以想象成一个古代的超级英雄联盟,但这些英雄不穿紧身衣,而是穿着古代汉服,横扫江湖,打击不公……此处省略1000字',
'《金瓶梅》是中国文学史上的一部重要小说,被认为是明代中期的作品,作者一般被认为是兰陵笑笑生。这部小说以宋代开封为背景,详细描绘了主人公西门庆与他的家人、情人、朋友之间的复杂关系,以及由此引发的一系列社会和家庭冲突……此处省略1000字',
'在中世纪幻想的土地,被称为中土的地方,诞生了一部伟大的故事——《指环王》。这部史诗般的作品,如同莎士比亚之笔下的戏剧,充满了权力的争斗、勇气的考验、忠诚与背叛的较量,以及对自由与爱的无尽追求。\n\n噢,听吧,那遥远的号角在召唤,就如同命运之神在低语,引领我们走向那个被称为“魔戒”的强大而又可怕的物品……此处省略1000字']], 'uris': None, 'data': None}
吃完海鲜可以喝牛奶吗? - 查询结果:{'ids': [['id2', 'id4', 'id3', 'id1', 'id-shz']], 'distances': [[
0.18699816057051363,
0.2437766582633824,
0.3233349839279665,
0.33243019058071627,
0.5406020260719162]], 'metadatas': [[{'source': 'my_source2'}, {'source': 'my_source4'}, {'source': 'my_source3'}, {'source': 'my_source1'}, {'author': '施耐庵', 'source': '/dev/chromadbDemo/book_SHZ.txt', 'uris': '/dev/chromadbDemo/book_SHZ.txt'}]], 'embeddings': None, 'documents': [[
'吃了海鲜后是不能再喝牛奶的,因为牛奶中含得有维生素C,如果海鲜喝牛奶一起服用会对人体造成一定的伤害',
'吃海鲜是不能同时喝牛奶吃水果,这个至少间隔6小时以上才可以',
'吃海鲜是不可以吃柠檬的因为其中的维生素C会和海鲜中的矿物质形成砷',
'不可以,早晨喝牛奶不科学',
'水浒传,一本让人眼花缭乱的古典名著,故事内容丰富得可以用来炒一大锅剧情泡面。整个故事发生在北宋时期,可以想象成一个古代的超级英雄联盟,但这些英雄不穿紧身衣,而是穿着古代汉服,横扫江湖,打击不公……此处省略1000字']], 'uris': None, 'data': None}
对比第一次小模型测试的结果,我们可以明显感觉到:
04
智能体(Agent)的概念、应用和集成
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将
智能体的概念和开发思想
举个例子
Tavily可以提供一个沙箱(APIPlayground),供用户测试其“针对高质量实时知识优化的大模型增强检索”API,沙箱只开放通用知识库(垂直的高质量实时知识库需要付费才能使用),沙箱的测试结果会返回互联网上的相关知识集。我提出了一个极富挑战性的课题进行测试,效果如下图:
Tavily还提供了一个研究助手(Research Assistant)的Web应用,供用户在线使用智能体产品,需要用户使用自己的OpenAI API Key调用GPT4服务,支持“深度研究”,也就是要消耗更多的算力和时间(钱)获得更高质量的结果。我提出了一个很直接很实用的课题进行测试,消耗了大约2元多人民币的API调用费,获得了一份大约1500字的报告,过程如下图:
集成大模型、RAG和智能体的方法和场景
3.供应链销售与运营规划(S&OP):利用大模型处理历史销售数据、市场趋势和用户反馈,生成精准的需求预测报告。智能体能够学习并适应市场变化,实时调整预测模型,提高预测的准确性。
05 未来展望与挑战
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将
05 未来展望与挑战
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将
(参考资料:https://insights.sei.cmu.edu/blog/application-of-large-language-models-llms-in-software-engineering-overblown-hype-or-disruptive-change/)
京东中台化底层支撑框架技术分析及随想AIGC在保险场景中的视觉应用
对号入座,快看看你的应用系统用了哪些高并发技术?