干货 | 大语言模型插件功能在携程的python实践

python爬虫爬取携程国际机票航班信息,返回json串 # -*- coding: utf-8 -*- import requests, json import hashlib import re # 此处的参数是json 出发三字码,达到三字码,出发时间,成人数,儿童数,婴儿数,三字码请传小写的 def get_index(paramter): # 如果只执行这个脚本,需要将下边这行注释掉,如果放到服务,就打开 # paramt... 阅读详情

作者简介

成学,携程高级安全研发工程师,关注python/golang后端开发、大语言模型等领域。

一、背景

2023年初,科技圈最火爆的话题莫过于大语言模型了,它是一种全新的聊天机器人模型,除了能应对基本的日常聊天外,还能胜任如文案编写、旅游规划等各项工作。

携程信息安全部也紧跟时代步伐,在携程内部推出基于大语言模型的智能聊天机器人,并发布网页版1.0,让所有“程里人”可以便捷无门槛地享受大语言模型带来的便利。在运营半年多后,我们广泛收集了用户的使用感受以及建议,结合当下大语言模型的发展进程,新推出了网页版2.0,相较于1.0版本,简化了页面展示,增加了历史会话保存、自定义对话设置、支持插件、AI绘图等功能。

其中插件功能可以扩展大语言模型的个性化能力,让其如虎添翼,开发者可以根据特定需求定义特定插件供用户使用。目前网页版2.0版本支持10多种插件,如google搜索插件可以对输入的问题进行联网查询;base64插件可以对base64内容进行解密等。那么这些插件是如何实现的呢?让我们一探究竟吧。

二、需求调研

2.1 Function Calling

目前多个大语言模型都推出了Function Calling(函数调用)能力,用于帮助开发者通过 API 方式实现类似于插件的能力。通过Function Calling,我们可以将多个自定义的函数描述连同提出的问题一起传给大语言模型,它会分析这些函数描述与提问内容的相关性,并将最相关的函数及对应的函数传参一起返回,我们再执行函数对应的业务逻辑,即可得到问题的答案。

Function Calling的大体使用流程如下:

7dc2a9cb168f0c911c130b50f7c50338.png

举个例子,我们的问题是“今天上海天气如何”,大语言模型本身不能联网,不知道当前上海的天气信息,但是按照Function Calling的使用步骤,我们可以回答这个问题:

1)我们可以事先在应用服务端定义一个查询天气的函数,函数描述为“查询某时某地的天气情况”,函数传参为“日期”和“地点”,在函数内部编写具体查询天气的代码,如从气象局网站获取对应的天气信息。

2)除此之外,我们还可以定义一些其他自定义的函数,如base65加解密函数、ip信息查询函数等。

3)在调用大语言模型的API时,将这些定义的函数按照api规范连同问题“今天上海天气如何”一起传给模型。

4)通常情况下模型会返回和问题相匹配的函数,即查询天气的函数,同时返回函数传参“今天”和“上海”。

5)根据这个返回内容,我们再实际调用查询天气的函数,获取到天气信息。

6)最后将天气信息返回给用户。

由此可以看出Function Calling(函数调用)的本质就是利用大语言模型的文字分析能力,在提供的一系列函数中,找出能够回答问题的最合适的函数,函数内部的具体逻辑则交给开发者自己实现,而不是大语言模型实现。

再进一步分析可以发现,如果没有Function Calling,其实通过prompt提示我们也可以实现Function Calling的功能,例如prompt类似于“我有一些函数,定义为xxxx,我想知道“今天上海天气如何”,请告诉我用哪个函数可以解答这个问题,并告诉我函数的传参“。当然这个prompt效果并不一定很好,每个人的prompt也不尽相同,那么Function Calling这个功能就应运而生了,针对这种场景进行调优并规范了函数的定义和返回格式,方便了开发者的使用。

2.2 如何实现异步

在定义插件时,有一些插件如ping插件、IP扫描插件等,由于网络耗时或执行本身比较慢,提问后无法立马返回结果,所以需要使用异步的方式,等后台服务执行完成后,再把结果返回给前端。对于这种场景,我们需要主动向前端推送消息,常用的方法就是使用websocket。

WebSocket是从HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道。比如说,服务器可以在任意时刻发送消息给浏览器。它不是一种全新的协议,而是利用了HTTP协议来建立连接,属于应用层协议。

它具有如下优点:

  • 支持双向通信,实时性更强

  • 更好的二进制支持

  • 较少的控制开销。连接创建后,ws客户端、服务端进行数据交换时,协议控制的数据包头部较小。在不包含头部的情况下,服务端到客户端的包头只有2~10字节(取决于数据包长度),客户端到服务端的的话,需要加上额外的4字节的掩码。而HTTP协议每次通信都需要携带完整的头部

  • 支持扩展。ws协议定义了扩展,用户可以扩展协议,或者实现自定义的子协议(比如支持自定义压缩算法等)

除了websocket,我们还可以选择使用socketIO。Socket.IO也可以实现客户端和服务段之间双向通信。但与websocket不同的是,socketIO是一个第三方库,他具有websocket的基本功能,同时也增强了一些的功能。比如:

  • 兼容性:WebSocket是HTML5标准中的一部分,需要浏览器支持HTML5才能使用,而Socket.IO是基于WebSocket协议的封装,可以在不支持WebSocket的浏览器上使用

  • API:WebSocket只提供了底层的API,需要开发者自己实现消息的编解码、心跳等功能,而Socket.IO提供了更高层次的API,封装了消息的编解码、心跳等功能,使用更加方便

  • 处理异常:WebSocket在连接异常时会直接断开连接,而Socket.IO的心跳机制会尝试重新连接,提高了连接的稳定性

  • 支持的协议:WebSocket只支持单一的协议,而Socket.IO支持多种协议,包括WebSocket、Flash Socket、AJAX长轮询等

  • HTTP 长轮询回退:如果无法建立 WebSocket 连接,连接将回退到 HTTP 长轮询

但需要强调的是:Socket.IO与WebSocket并不能兼容,尽管 Socket.IO 确实在可能的情况下使用 WebSocket 进行传输,但它为每个数据包添加了额外的元数据。因此WebSocket客户端将无法成功连接到Socket.IO服务器,而Socket.IO客户端也将无法连接到普通WebSocket服务器。

socketIO服务连接时,可以在f12中看到连接的过程:

c9ed16dae502ffc9007e8a9a61d4785d.png

总共分为5步:

1)客户端发起握手请求(GET),服务端返回本次连接的前置基础信息

{
      "sid": "FSDjX-WRwSA4zTZMALqx",  // 会话的ID,它必须包含在后续所有HTTP请求的查询参数中
      "upgrades": ["websocket"],  // 数组包含服务器支持的所有“更好”传输的列表
      "pingInterval": 25000,  // 心跳检测时间,25秒
      "pingTimeout": 20000  // # 心跳超时时间,20秒
  }

2)客户端带上sid(POST),长轮询,发送连接请求

3)客户端带上sid(GET),长轮询,获取连接确认

4)升级建立WebSocket连接,响应码为101,且一直处于连接状态

5)客户端接收数据 (GET),长轮询,WebSocket连接建立成功后关闭

三、 基本实现

以下实现案例基于国内开源大语言模型ChatGLM3,ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的对话预训练模型。

3.1 定义各种插件

根据ChatGLM3模型的插件规范,定义插件的相关信息,这里举2个例子,google搜索(同步插件)、ping(异步插件)。

all_plugins = {
    "google": {
        "name_cn": "谷歌搜索",  # 中文名称
        "sync": True,  # 是否同步执行
        "message": "{result}",  # 返回给用户的消息
        # info内容为符合ChatGLM3 function call规范的函数定义
        "info": {
            "name": "google",  # 函数名
            "description": "当问题需要进行实时搜索(如今天的日期或者今天的天气等)时, 或者无法回答时, 使用 google 搜索",  # 函数描述
            "parameters": {
                "type": "object",
                "properties": {
                    "keyword": {  # 传参参数名
                        "type": "string",  # 参数数据类型
                        "description": "搜索的关键词"  # 参数描述
                    }
                },
                "required": ["keyword"]  # 必填参数
            }
        }
    },
    "ping": {
        "name_cn": "ping",
        "sync": False,
        "message": "使用ping插件,由于该任务执行时间比较长,完成后我会主动将结果发送给您。请耐心等待。如果您有其他问题,可以继续提问。",
        "info": {
            "name": "ping",
            "description": "使用ping工具对IP地址进行ping测试",
            "parameters": {
                "type": "object",
                "properties": {
                    "addr": {
                        "type": "string",
                        "description": "被ping的ip或者域名"
                    }
                },
                "required": ["addr"]
            }
        }
    }
}

定义插件对应的函数实现:

class Functions:
    @classmethod
    def ping(cls, **kwargs):
        """ping实现"""
        # 省略ping的代码实现
        pass


    @classmethod
    def google(cls, **kwargs):
        """google搜索实现"""
        # 查询关键字
        keyword = kwargs['keyword']
        # 搜索结果
        search_context = []
        # 使用google api搜索
        res = server['service'].cse().list(q=keyword, cx=server['cx'], ).execute()
        # 遍历搜索结果
        for row in res.get('items', []):
            # 提取每条搜索结果的简要信息
            search_context.append(row['snippet'])
        # 汇总搜索结果和问题组成prompt
        prompt = [{"role": "user", "content": f"请结合以下内容,回答问题:{keyword}\n" + "\n".join(search_context)}]
        # 调用大语言模型生成答案
        return reply_text(prompt)

3.2 使用Function Calling实现插件功能

大体逻辑为:将插件信息和用户提问一起发送给大语言模型的api,得到与之匹配的插件,再调用插件对应的函数,得到结果返回给用户。以下代码为简化的ChatGLM3示例代码:

import torch
from transformers import AutoTokenizer, AutoModel


def main():
    """使用插件时回复文字"""
    DEVICE = 'cuda' if torch.cuda.is_available() else 'cpu'
    tokenizer = AutoTokenizer.from_pretrained('/home/chatglm3-6b', trust_remote_code=True)
    model = AutoModel.from_pretrained('/home/chatglm3-6b', trust_remote_code=True).to(DEVICE).eval()
    # 汇总所有的插件信息
    tools = [plugin['info'] for plugin in all_plugins.values()]
    # 将插件信息设置在对话历史中
    history = [{"role": "system", "content": "Answer the following questions as best as you can. You have access to the following tools:", "tools": tools}]
    # 调用function calling
    response, _ = model.chat(tokenizer, query, history=history)
    # 获取匹配的插件名称
    plugin_name = response.get("name", "")
    # 获取匹配的插件参数
    arguments = response.get("parameters", {})
    # 没有匹配到插件则退出
    if not plugin_name:
        return None
    # 获取插件完整信息
    plugin = all_plugins[plugin_name]
    # 使用反射机制获取插件对应的函数对象
    func = getattr(Functions, plugin_name)
    # 执行函数并返回结果
    res = func(**arguments)
    return res

3.3 异步插件的实现

本项目web后端使用的框架为flask,使用socketIO实现异步交互,需要安装对应的库:flask_socketio,启动时,在flask的app上使用SocketIO包装一下即可,这样在同一个端口上同时开启了http服务和socketIO服务,下面只展示基本关键代码:

from flask import Flask
from flask_socketio import SocketIO


# flask原始 app
web_app = Flask(__name__, static_folder=Config.STATIC_PATH)


# socketIO包装app
socketio = SocketIO(web_app, cors_allowed_origins="*", logger=True)


# 可监听连接和断开
@socketio.on('connect')
def handle_connect():
    print("connect")


@socketio.on('disconnect')
def handle_disconnect():
    print("disconnect")


# 本地启动app
if __name__ == '__main__':
    socketio.run(web_app, address, port, allow_unsafe_werkzeug=True)

在socketIO中调用emit(event, *args, **kwargs)方法即可给指定目标(event,本项目对应为user)发送消息。

我们通过function calling获取到对应插件时,如果是同步插件,则立即执行对应函数,如果是异步插件,应该异步开启执行对应函数,并立马结束当前会话,等异步函数执行完成后主动发送消息给前端用户,因此我们需要修改一下上面的插件代码:

def main(user, question):
    """使用插件时回复文字"""
    ...代码同上
    # 使用反射机制获取插件对应的函数对象
    func = getattr(Functions, plugin_name)
    # 判断插件是否同步
    if plugin['sync']:
        # 同步的插件,直接调用函数
        res = func(**arguments)
    else:
        # 异步的插件,这里使用线程池示例执行异步任务
        thread_pool = ThreadPool(3)
        
        # 定义回调函数, 接收到结果后推送给前端
        def callback(result):
            # 推送给前端
            socketio.emit(user, f"任务结果为: {result}")


        # 异步调用
        res = thread_pool.apply_async(func, kwds=arguments, callback=callback)
    return res

四、 未来规划

4.1 更多的插件

上述插件案例只是插件功能的冰山一角,通过该功能我们可以定义各种实用的插件,目前携程信息安全部的大语言模型智能聊天机器人只是支持一些基本的插件,也欢迎大家给我们提出宝贵的建议,集思广益,一起开发出更多实用好用的插件。

4.2 每个用户的自定义插件

目前的插件功能可以支持我们这些项目的开发者实现自定义插件,这些插件也必须提前写入项目中,并不能支持终端用户直接自定义自己的插件。后续我们会调研可行性方案,让终端的用户自己编写对应的插件代码,实现每个用户都能定义自己的插件。

加入我们:携程信息安全团队目前有岗位开放,欢迎点击下方链接了解详情。

【推荐阅读】


d3ac93d5923231eb332d993dc541e4cb.jpeg

 “携程技术”公众号

  分享,交流,成长

别再只看pLDDT了!AlphaFold预测结果解读保姆级指南:pLDDT、PAE、pTM、ipTM到底怎么看? 本文详细解析了AlphaFold预测结果中的关键指标pLDDT、PAE、pTM和ipTM,帮助用户从单一依赖pLDDT进阶到全面理解蛋白质结构预测。通过实际案例和技巧,指导如何正确解读这些指标,避免常见错误,并提供了从预测到发表的实用建议。 阅读详情

相关推荐

【清华大学软院】15-19年推免试题历年整理

整理的题目为清软预推免机试(外校)硕士机考题目。 年代 题目1 题目2 题目3 2019 质因数分解 二叉搜索树 区间DP(折叠字符串) 2018 日期转换 高精度模拟 区间DP(戳气球) 2017 进制素数 被遗漏的数字 DP(收集苹果) 2016 大数运算 DP DFS 2015 进制素数: http://acm.hdu.edu.cn/showproblem.php?pid=1230 2017年题目(这个是找的最准确的题目): 1题见【链接】 2题见【链接】

云端筑梦师 2254

python 携程航班信息查询

查询页面 携程链接 第一步找到数据怎么来的 发现航班信息在返回 json 的 routeList 里 看传递的参数 然后只要找到token是怎么来的就好了 可以确定token 是由 app.js 生成的,可以看到这个请求只调用过app.js 到 app.js 里去搜索,在可疑的地方打断点 然后回到页面重新搜索航班 调用了p.getProductToken 函数,传递了三个参数 can bjs Oneway ,分别是出发城市 、到达城市、单程。执行下一步 继续执行 后面就不分析了,.

_feiji的博客 2085

【Arc GIS 零基础教学】土地利用类型图的绘制方法

​Hi,我是胡学长!今天教大家怎么利用Arc GIS 绘制土地利用类型图。土地利用类型图是表达土地资源的利用现状、地域差异和分类的专题地图。它是研究土地利用的重要工具和基础资料,同时也是土地利用调查研究的主要成果之一。在编制土地利用图的基础上,对当前利用的合理程度和存在的问题、进一步利用的潜力、合理利用的方向和途径,进行综合分析和评价。因此,土地利用图是调整土地利用结构,因地制宜进行农业、工矿业和交通布局、城镇建设、区域规划、国土整治、农业区划等的一项重要科学依据。......

一起来交流学习吧 1万+

【干货来袭】使用 Python 扩展 UiBot 的功能

前言: UiBot 除了自带的强大功能外,还允许有编程经验的开发人员对功能进行自由扩展,目前 UiBot 支持以下四种扩展方式: Python 插件、Lua 插件、Lua Mod 插件、COM 插件( .Net 也使用这种方式扩展) 本期教程将为大家讲解如何利用这四种扩展方式扩充 UiB...

chengvip0000的博客 1437

别再瞎改注册表了!实测Win10/Win11远程桌面60帧的正确姿势(附ToDesk对比)

本文深入解析Windows远程桌面60帧优化的科学方法,揭示常见误区并提供实测有效的解决方案。从版本差异到硬件加速,再到第三方工具对比(如ToDesk),帮助用户避开无效的注册表修改,实现流畅的远程桌面体验。

weixin_33738555的博客 341

Unity 面试篇|(三)设计模式篇 【全面总结 | 持续更新 | 建议收藏】

设计模式是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的总结。设计模式与方法或库的使用方式不同, 你很难直接在自己的程序中套用某个设计模式。模式并不是一段特定的代码, 而是解决特定问题的一般性概念。你可以根据模式来实现符合自己程序实际所需的解决方案。常常会混淆模式和算法, 因为两者在概念上都是已知特定问题的典型解决方案。但算法总是明确定义达成特定目标所需的一系列步骤, 而模式则是对解决方案的更高层次描述。同一模式在两个不同程序中的实现代码可能会不一样。单例模式。

游戏开发小Y的博客 12万+

在 Python 中如何设计插件化系统?

pluggy 是从 pytest 中演化出来的一个插件工具。它为 pytest 提供外围插件支持,当开发人员需要扩展 pytest 的功能时,基于 pytest 的规范做出对应的插件然后将其安装到环境中后, pytest 就可以自动识别已有插件。其具体原理是通过创建一个 hookspec = pluggy.HookspecMarker("eggsample") 来标记插件事先的规范,然后使用 hookimpl = pluggy.HookimplMarker("eggsample") 标记 插件的实现。

software_test010的博客 1068

Python爬取上市公司年报并进行财务比率分析:基于异步爬虫与数据挖掘的实战

在当今数据驱动的投资时代,获取并分析上市公司财务数据对于投资者、分析师和研究人员至关重要。中国证监会指定的上市公司信息披露网站——巨潮资讯网,包含了所有A股上市公司的年报、季报及其他公告信息。本项目将展示如何使用Python最新技术栈爬取巨潮网的年报数据,提取关键财务指标,并进行深入的财务比率分析。本文将采用异步爬虫技术提高数据采集效率,使用现代解析库处理PDF和HTML文档,并结合pandas进行数据分析和可视化。整个过程将遵循合规合法的爬虫伦理,尊重网站robots.txt协议,设置合理的请求间隔。

2201_76125261的博客 666

分享5个插件,助你在Python的道路越战越勇

你所不知道的编程插件,看完直呼内行

龙叔的博客 1万+

数据挖掘实战-基于决策树算法构建北京市空气质量预测模型

通过分析这些数据,我们将利用决策树算法建立预测模型。决策树算法具有直观易懂、分类效果好等优点,适合用于此类预测问题。我们将采用适当的方法对模型进行训练和优化,以提高预测精度。最终,我们将评估模型的预测效果,并探讨其在实际应用中的可行性和潜在价值。希望通过本实验,能为北京市的空气质量改善工作提供一定的支持。通过基于决策树算法构建的北京市空气质量预测模型的实验研究,我们在多方面取得了显著的进展。首先,我们成功地整合了来自气象、环保、交通等多个领域的大量数据,形成了一个全面而综合的空气质量分析框架。

m0_64336780的博客 2万+

Android 14.0 系统开机屏幕设置默认横屏显示

在14.0的系统ROM产品定制化开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从 两部分来实现,一部分是系统开机动画横屏显示,另一部分是系统屏幕显示横屏显示,从这两方面就可以做到开机默认横屏显示了

安卓兼职framework和app工程师的博客 2150

【干货分享】推荐6个好用到爆的Pycharm插件

相信对于不少的Python程序员们都是用Pycharm作为开发时候的IDE来使用的,今天小编来分享几个好用到爆的Pycharm插件,在安装上之后,你的编程效率、工作效率都能够得到极大地提升...

weixin_43373042的博客 1964

控制算法研发工程师(博士)职位深度解析与面试指南

摘要:广东万和新电气股份有限公司招聘控制算法研发工程师(博士),工作地点佛山顺德。职位要求2026届博士学历,电子信息工程或控制科学与工程专业。主要职责包括:1)燃气热水、热泵等系统的电控软件设计与优化;2)开发PID、模糊控制、ADRC、MPC等智能算法,应用于恒温控制、变频调节等场景。重点考察算法研发能力、系统稳定性优化及嵌入式实现经验。该职位提供三年资深工程师培养计划,需具备扎实的控制理论基础和工程实践能力,能够处理非线性系统、多工况自适应等复杂控制问题。

郑伟强dev的专栏 139

python | pluginbase,一个神奇的 关于插件框架 的Python 库!

pluginbase库是一个功能强大且易于使用的插件框架,能够帮助开发者高效地构建和管理插件系统。通过支持简单易用的API、动态加载和卸载插件、模块隔离和自动发现插件,pluginbase库能够满足各种插件系统的需求。本文详细介绍了pluginbase库的安装方法、主要特性、基本和高级功能,以及实际应用场景。希望本文能帮助大家全面掌握pluginbase库的使用,并在实际项目中发挥其优势。无论是在Web应用、数据处理还是游戏开发中,pluginbase库都将是一个得力的工具。

csdn_xmj的博客 1325

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IntelliJ IDEA必备7款Python插件

提起Python IDE,很多同学首先都会想到PyCharm,毋庸置疑,PyCharm针对Python和Django很好的支持,已经在项目管理方面的强大之处,使得成为一款非常优秀的IDE,也受到很多专业开发人员的青睐。 而今天要介绍的是利用与PyCharm出自同一家的Intellij IDEA作为Python开发工具。 Intellij IDEA的主要优点在于,它全面的支持Jython各种功能,例如,跨语言导航、补全、重构。而PyCharm对Jython的支持就相对弱很多。 除此之外,IDEA能够适用

jakpopc的博客 4728

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

8个有用的Pytest插件助力Python自动化测试

当测试用例变得复杂,或者需要处理大量测试数据时,插件通过使测试更加简洁和结构化而变得非常有用。Python凭借其简洁性和多功能性,成为自动化测试的热门选择,而pytest是最广泛使用的测试框架之一。虽然pytest本身功能强大,但通过插件可以充分发挥其真正潜力。

人生不怕起点低,就怕没追求 1419

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Python汉化插件下载不了,python汉化插件不能下载

大家好,小编来为大家解答以下问题,Python汉化插件下载不了,python汉化插件不能下载,今天让我们一起来看看吧!首先我们要知道pycharm是一款非常强大的python集成开发环境,带有一整套python开发工具,今天龙叔给大家分享五个非常好用的插件,助你在Python的学习的道路上越战越勇该篇内容全都是干货,系好安全带准备发车!

gk12336的博客 1016

【Python】Blender插件开发教程:在Blender中扩展GLTF导出功能,支持自定义数据字段(GLTF Extensions完整实现+Python源码分享)

本教程详细讲解如何在Blender中开发一个支持自定义扩展字段的GLTF导出插件。通过弹窗界面,用户可以便捷地为GLTF文件添加自定义的扩展数据。文章涵盖了从属性定义、界面布局到导出与文件处理的完整流程,适合有一定Blender插件开发基础、希望扩展GLTF功能的开发者参考使用。

一个XR(AR|VR|MR)程序猿的博客(EQ-雪梨蛋花汤) 2235

用 VS Code 写 Python,这几个插件是必装的

点击上方蓝色小字,关注“涛哥聊Python”重磅干货,第一时间送达来源:Python数据科学大家好,我是涛哥,今天给大家分享一波VS Code里几个必装插件。如果你是初学小白,建议全部...

涛哥聊Python 2020

Cursor插件开发实战:为Python项目添加AST分析功能

抽象语法树(AST)是理解与改造代码结构的核心技术基础,其原理在于将源代码解析为可编程操作的树状节点模型,具备高精度、低侵入、强可控的技术价值。在IDE智能化、代码质量管控、自动化重构等工程场景中,AST分析已成为提升研发效能的关键能力。本文基于Cursor这一面向AI编程的工作流平台,结合Python语言特性,详解如何开发自定义插件实现AST遍历、节点匹配与语义增强,涵盖AST生成原理、Visitor模式实践、插件调试技巧及真实项目避坑经验,助力开发者构建可复用、可验证、可落地的智能编码辅助能力。

weixin_30632883的博客 336

2021 年 VS Code 必备 Python 插件!

点击上方蓝色小字,关注“涛哥聊Python”重磅干货,第一时间送达来源:Python数据科学空余时间整理了2021年里我认为Python 编程必备的几个 VS Code 插件,分享一下。...

涛哥聊Python 4579

c4d python 插件_【影视后期必知干货!C4D插件的安装及类型合集】- 环球网校

【摘要】我不知道C4d什么时候开始流行,要想玩好C4d,各种C4D插件的安装是必不可少的。C4d软件制作的各种酷炫视觉效果层出不穷,吸引着人们的眼球。作为一个设计师,我们当然应该跟上设计的潮流。本篇文章将讲述影视后期必知干货!C4D插件的安装及类型合集。1.SignalSignal是GSG公司生产的C4d程序动画插件。它不需要关键帧。它可以使用标签轻松控制材质、变形器、运动图形、动力学、PSR等的...

weixin_39623050的博客 818

62篇干货助你从不会到上手python

2020年悄然接近尾声,从2020年6月份开始运营公众账号,东拼西凑的写来近200篇文章,今天挑出其中的python内容分享给大家感谢大家的陪伴,我也在慢慢成长,你也要加油哟!不要轻...

bigzql的博客 1万+

微软 VS Code 重大更新!Jupyter 插件不再是 Python 专属

点击上方蓝色小字,关注“涛哥聊Python”重磅干货,第一时间送达来源:Python中文社区微软团队宣布已发布2020年11月版的Visual Studio Code Python 集成...

涛哥聊Python 1210

金蝶云星空Python插件入门讲解-学习课程大纲总览(含配套视频讲解课程)

本文介绍了Python插件开发入门到进阶的学习大纲,针对金蝶云星空系统。内容包括插件基础、数据结构剖析、后台表逻辑、表单及列表插件开发、操作服务插件、账表服务插件、单据转换插件等,并提供配套视频课程、详细代码和操作讲解,以及高价值的复用案例,帮助读者快速上手和实践。文末提供私信作者获取更多资源和支持的途径。

2403_86963469的博客 2203

vscode代码规范插件_超强大!没有这 24 款插件的 VScode 是没有灵魂的!

关注 @Python与数据挖掘 ,更多有用、有趣的技术干货等着你来发现Python 代码编辑器有很多,比如Pycharm、Jupyter Notebook、Spyder、Komodo Edit等等,我一直都比较喜欢使用 Jupyter Notebook,VScode 并没有太多的关注。国庆假期抽出了一些时间研究了一下,发现 VScode 真的很强大,绝不仅仅是一款语言编辑器!VScode 特点鲜明...

weixin_39700394的博客 6375
上一篇: 开源 | 从 SQLlin 的更新看 Kotlin Multiplatform 技术更迭
下一篇: 2023携程研发代码报告
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值