使用libclang解析C++代码
  • 1. libclang?
  • 2. libclang!
  • 3. 基本的例子
  • 4. Cursors(游标)
  • 5. Visit children
  • 6. CXString
  • 7. 打印有意义的输出
  • 8. 一个更复杂的例子
  • 9. 总结
  • 10. 完整的代码

在本文中,我将提供一个使用libclang的快速教程。我开始试用libclang,同时实现了一个面向c++的开源反射框架——Reflang。然后我开始欣赏它的开发人员所做的令人惊叹的工作。
请注意,我们将从一个程序开始,并将逐步添加代码。滑动到文章末尾查看完整的解决方案。

1. libclang?

您有听说过Clang吗?,它是一个很棒的C++(和其他C语言家族)编译器。不完全是编译器,还是LLVM编译器的前端。
你看,编译器有一个很难解决的问题,所以他们中的大多数人把它分成两个简单的问题:

  • 将一种编程语言(在我们的例子中是C++)转换为一些中间代码 —— 这称为前端,这正是Clang所做的。
  • 将上面的中间代码转换为机器码 —— 这称为后端代码。Clang为此使用了LLVM。

Clang的巧妙之处在于,它也被设计成一个库。有许多类型的应用程序必须真正理解代码 —— IDE、文档生成器、静态分析工具等等。libclang可以用来正确处理所有语言特性和边界情况,而不是每个函数都必须实现C++解析(这是一个非常困难的任务!)

2. libclang!

而且非常简单。真的。那些Clang的开发者真的做了很棒的工作。在这篇文章的其余部分,我们将使用它的C-API来探索以下代码:

// header.hpp
class MyClass{
public:
  int field;
  virtual void method() const = 0;

  static const int static_field;
  static int static_method();
};
3. 基本的例子

让我们看一个最简单的例子。下面的程序解析上述文件,并立即存在:

#include <iostream>
#include <clang-c/Index.h>  // This is libclang.
using namespace std;

int main(){
  CXIndex index = clang_createIndex(0, 0);
  CXTranslationUnit unit = clang_parseTranslationUnit(
    index,
    "header.hpp", nullptr, 0,
    nullptr, 0,
    CXTranslationUnit_None);
  if (unit == nullptr)
  {
    cerr << "Unable to parse translation unit. Quitting." << endl;
    exit(-1);
  }

  clang_disposeTranslationUnit(unit);
  clang_disposeIndex(index);
}

这里有许多0和nullptr — 这些允许我们做一些更高级的事情(比如传递argv和argc,使用内存文件,等等)。我们不深入讨论这些。
那么,在clang_parseTranslationUnit()成功完成之后,我们会得到什么呢?我们将会得到一个经过解析的抽象语法树(AST),可以遍历和检查它。这正是我们要做的。

4. Cursors(游标)

指向AST的指针在libclang术语中称为CursorsCursors可以有父Cursors和子Cursors。它也可以有相关的Cursors(比如参数的默认值、枚举项的显式值等)。

我们将使用的“entry point” cursor是表示翻译单元(TU)的cursor,TU是一个C++术语,表示包含所有#include代码的单个文件。要获得TU的cursor,我们将使用描述性非常强的clang_getTranslationUnitCursor()。现在我们有了一个cursor,我们可以使用它进行研究或迭代。

5. Visit children

任何cursor都有一种Kind,它表示cursor的本质。Kind可以是许多选项中的一个,如这里所示。以下是一些例子:

/** \brief A C or C++ struct. */
  CXCursor_StructDecl                    = 2,
  /** \brief A C or C++ union. */
  CXCursor_UnionDecl                     = 3,
  /** \brief A C++ class. */
  CXCursor_ClassDecl                     = 4,
  /** \brief An enumeration. */
  CXCursor_EnumDecl                      = 5,

我们可以使用clang_getCursorKind()cursor获取Kind

现在让我们来查看TU的所有children:

CXCursor cursor = clang_getTranslationUnitCursor(unit);
  clang_visitChildren(
    cursor,
    [](CXCursor c, CXCursor parent, CXClientData client_data)
    {
      cout << "Cursor kind: " << clang_getCursorKind(c) << endl;
      return CXChildVisit_Recurse;
    },
    nullptr);

第二个参数lambda是为每次访问的cursor调用的函数。在内部,我们总是返回CXChildVisit_Recurse(尽管存在其他选项),因为我们想要探索文件中的所有内容。
输出:

Cursor kind: 4
Cursor kind: 39
Cursor kind: 6
Cursor kind: 21
Cursor kind: 9
Cursor kind: 21

这有点神秘,需要我们来回跳转到Index.h。幸运的是,有一个内置函数可以将cursor Kind转换为字符串,但首先我们需要讨论libclang的字符串。

6. CXString

CXString是一种表示指向AST的指针的类型。要检索一个实际有用的字符串(例如const char *),必须调用clang_getCString(),它在内部增加一个ref-count,然后在完成时调用clang_disposeString()

因为我们要做很多这样的工作,让我们创建一个辅助函数:

ostream& operator<<(ostream& stream, const CXString& str)
{
  stream << clang_getCString(str);
  clang_disposeString(str);
  return stream;
}
7. 打印有意义的输出

现在我们可以提取字符串,让我们修改lambda来打印一些实际有用的东西:

CXCursor cursor = clang_getTranslationUnitCursor(unit);
  clang_visitChildren(
    cursor,
    [](CXCursor c, CXCursor parent, CXClientData client_data)
    {
      cout << "Cursor '" << clang_getCursorSpelling(c) << "' of kind '"
        << clang_getCursorKindSpelling(clang_getCursorKind(c)) << "'\n";
      return CXChildVisit_Recurse;
    },
    nullptr);

输出:

Cursor 'MyClass' of kind 'ClassDecl'
Cursor '' of kind 'CXXAccessSpecifier'
Cursor 'field' of kind 'FieldDecl'
Cursor 'method' of kind 'CXXMethod'
Cursor 'static_field' of kind 'VarDecl'
Cursor 'static_method' of kind 'CXXMethod'

现在,这真是太棒了。

8. 一个更复杂的例子

我非常小心,没有在header.hpp中包含任何header。为什么?如果在header.hpp中添加#include <string>。输出文件大小为1.51MB。有没有因为编译器花了这么长时间而生气?这就是原因。阅读这样的文件是很有教育意义的,但是为了大家的利益,我就不在这里发表了。

相反,让我们解析以下文件:

enum class Cpp11Enum
{
  RED = 10,
  BLUE = 20
};

struct Wowza
{
  virtual ~Wowza() = default;
  virtual void foo(int i = 0) = 0;
};

struct Badabang : Wowza
{
  void foo(int) override;

  bool operator==(const Badabang& o) const;
};

template <typename T>
void bar(T&& t);

同样的程序对于这个文件的输出:

Cursor 'Cpp11Enum' of kind 'EnumDecl'
Cursor 'RED' of kind 'EnumConstantDecl'
Cursor '' of kind 'IntegerLiteral'
Cursor 'BLUE' of kind 'EnumConstantDecl'
Cursor '' of kind 'IntegerLiteral'
Cursor 'Wowza' of kind 'StructDecl'
Cursor '~Wowza' of kind 'CXXDestructor'
Cursor 'foo' of kind 'CXXMethod'
Cursor 'i' of kind 'ParmDecl'
Cursor '' of kind 'IntegerLiteral'
Cursor 'Badabang' of kind 'StructDecl'
Cursor 'struct Wowza' of kind 'C++ base class specifier'
Cursor 'struct Wowza' of kind 'TypeRef'
Cursor 'foo' of kind 'CXXMethod'
Cursor '' of kind 'attribute(override)'
Cursor '' of kind 'ParmDecl'
Cursor 'operator==' of kind 'CXXMethod'
Cursor 'o' of kind 'ParmDecl'
Cursor 'struct Badabang' of kind 'TypeRef'
Cursor 'bar' of kind 'FunctionTemplate'
Cursor 'T' of kind 'TemplateTypeParameter'
Cursor 't' of kind 'ParmDecl'
Cursor 'T' of kind 'TypeRef'
9. 总结

libclang很棒:

  • 它允许检查代码是否已从宏展开,并跳转到那里;
  • 它允许检查每个光标的位置(文件+行+列);
  • 它允许获取函数的参数名、类型和返回类型;
  • 它可以理解templates、templates、lambdas,以及C++中的所有东西。

我希望这篇简短的文章能让您感到好奇,并且您也将尝试探索这个神奇的API提供了什么。如果你有什么想要补充或询问的,请在下方留言!

10. 完整的代码

为了方便您,以下是我们今天实现的完整代码:

#include <iostream>
#include <clang-c/Index.h>
using namespace std;

ostream& operator<<(ostream& stream, const CXString& str){
  stream << clang_getCString(str);
  clang_disposeString(str);
  return stream;
}

int main(){
  CXIndex index = clang_createIndex(0, 0);
  CXTranslationUnit unit = clang_parseTranslationUnit(
    index,
    "header.hpp", nullptr, 0,
    nullptr, 0,
    CXTranslationUnit_None
  );
  if (unit == nullptr){
    cerr << "Unable to parse translation unit. Quitting." << endl;
    exit(-1);
  }

  CXCursor cursor = clang_getTranslationUnitCursor(unit);
  clang_visitChildren(
    cursor,
    [](CXCursor c, CXCursor parent, CXClientData client_data){
      cout << "Cursor '" << clang_getCursorSpelling(c) << "' of kind '"
        << clang_getCursorKindSpelling(clang_getCursorKind(c)) << "'\n";
      return CXChildVisit_Recurse;
    },
    nullptr
   );

  clang_disposeTranslationUnit(unit);
  clang_disposeIndex(index);
}

本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。

  • [](javascript:;)赞
  • [](javascript:;)收藏
  • [](javascript:;)评论
  • [](javascript:;)分享
  • [](javascript:;)举报

上一篇:typescript 定义类型 未知变量名

下一篇:戴尔服务器bios怎么设置网络唤醒

提问和评论都可以,用心的回复会被更多人看到 评论

发布评论

全部评论 () 最热 最新

相关文章

  • [

    深入解读LangChain百万代码:这个模型胃口很大!

    你好呀,我是小智!熟悉我的小伙伴们,一定看过我之前介绍Agent如何实现百万上下文RAG的那篇文章。不得不说AI发展真的是日新月异,这才没过多久,模型本身的上下文能力也来到了百万级别。小智也是在苦思如何解决大模型代码库解析跨文件关联问题时,无意中在智谱AI 的大模型开放平台(bigmodel.cn)上发现了支持 1M 上下文(约 150-200 万汉字)的 GLM-4-Long。更没想到的是,模型

    ](https://blog.51cto.com/u_13279124/11738338)

    ide 相对路径 使用场景

  • [

    Langchain入坑

    LangChain是一个用于开发由大型语言模型(LLM)支持的应用程序的框架。LangChain简化了LLM申请生命周期的每个阶段:开发:使用LangChain的开源构建块和组件构建您的应用程序。使用第三方集成和模板开始运行。生产化:使用LangSmith检查、监控和评估您的链,以便您可以充满信心地持续优化和部署。部署:使用LangServe将任何链变成 API 。jupyter具体来说,该框架由

    ](https://blog.51cto.com/bigdatagrocery/10385800)

    语言模型 ide 应用程序

  • [

    LangChain基础篇 (01)

    LangChainLangChain 是什么Langchain 是一个开源框架,它允许开发人员将大型语言模型与外部的计算和数据源结合起来,是一个通过组合模块和能力抽象来扩展 LLM 的助手为什么需要 LangChain增强语言模型的功能: LangChain 提供了可以将语言模型与各种数据源(如数据库、WebAPI、文档、搜索引擎等)连接的工具,使得语言模型能够在处理复杂任务时提供更丰富的回答。流

    ](https://blog.51cto.com/u_17256469/13241475)

    语言模型 LangChain

  • [

    langchain agent代码

    在这篇博文中,我将详细记录解决“LangChain Agent代码”问题的过程,包括背景、抓包方法、报文结构、交互过程、工具链集成以及多协议对比。通过这一详细且精确的复盘,我希望能为愿意探讨 LangChain Agent 与网络协议交互的技术人员提供清晰的思路。## 协议背景LangChain Agent 作为一款强大的工具,其核心目标是简化与外部服务的交互。通过实施标准协议,LangC

    ](https://blog.51cto.com/u_16213412/14000827)

    字段 HTTP ci

  • [

    langchain如何自动执行python代码 | langchain

    在当今的数据科学和人工智能领域,自动化代码生成与执行已成为提升效率与灵活性的重要手段。本文将详细介绍如何使用LangChain中的PythonREPL功能,实现大型语言模型(LLM)生成代码,并自动执行这些代码。通过这一流程,我们能够让大模型生成代码,然后通过代码执行来获取大语言模型通过文本生成本身不能很好完成的任务,特别是一些计算任务。

    ](https://blog.51cto.com/aiweker/13056491)

    语言模型 langchain AIGC

  • [

    LlamaIndex 与 LangChain 代码示例

    特点:聚焦文档索引构建与高效查询,适合快速搭建RAG系统。基础索引与查询(本地LLM)使用Ollama本地部署的LLM和嵌入模型,构建向

    ](https://blog.51cto.com/zhangxueliang/13450464)

    langchain python Azure API 代码示例

  • [

    LangChain介绍及Python代码示例

    LangChain 提供了许多组件和工具,可以帮助开发者轻松地集成和使用这些强大的语言模型。下面是一个简单的 LangC

    ](https://blog.51cto.com/zhangxueliang/11773182)

    python API 语言模型 加载

  • [

    LangChain初探

    LangChain初探

    ](https://blog.51cto.com/u_15775105/6671035)

    sed List 数据库

  • [

    LangChain 学习

    一、LangChain定义什么是LangChainLangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,并集成额外的资源,例如 API 和数据库。LangChain六大主要领域管理和优化pro

    ](https://blog.51cto.com/u_6478076/14012868)

    LangChain

  • [

    LangChain链式处理架构解析与代码优化

    【代码】LangChain链式处理架构解析与代码优化。

    ](https://blog.51cto.com/zhangxueliang/13651536)

    langchain 架构 网络 缓存 本地服务

  • [

    LangChain简介

    LangChain简介

    ](https://blog.51cto.com/u_16520338/10826888)

    开发者 问答系统 数据处理

  • [

    解读LangChain

    随着OpenAI在2020年发布了开创性的GPT-3,我们见证了LLM的普及度稳步攀升,如今还在逐渐升温发酵。这些强大的人工智能模型为链式”不同组件的核心概念,LangChain简…

    ](https://blog.51cto.com/wirelesscom/7808118)

    langchain 数据 语言模型 应用程序

  • [

    langchain LogicFlow

    在这个博文中,我们将深入探讨如何使用“langchain LogicFlow”来强化我们的备份和恢复策略。通过一系列的工具与流程,我们可以有效地确保数据的安全性和可恢复性。本次内容包括备份策略、恢复流程、灾难场景、工具链集成、监控告警和最佳实践。准备好了吗?让我们开始吧!## 备份策略首先,我们需要明确一个高效的备份策略。备份策略的设计包括思维导图和存储架构,以便我们能清晰理解备份的整体框

    ](https://blog.51cto.com/u_16213449/14027588)

    数据 System 工具链

  • [

    langchain架构

    # 学习LangChain架构的第一步LangChain是一个用于构建智能应用程序的框架,特别是在需要自然语言处理(NLP)的场景。 本文将带领你逐步实现一个简单的LangChain架构,帮助你理解整个流程。## 流程概览以下是构建LangChain应用程序的基本步骤:| 步骤 | 描述 ||------|-------------

    ](https://blog.51cto.com/u_16175468/12035846)

    python ci API

  • [

    langchain 代码智能补全

    Kite 是一个著名的 Python 代码补全工具,支持在一些 IDE 上作为插件,帮助开发者提升代码效率。近日,Kite 官方宣布将会增加「Intelligent Snippets」功能。据官方表示,这一工具可以帮助开发者补全复杂的、多字符的代码,而且代码的生成几乎是实时的。Intelligent Snippets 有什么特性Kite 本身就是一种代码补全工具。在版本更新前,它只能按照规

    ](https://blog.51cto.com/u_16099265/14020513)

    langchain 代码智能补全 开发者 补全 代码补全

  • [

    langchain python langchain python doc

    简介LangChain是一个开源的应用开发框架。基于该开源框架,我们可以把大模型与各种工具结合从而实现各种功能,比如基本文档的问答,解析网页内容、查询表格数据等。目前支持Python和TypeScript两种编程语言。当前Python框架支持的模型和功能最全面。Modules按照官方wiki的描述,可以将Langchain的支持的功能划分为以下几个模块。Models该模块主要是集成了多个模型。主要

    ](https://blog.51cto.com/u_16099333/9960461)

    langchain python python langchain langchain应用 openai应用

  • [

    langchain function

    1、什么是函数式编程语言?  函数式编程语言(functional programming language)或称函数程序设计,又称泛函编程,是一种编程典范,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。  函数式编程语言的特征:  (1)以“函数”为首,如同命令式语言中的“变量”,函数可以赋值给

    ](https://blog.51cto.com/u_16213580/13575818)

    langchain function 编程语言 函数式 函数式编程

  • [

    langchain页面

    Landing page也可以称为登陆页(也称着陆页),网站上任何一个接受流量的网页都可以称为landing apge。与普通的网页不同,landing page需要完成不同的使命,它需要把访问者引导到他们需要的网页,landing page并不是目标页,而只是引导访问者到目标页的一个中间页面。如果你租过房子,你可能找过房屋中介,landing page就扮演中介的角色。房屋中介需要了解租房者的需

    ](https://blog.51cto.com/u_16213698/14018293)

    langchain页面 访问者 搜索 搜索引擎

  • [

    langchain 异步

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。GET 还是 POST?与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。然而,在以下情况中,请使用 POST 请求:无法使用缓存文件(更新服务器上的文件或数据库)向服务器发送大量数据(PO

    ](https://blog.51cto.com/u_16099299/14020810)

    langchain 异步 xml 控件 json

  • [

    rust langchain

    Chrome可称宇宙最强浏览器,它的市场份额接近70%,如果把使用Blink内核,基于Chromium的,如,Opera,360,UC,QQ,百度,猎豹等一系列换壳浏览器加上,市场份额估计更高!纯净地Chrome不宜食用,需要佐料。正确的做法,是自己安装扩展(小名叫做插件),满足自己的特殊需求。全地球人都知道,国内无法打开Chrome插件商店。不过,国内有很多下载站,用户可以自行搜索,下载插件,然

    ](https://blog.51cto.com/u_16099209/14018755)

    rust langchain Chrome 安装插件 扩展程序

  • [

    Android 两条动画顺序执行 android组合动画

    补间动画之组合动画 - 介绍顾名思义,就是四种动画(平移动画,旋转动画,缩放动画,渐变动画)一起实现效果,四种动画有着共同的属性,也有各自的特有属性,下面列出来的四种动画的共有属性实现目标:点击按钮后 四种动画(平移动画,旋转动画,缩放动画,渐变动画) 在同一段时间内 一起播放效果动画 - 相关文章篇帧动画帧动画: 补间动画补间动画-平移动画: &nbs

    ](https://blog.51cto.com/u_16213690/14029783)

    Android 两条动画顺序执行 android 补间动画 属性动画

  • [

    虚拟化数据备份知识

    很多网友、读者和关心我们技术的朋友通过各种渠道向我们提出一些问题,首先感谢你们。其次,我们也在考虑在积累了一些问题之后,通过问题汇总的方式告诉给更多的人。下面是我们首期的常见问题汇总栏目,希望对您有用!提问内容答复内容大数据都是什么数据,天天说大数据大数据主要有两个方面:一方面是数量巨大,就是海量数据,另一方面是数据类型复杂,包含非结构化数据。Hadoop 简单的说是做什么的 ?概念是啥 ?简单说

    ](https://blog.51cto.com/u_16213684/14029956)

    虚拟化数据备份知识 大数据 数据库 运维 Data

  • [

    sql server数据库创建日历

    我们已经分别详细了解如何建立数据库,建立表。下面我们来看一下如何表进行基本操作:INSERT、DELETE、UPDATE 在插入操作时必须注意字符型和日期型数据必须要用半角单引号引起来 insert 命令格式1: insert [into] 表名 [(字段名1,字段名2…………)] values (字段值1,字段值2…….) 注意:此命令一次只能插入一条记录 如果省略字段

    ](https://blog.51cto.com/u_16213680/14030018)

    sql server数据库创建日历 数据库 表名 字段名

  • [

    python3 判断是否卡方分布 python做卡方检验

    如果我们想确定两个独立分类数据组的统计显着性,会发生什么?这是卡方检验独立性有用的地方。Chi-Square检验我们将在1994年查看人口普查数据。具体来说,我们对“性别和“每周工作时间”之间的关系感兴趣。在我们的案例中,每个人只能有一个“性别”,且只有一个工作时间类别。为了这个例子,我们将使用pandas将数字列’每周小时’转换为一个分类列。然后我们将’sex’和’hours_per_week_

    ](https://blog.51cto.com/u_16099165/14030916)

    python3 判断是否卡方分布 用python实现卡方检验 卡方检验 ci 数据

  • [

    Unity 设置公钥

    (一)介绍在Unity中有两种区别很大的技术被用于计算全局光照GI或光源反射,它们就是烘焙全局光照(Baked GI)和预计算实时全局光照(Precomputed Realtime GI)。本文主要介绍预计算实时全局光照(PRGI),学习如何使用Unity全局光照计算系统 — Enlighten系统来优化一个场景,让预计算只需要几分钟而非几小时。为什么要使用PRGI当启用PRGI时,光照预计算指的

    ](https://blog.51cto.com/u_16099263/14030919)

    Unity 设置公钥 Unity GI 预计算 贴图 Shell

大模型岗位需求

大模型时代,企业对人才的需求变了,AIGC相关岗位人才难求,薪资持续走高,AI运营薪资平均值约18457元,AI工程师薪资平均值约37336元,大模型算法薪资平均值约39607元。
在这里插入图片描述

掌握大模型技术你还能拥有更多可能性

• 成为一名全栈大模型工程师,包括Prompt,LangChain,LoRA等技术开发、运营、产品等方向全栈工程;

• 能够拥有模型二次训练和微调能力,带领大家完成智能对话、文生图等热门应用;

• 薪资上浮10%-20%,覆盖更多高薪岗位,这是一个高需求、高待遇的热门方向和领域;

• 更优质的项目可以为未来创新创业提供基石。

可能大家都想学习AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把全套AI技术和大模型入门资料、操作变现玩法都打包整理好,希望能够真正帮助到大家。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

零基础入门AI大模型

今天贴心为大家准备好了一系列AI大模型资源,包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

有需要的小伙伴,可以点击下方链接免费领取【保证100%免费

点击领取 《AI大模型&人工智能&入门进阶学习资源包》*

1.学习路线图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果大家想领取完整的学习路线及大模型学习资料包,可以扫下方二维码获取
在这里插入图片描述

👉2.大模型配套视频👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。(篇幅有限,仅展示部分)

img

大模型教程

👉3.大模型经典学习电子书👈

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

img

电子书

👉4.大模型面试题&答案👈

截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(篇幅有限,仅展示部分,公众号内领取)

img

大模型面试

**因篇幅有限,仅展示部分资料,**有需要的小伙伴,可以点击下方链接免费领取【保证100%免费

点击领取 《AI大模型&人工智能&入门进阶学习资源包》

**或扫描下方二维码领取 **

在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐