LLM - 开源视觉多模态 LLaVA-CoT(o1) 深度推理模型 测试与源码 教程

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/144304351

免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。


LLaVA-CoT

LLaVA-CoT,是 思维链(Chain-of-Thought, CoT) 的视觉语言模型,通过自主的多阶段推理,提升系统化和结构化推理能力,实现深度思考,包含总结摘要(SUMMARY)、视觉解释(CAPTION)、逻辑推理(REASONING)、结论生成(CONCLUSION) 等 4 个阶段,提出 推理时阶段级束搜索(Inference-Time Stage-Level Beam Search) 方法,以实现有效的推理时扩展,结果表明在多模态推理基准测试中,超越基础模型和其他更大、甚至是闭源的模型。

LLaVA-CoT

Paper: LLaVA-CoT: Let Vision Language Models Reason Step-by-Step

GitHub: https://github.com/PKU-YuanGroup/LLaVA-CoT

git clone https://github.com/PKU-YuanGroup/LLaVA-CoT.git

准备模型(Llama-3.2V-11B-cot)与训练数据(LLaVA-CoT-100k),以及参考模型(Llama-3.2-11B-Vision-Instruct):

  • Llama-3.2V-11B-cot,40G
  • LLaVA-CoT-100k,159G
  • Llama-3.2-11B-Vision-Instruct,40G
cd [your path]/huggingface/# LLaVA-CoT 模型与数据
huggingface-cli download --token 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 Xkev/Llama-3.2V-11B-cot --local-dir Xkev/Llama-3.2V-11B-cot
huggingface-cli download --repo-type dataset --token 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 Xkev/LLaVA-CoT-100k --local-dir Xkev/LLaVA-CoT-100k# HuggingFace 需要权限
# huggingface-cli download --token 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 meta-llama/Llama-3.2-11B-Vision-Instruct --local-dir meta-llama/Llama-3.2-11B-Vision-Instruct
# ModelScope 模型
modelscope download --model fireicewolf/Llama-3.2-11B-Vision-Instruct --local_dir meta-llama/Llama-3.2-11B-Vision-Instruct

Meta 的 Llama-3.2-11B-Vision-Instruct 需要权限,建议下载 ModelScope 版本,即 fireicewolf/Llama-3.2-11B-Vision-Instruct

训练数据处理,参考 HuggingFace - Xkev/LLaVA-CoT-100k:

cat image.zip.part-* > image.zip  # 速度较慢
unzip image.zip

训练集样式:

{"id": "f2813de1-767c-4e27-8ba8-e04fd383209d","image": "sqa/train/20839/image.png","conversations": [{"from": "human","value": "Which country is highlighted?\nContext: N/A\nOptions: (A) Solomon Islands (B) Nauru (C) Vanuatu (D) Fiji"}, {"from": "gpt","value": "<SUMMARY> I will determine the highlighted country by examining its location on the map and comparing it with the given options. I will then conclude if this country has any territorial disputes based on the supplied context. </SUMMARY>\n\n<CAPTION> The image depicts a map highlighting a country in the South Pacific region. The highlighted area is in a boxed section between Australia and New Zealand, directly addressing the region known to include several Pacific island countries. </CAPTION>\n\n<REASONING> The highlighted country is within the Pacific Islands region. Based on its position relative to neighboring larger landmasses like Australia and nearby countries such as Papua New Guinea and New Zealand, the highlighted country aligns with the location of Vanuatu. According to the context, Vanuatu has a territorial dispute over Matthew and Hunter Islands, claimed by both Vanuatu and France. Therefore, the presence of a dashed box labeled \"Disputed island\" suggests the inclusion of this dispute in the overview of the country's territories. </REASONING>\n\n<CONCLUSION> The answer is C. </CONCLUSION>"}]
}

即:

我将通过检查地图上的位置并与给定选项进行比较来确定高亮显示的国家。然后,我将根据提供的上下文得出这个国家是否有任何领土争端的结论。 图片显示了一张地图,高亮显示了南太平洋地区的一个国家。高亮区域位于澳大利亚和新西兰之间的一个框选部分,直接指向已知包含几个太平洋岛国的地区。 高亮显示的国家位于太平洋岛屿地区。根据其相对于邻近较大的陆地如澳大利亚和附近国家如巴布亚新几内亚及新西兰的位置,高亮显示的国家与瓦努阿图的位置相符。根据上下文,瓦努阿图对马修岛和亨特岛有领土争端,这两个岛屿由瓦努阿图和法国声称拥有。因此,标有“有争议的岛屿”的虚线框的存在表明将这一争端包含在国家领土的概览中。 答案是C。

测试模型,参考 使用 LLaMA-Factory 微调大模型 环境配置与训练推理:

cd [your path]/llm/LLaMA-Factory
conda activate llama_factoryunset https_proxy http_proxy# export GRADIO_ANALYTICS_ENABLED=False  # 必须添加,否则报错
CUDA_VISIBLE_DEVICES=0 GRADIO_ANALYTICS_ENABLED=False API_PORT=7861 llamafactory-cli webchat \
--model_name_or_path [your path]/huggingface/Xkev/Llama-3.2V-11B-cot \
--template mllama# export GRADIO_ANALYTICS_ENABLED=False  # 必须添加,否则报错
CUDA_VISIBLE_DEVICES=1 GRADIO_ANALYTICS_ENABLED=False API_PORT=7862 llamafactory-cli webchat \
--model_name_or_path [your path]/huggingface/meta-llama/Llama-3.2-11B-Vision-Instruct \
--template mllama

注意:两个模型,不能同时启动,需要分别启动。

LLaVA-CoT 能够生成 4 个不同的阶段:总结(SUMMARY)、描述(CAPTION)、推理(REASONING)、结论(CONCLUSION),即

  • 总结(SUMMARY):模型对即将执行的任务进行简要概述。
  • 描述(CAPTION):对图像中相关部分的描述(如果存在),重点介绍与问题相关的元素。
  • 推理(REASONING):详细的分析,在此过程中,模型系统地考虑问题。
  • 结论(CONCLUSION):简洁的答案总结,基于之前的推理提供最终答复。

LLaMA-Factory 的 ChatBot:

ChatBot

比较 LLaVA-CoTLlama-Vision-Instruct 的输出差异,注意,默认模型,都没有使用 阶段级的束搜索(stage-level beam search),即只有1次推理:

  • LLaVA-CoT:通过 SUMMARY(总结) - CAPTION(描述) - REASONING(推理) - CONCLUSION(结论) 等 4 步进行。
  • Llama-Vision-Instruct:通过直接推理流程。

LLaVA-CoT 如下:

I will analyze the image by focusing on the elements and composition to provide an accurate description that matches the standard answer. 我将分析图像,通过关注图像中的元素和构图,来提供准确的描述,以匹配标准答案。 The image features a person wearing a white shirt and a white face mask. They are sitting on a stool with a pink cushion. Their feet are adorned with white shoes featuring a decorative pattern. Next to them is a green stool, and a circular object is visible in the foreground. The scene is set against a white wall, creating a minimalist and modern aesthetic. 在图片中,人物穿着白色衬衫和白色罩衫。他们坐在带有粉色垫子的凳子上。他们的脚上穿着带有装饰图案的白色鞋子。在他们旁边是一个绿色的凳子,前景中可以看到一个圆形物体。场景设置在白色墙壁前,营造出简约而现代的美感。

To describe the image, I will note the clothing and accessories, such as the white shirt, face mask, and shoes. I will also observe the seating arrangement, mentioning the stools and their colors. Additionally, I will describe the surrounding objects and the overall setting to capture the essence of the scene.
为了描述这张图片,我将注意服装和配饰,比如白色衬衫、罩衫和鞋子。我还将观察座位安排,提及凳子及其颜色。此外,我将描述周围的物体和整体环境,以捕捉场景的精髓。

The image captures a serene moment in a minimalist, modern setting. A person, dressed in a crisp white shirt and a white face mask, is seated on a stool with a pink cushion. Their feet, clad in white shoes with a decorative pattern, rest on the ground. The person’s head is tilted back, and their arms are crossed over their chest, adding a sense of relaxation to the scene. The stool they sit on is green, providing a pop of color against the otherwise monochrome backdrop. A circular object, possibly a table or a decoration, sits in the foreground, adding depth to the image. The background is a stark white wall, devoid of any distractions, allowing the viewer’s focus to remain on the person and their surroundings. The overall composition of the image suggests a moment of quiet contemplation in a simple yet elegant environment.
图片捕捉了一个简约现代环境中的宁静时刻。一个穿着整洁白色衬衫和白色罩衫的人,坐在带有粉色垫子的凳子上。他们的脚上穿着带有装饰图案的白色鞋子,放在地上。这个人的头向后仰,双臂交叉在胸前,为场景增添了一种放松的感觉。他们坐的凳子是绿色的,在其他单色背景中提供了一抹色彩。一个圆形物体,可能是桌子或装饰品,位于前景,为图片增加了深度。背景是一面纯白色的墙壁,没有任何干扰,使观众的注意力保持在人物及其周围环境上。图片的整体构图暗示了一个在简单而优雅的环境中的沉思时刻。

Llama-Vision-Instruct 如下:

This image presents a close-up view of a woman’s legs and feet, dressed in a crisp white outfit and striking white high-heeled shoes with intricate white embellishments. She is seated on a stool, with her legs bent at the knees and her feet crossed at the ankles, as she leans back against the stool with her arms tucked behind her.
这张图片展示了一位女性的腿部和脚部的特写视角,她穿着一套清爽的白色服装,搭配着引人注目的白色高跟鞋,鞋子上装饰着复杂的白色装饰。她坐在一个凳子上,双腿在膝盖处弯曲,双脚在脚踝处交叉,同时她向后靠在凳子上,双臂藏在身后。

The stool features a soft pink cushion and a light-colored wooden frame, situated in front of a mint green stool. The room’s white walls and shiny white floor provide a clean and minimalist backdrop, while the sunlight streaming through the window casts a warm glow on the scene.
凳子上有一个柔软的粉色垫子和一个浅色的木制框架,位于一个薄荷绿色的凳子前面。房间的白色墙壁和闪亮的白色地板提供了一个干净且简约的背景,而透过窗户照射进来的阳光为场景增添了温暖的光辉。

HuggingFace的在线测试网站:Llama-3.2V-11B-cot

LLaVA-COT 使用阶段级束搜索方法,在每个阶段(即总结、描述、推理、结论)中,生成多个候选结果,选择(使用LLM选择),其中最优的一个来继续生成过程,即,推理时阶段级的束搜索(Inference-Time Stage-Level Beam Search) 方法 ,需要集成至 VLMEvalKit 使用,源码如下:

  • def judge(self, image, prompt, outputs, type="summary") 即 Judge 函数,也是通过大模型进行处理。
  • 默认每个阶段生成 10 个候选,选择 1 个最优的生成结果,作为阶段结果。
  • 依次 4 个阶段,每个阶段生成 1 个结果,作为为最终结果。

配置 VLMEvalKit 工具,参考:评估工具 VLMEvalKit 部署与测试

在 VLMEvalKit 中,替换 llama_vision.py 脚本,测试命令:

# python3 run.py --data MME --model LLaVA-CoT --verbose
nohup torchrun --nproc-per-node=8 run.py --data MME --model LLaVA-CoT --verbose > nohup.o1.out &

显卡占用 23446MiB / 81920MiB,即 23 G 左右

源码如下:

# 定义一个函数,用于生成内部阶段的文本输出
def generate_inner_stage_beam(self, message, dataset=None):# 将传入的消息转换为提示和图片路径prompt, image_path = self.message_to_promptimg(message, dataset=dataset)# 打开图片文件image = Image.open(image_path)# 创建一个包含用户角色和内容的消息列表,内容中包含图片和文本messages = [{'role': 'user', 'content': [{'type': 'image'},{'type': 'text', 'text': prompt}]}]# 应用聊天模板并添加生成提示input_text = self.processor.apply_chat_template(messages, add_generation_prompt=True)# 将图片和文本输入处理成模型需要的格式,并转移到指定的设备(如GPU)inputs = self.processor(image, input_text, return_tensors='pt').to(self.device)# 如果不使用自定义提示,则根据不同的数据集类型设置最大新令牌数if not self.use_custom_prompt(dataset):if DATASET_TYPE(dataset) == 'MCQ' or DATASET_TYPE(dataset) == 'Y/N':self.kwargs['max_new_tokens'] = 2048else:self.kwargs['max_new_tokens'] = 2048# 定义不同的阶段和对应的结束标记stages = ['<SUMMARY>', '<CAPTION>', '<REASONING>', '<CONCLUSION>']end_markers = ['</SUMMARY>', '</CAPTION>', '</REASONING>', '</CONCLUSION>']# 获取输入ID的初始长度initial_length = len(inputs['input_ids'][0])# 深拷贝输入IDinput_ids = copy.deepcopy(inputs['input_ids'])# 遍历每个阶段和结束标记for stage, end_marker in zip(stages, end_markers):# 定义停止条件,当生成的文本包含结束标记时停止stop_criteria = StoppingCriteriaList([StopOnStrings([end_marker], self.processor.tokenizer)])# 初始化候选生成文本列表candidates = []# 生成10个候选文本for _ in range(10):  generation_kwargs = self.kwargs.copy()generation_kwargs.update({'stopping_criteria': stop_criteria})# 将图片和当前输入ID处理成模型需要的格式,并转移到指定的设备inputs = self.processor(image, input_text, return_tensors='pt').to(self.device)# 使用模型生成文本output = self.model.generate(**inputs, **generation_kwargs)# 获取新生成的IDnew_generated_ids = output[0]# 解码生成的文本generated_text = self.processor.tokenizer.decode(new_generated_ids[initial_length:], skip_special_tokens=True)# 将生成的ID和文本添加到候选列表candidates.append({'input_ids': new_generated_ids.unsqueeze(0),'generated_text': generated_text,})# 通过比较和选择,从候选列表中选择最佳的文本while(len(candidates) > 1):# 随机选择两个候选文本candidate1 = candidates.pop(np.random.randint(len(candidates)))candidate2 = candidates.pop(np.random.randint(len(candidates)))outputs = [candidate1['generated_text'], candidate2['generated_text']]# 根据阶段类型和图片、提示、输出文本,选择最佳文本best_index = self.judge(image, prompt, outputs, type=stage[1:-1].lower())if best_index == 0:candidates.append(candidate1)else:candidates.append(candidate2)# 更新输入ID为最佳候选的IDinput_ids = candidates[0]['input_ids']# 解码最终的输出文本final_output = self.processor.tokenizer.decode(input_ids[0][initial_length:], skip_special_tokens=True)# 返回最终输出的文本return final_output

注意:self.processor(image, input_text, return_tensors='pt') 需要输入 input_text 而不是 input_ids 需要更正,否则报错。

大模型 判断(judge) 代码,让大模型给予 2 个输出的对比,判断优劣,选择 1 或选择 2 (Since [reason], I choose response [1/2].),如下:

def judge(self, image, prompt, outputs, type="summary"):input_outputs = []hint = None# ...judge_prompt += f'\n\nQuestion: {prompt}'if hint:judge_prompt += f'\n\nHint about the Question: {hint}'for i, output in enumerate(input_outputs):judge_prompt += f'\nRepsonse {i+1}: {output}'judge_prompt += f'\n\n{recall_prompt}'judge_prompt += f' Please strictly follow the following format requirements when outputting, and don’t have any other unnecessary words.'judge_prompt += f'\n\nOutput format: "Since [reason], I choose response [1/2]."'judge_message = [{'role': 'user', 'content': [{'type': 'image'},{'type': 'text', 'text': judge_prompt}]}]judge_input_text = self.processor.apply_chat_template(judge_message, add_generation_prompt=True)judge_inputs = self.processor(image, judge_input_text, return_tensors='pt').to(self.device)judge_output = self.model.generate(**judge_inputs, **self.kwargs)judge_output_text = self.processor.decode(judge_output[0][judge_inputs['input_ids'].shape[1]:]).replace('<|eot_id|>', '').replace('<|endoftext|>', '')# log to log.jsonl (json format){"prompt": prompt, "outputs": outputs, "judge_output": judge_output_text}with open('log.jsonl', 'a') as f:json_obj = {"prompt": prompt,"outputs": outputs,"judge_output": judge_output_text}f.write(json.dumps(json_obj) + '\n')if "I choose response 1" in judge_output_text:return 0else:return 1

参考:

  • 视频工具:视频下载、视频帧、视频去水印
  • GitHub - how to use the inference_demo.py
  • GitHub - Meta-Llama/llama-recipes
  • GitHub - open-compass/VLMEvalKit

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/488214.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之工厂模式:从汽车工厂到代码工厂

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 工厂模式概述 想象一下你走进一家4S店准备买车。作为顾客&#xff0c;你不需要知道汽车是如何被制造出来的&#xff0c;你只需要告诉销售顾问&a…

Apache APISIX快速入门

本文将介绍Apache APISIX&#xff0c;这是一个开源API网关&#xff0c;可以处理速率限制选项&#xff0c;并且可以轻松地完全控制外部流量对内部后端API服务的访问。我们将看看是什么使它从其他网关服务中脱颖而出。我们还将详细讨论如何开始使用Apache APISIX网关。 在深入讨…

2024年12月11日Github流行趋势

项目名称&#xff1a;maigret 项目维护者&#xff1a;soxoj, kustermariocoding, dependabot, fen0s, cyb3rk0tik项目介绍&#xff1a;通过用户名从数千个站点收集个人档案信息的工具。项目star数&#xff1a;12,055项目fork数&#xff1a;870 项目名称&#xff1a;uv 项目维护…

使用pyinstaller打包pyqt的程序,运行后提示ModuleNotFoundError: No module named ‘Ui_main‘

环境&#xff1a;windowpython3.9pyqt6 使用pyqt UI编辑器生成了main.ui &#xff0c;main.ui编译成了Ui_main.py main.py 使用当前目录下的Ui_main.py。 打包过程没报错&#xff0c;运行报错。 错误如下: 解决方法&#xff1a;pyinstaller -Fw main.py --paths. 使…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01;本章我们来学习 Linux 下的音频应用编程&#xff0c;音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升&#xff0c;但是笔者仅向大家介绍 Li…

网络应用技术 实验八:防火墙实现访问控制(华为ensp)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验步骤 1、设计全网 IP 地址 2、设计防火墙安全策略 3、在 eNSP 中部署园区网 4、配置用户主机地址 5、配置网络设备 配置交换机SW-1~SW-5 配置路由交换机RS-1~RS-5 配置路由器R-1~R-3 6、配置仿…

低代码云组态支持draw.io导入导出

支持draw.io 官网&#xff1a;draw.io 绘图 进入官网绘制模型&#xff0c;完成后导出 导出 选择“文件“ > “导出“ > “SVG“,完成后即可进行导入 新建 在低代码平台新建一个“网络拓扑”模型&#xff0c;如下图所示&#xff1a; 设计 新建的“网络拓扑”模型进行…

SpringMVC全局异常处理

一、Java中的异常 定义&#xff1a;异常是程序在运行过程中出现的一些错误&#xff0c;使用面向对象思想把这些错误用类来描述&#xff0c;那么一旦产生一个错误&#xff0c;即创建某一个错误的对象&#xff0c;这个对象就是异常对象。 类型&#xff1a; 声明异常&#xff1…

QT自定义控件实践--滑动组件

概述 本篇文章,会逐步带您了解,如何自定义一个QT的滑动组件 操作步骤 选择合适的基类继承: 我们命名这个自定义控件为MySlipButton,继承自QWidget 添加成员变量: 根据滑动组件的特性,添加合适的成员变量,如当前值、最小值、最大值、滑块的位置等。 定义必要的方…

【零成本抽象】基本概念与在C++中的实现

零成本抽象概念是由 Bjarne Stroustrup 提出的&#xff0c;他在 1994 年的著作中就有相关设想&#xff0c;2016 年其在 C 大会登台演讲时&#xff0c;明确阐述了 C 中的 “零成本抽象” 这一理念。 一、零成本抽象概念 Bjarne Stroustrup提出的零成本抽象概念&#xff0c;是指…

基于遗传优化算法的带时间窗多车辆路线规划matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化算法的带时间窗多车辆路线规划matlab仿真&#xff0c;通过输入各个节点坐标&#xff0c;以及出发点到节点的时间窗&#xff0c;来进行优化&#xff0…

HTML前端开发-- Iconfont 矢量图库使用简介

一、SVG 简介及基础语法 1. SVG 简介 SVG&#xff08;Scalable Vector Graphics&#xff09;是一种基于 XML 的矢量图形格式&#xff0c;用于在网页上显示二维图形。SVG 图形可以无限缩放而不会失真&#xff0c;非常适合用于图标、图表和复杂图形。SVG 文件是文本文件&#x…

网络安全——防火墙

基本概念 防火墙是一个系统&#xff0c;通过过滤传输数据达到防止未经授权的网络传输侵入私有网络&#xff0c;阻止不必要流量的同时允许必要流量进入。防火墙旨在私有和共有网络间建立一道安全屏障&#xff0c;因为网上总有黑客和恶意攻击入侵私有网络来破坏&#xff0c;防火…

高质量阅读微信小程序ssm+论文源码调试讲解

第2章 开发环境与技术 高质量阅读微信小程序的编码实现需要搭建一定的环境和使用相应的技术&#xff0c;接下来的内容就是对高质量阅读微信小程序用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的&#xff0c;是经常变动的&…

Linux部署oceanbase

一、源码部署 1. 下载官网安装包 https://www.oceanbase.com/softwarecenter 2. 上传安装包并解压缩 #在/home目录下创建oceanbase文件夹 mkdir oceanbase cd oceanbase/ tar -xzf oceanbase-all-in-one-4.2.1_bp10_20241122.el7.x86_64.tar.gz 3. 安装 cd oceanbase-all-in…

【论文阅读】Fifty Years of the ISCA: A Data-Driven Retrospective

学习体会&#xff1a; ISCA会议近五十年文章分析, 了解论文热点方向, 处理器依旧是热点! AI和并行是大趋势, 做XPU相关目前来说还是热点~ 摘录自原文 摘录: 数据来源和分析方法&#xff1a; 作者收集了 ACM 数字图书馆中所有 ISCA 论文&#xff0c;并使用 DBLP、Google Schol…

设置docker镜像加速器

阿里云镜像中心 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 登陆阿里云账号后&#xff0c;可以看到镜像加速器的配置&#xff0c;如下图所示 参考文章地址 Docker 镜像库国内加速的几种方法_docker 加速-CSDN博客

Mysql体系架构剖析——岁月云实战笔记

1 体系架构 理论内容阅读了mysql体系架构剖析&#xff0c;其他的根据岁月云的实战进行记录。 1.1 连接层 mysql最上层为连接服务&#xff0c;引入线程池&#xff0c;允许多台客户端连接&#xff0c;主要工作&#xff1a;连接处理、授权认证、安全防护、管理连接等。 连接处理&a…

Midjourney基础教程-功能界面详解

基础入门教程&#xff1a; 一.Midjourney快速入门(3步画出你的第一张图&#xff09; 注&#xff1a; 1.平台为大家设置了自动翻译&#xff0c;可以直接写中文提示词&#xff0c;自动翻译成英文。当然要求更准确&#xff0c;大家可以先翻译成英 文在输入进来。 2.提示词如何去…

【git】--- 通过 git 和 gitolite 管理单仓库的 SDK

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【git】--- 通过 git 和 gitolite 管理单仓库的 SDK 开发环境一、安装配置 gitolite二…