一、注解概述
1.什么是注解?
注解是JDK1.5才引入的。
注解可以标注在 类上,属性上,方法上 等。
注解可以做到在不改变代码逻辑的前提下在代码中嵌入补充信息。
2.注解与注释
**注释:**给程序员看的,编译器编译时会忽略注释。
注解:给编译器看的,或给其它程序看的,程序根据有没有这个注解来决定不同的处理方式。
3.注解的重要性
框架是如何实现的:框架 = 反射 + 注解 + 设计模式。
二、Java预置注解
1.标记已过时的注解@Deprecated
用来标记过时的元素,在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的类、过时的方法、过时的属性等。
\* JDK的内置注解:@Deprecated \* 1. 被这个注解标注的元素已过时。 \* 2. 这个注解是给编译器看的。编译器看到这个注解之后会有警告提示信息。 \* 3. 经过测试 @Deprecated 注解可以标注的元素很多,例如:类上,方法上,属性上....2.标记方法重写的注解@Override
修饰实例方法,则该方法必须是个重写方法,否则就会编译失败。
\* JDK内置的注解:@Override \* 1. 给编译器看的。 \* 2. 这个注解标注实例方法,被标注的方法必须是重写父类的方法。 \* 3. 这个注解就是在编译阶段进行方法检查的,检查这个方法是否重写了父类方法,如果没有重写父类方法,则报错。 \* 4. 通过测试这个@Override注解只能使用在实例方法上。其他位置不能应用。3.抑制警告的注解@SuppressWarnings
@SuppressWarnings(抑制警告的注解):在实际开发中,建议尽量不要忽略警告,而是真正的去解决警告。
@SuppressWarnings(“rawtypes”):抑制未使用泛型的警告
@SuppressWarnings(“resource”):抑制未关闭资源的警告
@SuppressWarnings(“deprecation”):抑制使用了已过时资源时的警告
@SuppressWarnings(“all”):抑制所有警告
import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; /** * Java内置注解:@SuppressWarnings * 1. 主要作用是:抑制警告。 * 2. 该注解常见的属性值: * rawtypes:抑制未使用泛型的警告 * resource: 抑制未关闭资源的警告 * deprecation: 抑制使用了已过时资源时的警告 * all:抑制所有警告 */ @SuppressWarnings("all") public class AnnotationTest03 { public static void main(String[] args) throws Exception{ //@SuppressWarnings("rawtypes") List list = new ArrayList(); //@SuppressWarnings("resource") FileInputStream in = new FileInputStream("e:/file.txt"); //@SuppressWarnings("deprecation") MyClass1 myClass1 = new MyClass1(); } }4.函数式接口注解@FunctionalInterface
“函数式接口”的注解,这个是 JDK1.8 版本引入的新特性。使用@FunctionalInterface标注的接口,则**该接口就有且只能存在一个抽象方法,**否则就会发生编译错误。(注意:接口中的默认方法或静态方法可以有多个。)
\* 关于Java内置注解:@FunctionalInterface \* 1. 这个注解是专门用来标注接口的。 \* 2. 被标注的接口必须是一个函数式接口,如果不是函数式接口,则编译器报错。 \* 3. 这个注解也是给编译器看的。 \* 4. 什么是函数式接口? \* 如果这个接口中抽象方法只有一个(有且仅有一个)。称为函数式接口。 \* 5. 被 @FunctionalInterface 标注的接口中,允许有多个默认方法和静态方法。/** * 关于Java内置注解:@FunctionalInterface * 1. 这个注解是专门用来标注接口的。 * 2. 被标注的接口必须是一个函数式接口,如果不是函数式接口,则编译器报错。 * 3. 这个注解也是给编译器看的。 * 4. 什么是函数式接口? * 如果这个接口中抽象方法只有一个(有且仅有一个)。称为函数式接口。 * 5. 被 @FunctionalInterface 标注的接口中,允许有多个默认方法和静态方法。 */ public class AnnotationTest04 { } @FunctionalInterface interface Flyable { void fly(); //void run(); default void run(){ System.out.println("默认方法是可以的"); } static void doSome(){ System.out.println("静态方法"); } }三、自定义注解和使用注解
1.自定义注解
自定义注解也属于引用数据类型
使用 @interface 来定义注解。
默认情况下注解可以出现在类上、方法上、属性上、构造方法上、方法参数上等…
所有自定义的注解,它的父类是:java.lang.annotation.Annotation
示例:
自定义的注解:@interface MyAnnotation
/** * 自定义的注解。(以下这是注解的定义过程!!!!!) */ public @interface MyAnnotation { }以下是使用注解的过程!!!!!!
/** * 以下是使用注解的过程!!!!!! */ @MyAnnotation public class AnnotationTest05 {//类上能用注解 @MyAnnotation private String name;//属性(字段)上能用注解 @MyAnnotation public void doSome(){//方法上能用注解 } //方法参数上能用注解 public void doOther(@MyAnnotation String name, @MyAnnotation String password){ } //方法的局部变量上能用注解 public void toDo( @MyAnnotation String name, @MyAnnotation String password){ } }2.注解也可以定义属性
注解也可以定义属性,不过属性定义时,属性名后面必须加一个小括号。
属性的类型只能是:
byte,short,int,long,float,double,boolean,char
String、Class、枚举类型、注解类型
以上所有类型的一维数组形式
示例:
季节的枚举类型:Season
/** * 季节的枚举类型 */ public enum Season { SPRING, SUMMER, AUTUMN, WINTER }自定义的注解:@interface MyAnnotation
/** * 自定义的注解。(以下这是注解的定义过程!!!!!) */ public @interface MyAnnotation { }\* 注解也可以定义属性,但是属性定义时有要求,属性名后面必须添加:() \* 语法: \* 属性的类型 属性的名字();自定义的注解:@interface DataBaseInfo
/** * 这是一个数据库信息的注解(自定义的注解) */ public @interface DataBaseInfo { /** * 注解也可以定义属性,但是属性定义时有要求,属性名后面必须添加:() * 语法: * 属性的类型 属性的名字(); */ String driver() default "com.mysql.cj.jdbc.Driver"; // 使用 default 关键字来指定属性的默认值。 String url(); String user(); String password(); byte b() default 0; short s() default 0; int i() default 0; long l() default 0L; float f() default 0.0F; double d() default 0.0; boolean flag() default false; char c() default '0'; Class clazz() default String.class; Season season() default Season.SPRING; MyAnnotation myAnnotation(); /** * 可以是一维数组形式 * @return */ String[] names(); // 注解的属性的数据类型,必须是以上的几种类型,或者这几种类型的一维数组,不能是其他类型。 //Object obj(); }使用自定义的注解:@DataBaseInfo
/** * 使用自定义的注解:@DataBaseInfo */ public class AnnotationTest06 { // 语法规则:如果这个注解中有属性,那么使用的时候,必须给属性赋值。没有赋值则报错。 // 除非你定义注解的时候给属性指定了默认值。 // 怎么给属性赋值?语法:@DataBaseInfo(属性名=值,属性名=值,属性名=值,属性名=值,属性名=值) @DataBaseInfo( //driver="oracle.jdbc.driver.OracleDriver", //由于指定了默认值,所以不用写了 url="jdbc:mysql://localhost:3306/powernode", user="root", password="123456", myAnnotation=@MyAnnotation, names={"zhangsan", "lisi", "wangwu"}, flag=true, i=100, clazz=Integer.class, season=Season.WINTER) public void connDB(){ } }3.注解的使用
注解在使用时必须给属性赋值,除非你使用了default关键字为属性指定了默认值。
如果属性只有一个,并且属性名是value时,使用注解时value可以省略不写。
如果属性是一个数组,使用注解时,数组值只有一个,数组的大括号是可以省略的。
自定义的注解:@interface Table
public @interface Table { /** * 有一个属性,并且这个属性的名字是value */ //String value(); String[] value(); }//@Table(value="t_user") // 如果属性名是value的话, 在使用注解的时候,该属性名可以省略。 //@Table("t_user") //@Table(value={"t_user1", "t_user2"}) // value可以省略。 //@Table({"t_user1", "t_user2"}) //@Table({"t_user"}) @Table("t_user") public class AnnotationTest07 { @SuppressWarnings("all") public static void main(String[] args) { } }四、元注解
用来标注注解的注解叫做元注解。(也是JDK内置的注解。)
常用的元注解:
@Retention:设置注解的保持性
@Target:设置注解可以出现的位置
@Documented:设置注解是否可以生成到帮助文档中
@Inherited:设置注解是否支持继承
@Repeatable:设置注解在某一个元素上是否可以重复使用(Java8的新特性。)
1.设置注解的保持性@Retention
Retention英文意思有保留、保持的意思,它表示注解存在阶段是保留在源代码(编译期),字节码(类加载)或者运行时(JVM中运行)。
在@Retention注解中使用枚举RetentionPolicy来表示注解保留时期。
@Retention(RetentionPolicy.SOURCE):注解仅存在于源代码中,在字节码文件中不包含。
@Retention(RetentionPolicy.CLASS):注解在字节码文件中存在,但运行时无法获得(默认)。
@Retention(RetentionPolicy.RUNTIME):注解在字节码文件中存在,且运行时可通过反射获取。
示例:
自定义的注解:@interface MyAnnotation
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; //@Retention(value= RetentionPolicy.SOURCE) // @MyAnnotation 注解保留在源码中。 //@Retention(value= RetentionPolicy.CLASS) // @MyAnnotation 注解保留在字节码中,这是默认的行为,但不能被反射。 //@Retention(value= RetentionPolicy.RUNTIME) // @MyAnnotation 注解保留在字节码中,并且在运行时可以被反射。 @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { }测试类Test:
import java.lang.annotation.Annotation; @MyAnnotation // 这个注解会被保留到字节码中,并且在运行时可以被反射。 public class Test { public static void main(String[] args) { // 获取这个类 Class<Test> testClass = Test.class; // 获取这个类上的注解 //MyAnnotation annotation = testClass.getAnnotation(MyAnnotation.class); // java.lang.annotation.Annotation是所有注解的老祖宗。 Annotation annotation = testClass.getAnnotation(MyAnnotation.class); System.out.println(annotation); } }运行结果:
2.设置注解可以出现的位置:@Target
用于描述注解可以使用的位置,该注解使用ElementType枚举类型用于描述注解可以出现的位置,ElementType有如下枚举值:
自定义的注解:@interface MyAnnotation
import java.lang.annotation.ElementType; import java.lang.annotation.Target; //@Target(value={ElementType.METHOD}) //@Target(ElementType.METHOD) // 限定注解只能出现在方法上 @Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD}) public @interface MyAnnotation { }测试类:
@MyAnnotation public class Test { @MyAnnotation int num = 100; @MyAnnotation public static void main(String[] args) { } }3.设置注解是否可以生成到帮助文档中:@Documented
Documented的英文意思是文档。
使用javadoc.exe工具可以从程序源代码中抽取类、方法、属性等注释形成一个源代码配套的API帮助文档,而该工具抽取时默认不包括注释内容。
如果使用的注解被@Documented标注,那么该注解就能被javadoc.exe工具提取到API文档。
自定义的注解:@interface MyAnnotation
import java.lang.annotation.Documented; @Documented//这个注解可以被文档化了 public @interface MyAnnotation { }Test类:
@MyAnnotation public class Test { @MyAnnotation public static int num=100; @MyAnnotation public void doSome(){ } @MyAnnotation public Test(){ } }4.设置注解是否支持继承:@Inherited
Inherited的英文意思是继承,但是这个继承和我们平时理解的继承大同小异,一个被@Inherited注解了的注解修饰了一个父类,则它的子类也继承了父类的注解。
自定义的注解:@interface MyAnnotation
import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @Inherited // 表示 @MyAnnotation注解能够被继承 public @interface MyAnnotation { }父类Animal:
@MyAnnotation public class Animal { }子类Cat:
public class Cat extends Animal{ }测试类:
public class Test { public static void main(String[] args) { //Cat类自动继承了父类的注解 Class<Cat> catClass = Cat.class; MyAnnotation annotation = catClass.getAnnotation(MyAnnotation.class); System.out.println(annotation); } }运行结果;
5.设置注解在某一个元素上是否可以重复使用(Java8的新特性。):@Repeatable
Repeatable表示可重复的含义,该注解属于JDK1.8版本的新特性。
自定义的注解:@interface Author
@Repeatable(Authors.class) public @interface Author { /** * 作者的名字 * @return 作者的名字 */ String name(); }自定义的注解:@interface Authors
public @interface Authors { Author[] value(); }测试类Test;
public class Test { @Author(name = "张三") @Author(name = "李四") public void doSome(){ } }五、反射注解
自定义的注解:@interface Annotation1
import java.lang.annotation.*; import java.lang.annotation.*; /** * 这是一个自定义注解 Annotation1 的定义类。 * 该注解可以用于类、字段和方法上,并且在运行时可以通过反射机制获取,同时具有继承性和文档化特性。 */ // @Target 注解用于指定自定义注解可以应用的目标元素类型 // ElementType.TYPE 表示可以应用于类、接口(包括注解类型)或枚举声明 // ElementType.FIELD 表示可以应用于字段声明(包括枚举常量) // ElementType.METHOD 表示可以应用于方法声明 @Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD}) // @Retention 注解用于指定注解的保留策略 // RetentionPolicy.RUNTIME 表示注解将保留到运行时,这样可以在运行时通过反射机制获取注解信息 @Retention(RetentionPolicy.RUNTIME) // @Inherited 注解表明该注解具有继承性 // 如果一个使用了此注解的类被继承,那么它的子类也会继承该注解 @Inherited // @Documented 注解表示该注解会被包含在 Javadoc 文档中 @Documented // 定义一个自定义注解 Annotation1 public @interface Annotation1 { /** * 定义注解的一个属性 name,类型为 String。 * 该属性用于存储一个字符串值,默认值为空字符串。 * * @return 注解的 name 属性值 */ String name() default ""; /** * 定义注解的一个属性 age,类型为 int。 * 该属性用于存储一个整数值,默认值为 0。 * * @return 注解的 age 属性值 */ int age() default 0; }自定义的注解:@interface Annotation2
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Annotation2 { String email() default ""; double price() default 0.0; }Myclass类:
@Annotation1(name="zhangsan22222", age=3333) @Annotation2(email="zhangsan@123.com", price = 3000.5) public class MyClass { @Annotation1 @Annotation2 String s; @Annotation1 @Annotation2 public void doSome(){ } }测试类:
public class Test { public static void main(String[] args) { // 获取类 Class<MyClass> mcClass = MyClass.class; // 获取类上的所有注解 /*Annotation[] annotations = mcClass.getAnnotations(); for(Annotation a : annotations){ System.out.println(a); }*/ // 判断该类上是否存在这个注解 if(mcClass.isAnnotationPresent(Annotation1.class)){ // 获取指定的某个注解 Annotation1 a1 = mcClass.getAnnotation(Annotation1.class); // 访问注解对象中的属性 System.out.println(a1.name()); System.out.println(a1.age()); } if(mcClass.isAnnotationPresent(Annotation2.class)){ Annotation2 a2 = mcClass.getAnnotation(Annotation2.class); System.out.println(a2.email()); System.out.println(a2.price()); } } }运行结果:
六、递归+反射+注解的综合练习
储备知识:
数据库是用来组织数据的,数据库使用表来组织数据,一个数据库表如图所示。
一张表应该有表名,例如:t_user
一张表中应该有很多字段,每个字段有字段名和数据类型,例如age字段是int类型。
数据库中整数对应的类型是:int。字符串对应的类型是:varchar。
建表语句如下:
create table t_user(
id int,
name varchar,
age int,
email varchar );
编写程序扫描一个包下所有的类,凡是被 @Table 注解标注的类都要生成一条建表语句,表名在 @Table 注解中指定。
被@Table 标注的类中的属性被 @Column 注解标注,在 @Column注解中描述字段的名称和字段的数据类型。
1.a包下
⑴.b包:VIp
import annotation.Column; import annotation.Table; @Table("t_vip") public class Vip { @Column(name = "id") private String id; //@Column(name = "name") private String name; //@Column(name = "grade") private String grade; }⑵.User类
import annotation.Column; import annotation.Table; /** * ClassName: User */ @Table("t_user") public class User { @Column(name = "uid") private String userid; @Column(name = "uname") private String username; @Column(name = "pwd") private String password; @Column(name = "age", type = "int") private int age; private String email; }2.annotion包下
⑴.注解:@interface Column
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * * Description: * 该注解用来标注一个类中的属性,被标注的属性参与建表。 * */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { /** * 字段的名字 * @return 字段的名字 */ String name(); /** * 字段的数据类型 * @return 字段的数据类型 */ String type() default "varchar"; }⑵.注解:@interface Table
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * ClassName: Table * Description: * 被 @Table 注解标注的类,要生成建表语句。 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Table { /** * 用来指定表的名字 * @return 表的名字 */ String value(); }3.c包下
⑴.Customer类
import annotation.Column; import annotation.Table; @Table("t_customer") public class Customer { @Column(name = "cid") private String cid; @Column(name = "name") private String name; @Column(name = "age", type = "int") private int age; @Column(name = "addr") private String address; }4.d包下
测试类Test:
import annotation.Column; import annotation.Table; import java.io.File; import java.lang.reflect.Field; public class Test { private static String classpathRoot; private static StringBuilder sb = new StringBuilder(); public static void main(String[] args) { // 扫描类路径当中所有的文件,找到所有的.class结尾的文件 // 通过.class文件的路径找到对应的全限定类名(全限定类名是带包名的。) classpathRoot = Thread.currentThread().getContextClassLoader().getResource(".").getPath(); //System.out.println("类路径的根:" + classpathRoot); // 创建File对象 File file = new File(classpathRoot); // 调用方法来生成建表语句 generateCreateStatement(file); System.out.println(sb); } /** * 通过这个方法,来生成建表语句 * * @param file 起初的这个file代表的是类的根目录 */ private static void generateCreateStatement(File file) { if (file.isFile()) { // file是一个文件的时候,递归结束 //System.out.println(file.getAbsolutePath()); String classFileAbsolutePath = file.getAbsolutePath(); if (classFileAbsolutePath.endsWith(".class")) { // 程序执行到这里,表示文件一定是一个字节码文件 //System.out.println(classFileAbsolutePath); String className = classFileAbsolutePath.substring(classpathRoot.length() - 1, classFileAbsolutePath.length() - ".class".length()).replace("\\", "."); //System.out.println(className); try { // 获取类 Class<?> clazz = Class.forName(className); // 判断类上面是否有@Table注解 if(clazz.isAnnotationPresent(Table.class)){ Table tableAnnotation = clazz.getAnnotation(Table.class); // 获取到表的名字 String tableName = tableAnnotation.value(); System.out.println(tableName); sb.append("create table "); sb.append(tableName); sb.append("("); // 获取所有的属性 Field[] fields = clazz.getDeclaredFields(); for(Field field : fields){ // 判断字段上是否存在 @Column 注解 if(field.isAnnotationPresent(Column.class)){ Column columnAnnotation = field.getAnnotation(Column.class); // 字段名 String columnName = columnAnnotation.name(); System.out.println(columnName); sb.append(columnName); sb.append(" "); // 字段的类型 String columnType = columnAnnotation.type(); System.out.println(columnType); sb.append(columnType); sb.append(","); } } // 删除当前sb中的最后一个逗号 sb.deleteCharAt(sb.length() - 1); sb.append(");\n"); } } catch (Exception e) { throw new RuntimeException(e); } } return; } File[] files = file.listFiles(); for (File f : files) { //System.out.println(f.getAbsolutePath()); generateCreateStatement(f); } } }Java开发的就业市场正在经历结构性调整,竞争日益激烈
传统纯业务开发岗位(如仅完成增删改查业务的后端工程师)的需求,特别是入门级岗位,正显著萎缩。随着企业技术需求升级,市场对Java人才的要求已从通用技能转向了更深入的领域经验(如云原生、微服务)或前沿的AI集成能力。这也导致岗位竞争加剧,在一、二线城市,求职者不仅面临技术内卷,还需应对学历与项目经验的高门槛。
大模型为核心的AI领域正展现出前所未有的就业热度与人才红利
2025年,AI相关新发岗位数量同比激增543%,单月增幅最高超过11倍,大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡,议价能力极强,跳槽薪资涨幅可达30%-50%。值得注意的是,市场并非单纯青睐算法研究员,而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师,在向“Java+大模型”复合人才转型时拥有独特优势,成为企业竞相争夺的对象,其薪资天花板也远高于传统Java岗位。
说真的,这两年看着身边一个个搞Java、C++、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。
结果GPT、DeepSeek火了之后,整条线上的人都开始有点慌了,大家都在想:“我是不是要学大模型,不然这饭碗还能保多久?”
先给出最直接的答案:一定要把现有的技术和大模型结合起来,而不是抛弃你们现有技术!掌握AI能力的Java工程师比纯Java岗要吃香的多。
即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地!大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇!
如何学习AGI大模型?
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享**
一、2025最新大模型学习路线
一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。
我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。
L1级别:AI大模型时代的华丽登场
L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。
L2级别:AI大模型RAG应用开发工程
L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。
L3级别:大模型Agent应用架构进阶实践
L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。
L4级别:大模型微调与私有化部署
L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。
整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。
二、大模型经典PDF书籍
书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)
三、大模型视频教程
对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。
四、大模型项目实战
学以致用,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。
五、大模型面试题
面试不仅是技术的较量,更需要充分的准备。
在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享