程序汪10万接的多平台视频分发项目,模拟人工发视频

本项目来自程序汪背后的私活小团队,开发了一个多平台分发视频项目,给粉丝分享一下解决方案和具体项目分开情况付款情况等等细节,希望给想接私活的朋友一些经验参考

程序汪10万接的多平台视频分发项目,模拟人工发视频

视频版本 在 B站【我是程序汪】

图片

目录

  • 一、项目构成

  • 二、开发人员

  • 三、项目背景

  • 四、APP端

  • 五、后端系统

项目构成

  • 系统基本构成:uniapp(app)+ java后台+selenium(蛇尼泥嗯)免费的分布式的自动化测试工具

selenium

Selenium 是一套 Web网站 的程序自动化操作 解决方案。

通过它,我们可以写出自动化程序,像真人一样在浏览器里操作web界面。比如点击界面按钮,在文本框中输入文字,在B站上发布视频 等操作。

而且还能从web界面获取信息。比如获取 12306火车、汽车票务信息,某招聘网站职位信息,财经网站股票价格信息 等等,然后用程序进行分析处理。

安装命

开发人员以及费用情况

  • 开发周期60天 

  • 开发人数 2人  1前1后

  • 工作量比例  20%前端 10%设计 70%后端

  • 整体费用是10万(不包含维护费,一期的费用哦)

  • 走的正规公司合同

  • 云服务器3台 配置 8核16G(根据情况可增加)

  • 维护费用:项目总款的10% 一年

  • 付款方式 5+4+1 (预付+验收+尾款)

项目背景

现在自媒体视频平台非常火爆,某营销公司为了推广自己的产品,当然后期也可以自己卖会员,需要在多个视频平台一键分发(抖音,B站,今日头条,小红书,快手等等 十多个平台),这样就不用人工一个个平台登陆去发视频了,效率飞速提高,目前我们集成了16个视频平台,后期可能会继续增加

图片

图片

其中关键流程

图片

APP端

本APP是用uniapp开发的,这种外包小项目肯定要选择性价比高的开发方式(程序汪知道原生的好,但开发成本也高哦),利用uniapp可以让多端开发成本降到最低

图片

图片

图片

优点

uni-app是一套可以适用多端的开源框架,一套代码可以同时生成ios,Android,H5,微信小程序,支付宝小程序,百度小程序等。

缺点

uni-app问世的时间还比较短,有很多地方还不是完善,坑很多,如果不喜欢爬坑的朋友那就少用uni-app吧

B站的核心代码

由于是商业代码,所以放出来的是比较老的版本,最新版本不敢乱发啊

核心思路基本差不多,最新版本单机变集群 还使用到了线程池等性能手段,来提高并发量

 <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency>

package com.video.browserService;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;import com.video.ThreadPool.task.workTask;
import com.video.bean.Task;
import com.video.constants.sys_constants;
import com.video.os.WindowsUtils;
import com.video.util.Base64Util;
import com.video.util.WebDriverUtil;
import com.video.util.codeUtil;import ch.qos.logback.core.net.SyslogOutputStream;import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;import javax.imageio.ImageIO;import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.UUID;public class bibi_browser extends workTask{private WebDriver webDriver;private String username="";private String password="";private String path="";private String content="";private Task task;public bibi_browser(Task task,String username,String password,String path,String content){this.task=task;this.username=username;this.password=password;this.path=path;this.content=content;}@Overridepublic void excute() throws IOException {try{setSerid(task.getSerid());webDriver=WebDriverUtil.getInstance(getSerid()).getDriver();task.setTask_status(1);Map<String,String> result=moblieLogin(username, password);if(result!=null&&result.get("result")!=null&&result.get("result").toString().equals("success")){result=UploadVideo(path,content);task.setResult(result);}else{task.setResult(result);}task.setTask_status(3);}catch(Exception e){Map<String,String> result=new HashMap<String,String>();result.put("result", "error");result.put("msg", "上传视频异常");task.setResult(result);task.setTask_status(3);}sys_constants.taskMap.put(task.getSessionId(), task);}@Overridepublic String info() {// TODO Auto-generated method stubreturn null;}public Map<String,String> moblieLogin(String username,String password){//webDriver.manage().deleteAllCookies();Map<String,String> resultMap=new HashMap<String,String>();try{webDriver.get("https://www.bilibili.com/");WebDriverUtil.getInstance(getSerid()).WebDriverWaitElement(10,1,By.xpath("//img[contains(@class,'bili-avatar-img bili-avatar-face bili-avatar-img-radius')]"));WebElement head_img=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//img[contains(@class,'bili-avatar-img bili-avatar-face bili-avatar-img-radius')]"));if(head_img!=null){resultMap.put("result", "success");resultMap.put("msg", "登录成功");return resultMap;}WebElement login_btn=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//*[@id='i_cecream']/div[1]/div[1]/ul[2]/li[8]/li/a/div/span"));if(login_btn!=null){login_btn.click();}WebDriverUtil.getInstance(getSerid()).WebDriverWaitElement(10,1,By.xpath("//div[@id='geetest-wrap']"));*[@id="layout"]/div/div[2]/p[1]/aWebElement sms_btn=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//*[@id='geetest-wrap']/div/div[1]/span[2]"));if(sms_btn!=null){sms_btn.click();}WebDriverUtil.getInstance(getSerid()).WebDriverWaitElement(10,1,By.xpath("//a[contains(@class,'btn btn-login')]"));//输入手机号码WebElement userinput =WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//input[@name='tel']"));if(userinput!=null){userinput.sendKeys(username);}//点击发送短信按钮WebElement sendMobile =WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//button[contains(@class,'el-button captcha-buttom el-button--primary')]"));if(sendMobile!=null){sendMobile.click();try{Thread.currentThread().sleep(2000);WebElement backimg=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//img[@class='geetest_item_img']"));WebElement clickimg=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//div[@class='geetest_tip_img']"));if(backimg!=null){String baseimg="";if(clickimg!=null){File src =clickimg.getScreenshotAs(OutputType.FILE);baseimg=WebDriverUtil.getInstance(getSerid()).captureElement(src, clickimg);}File backsrc =backimg.getScreenshotAs(OutputType.FILE);String back_img=WebDriverUtil.getInstance(getSerid()).captureElement(backsrc, backimg);//String back_img=Base64Util.imgBase64(backimg.getAttribute("src"));String result=codeUtil.loadCodeResult("27",back_img,null, null, baseimg);if(result!=null&&!result.trim().equals("")){String []xys=result.split("\\|");if(xys!=null&&xys.length>0){WebDriverUtil.getInstance(getSerid()).moveAndClick(backimg,xys);}WebElement que_btn=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//a[@class='geetest_commit']"));if(que_btn!=null){que_btn.click();}}else{resultMap.put("result", "error");resultMap.put("msg", "验证码识别错误,登录失败");return resultMap;}}}catch(Exception e){e.printStackTrace();}}//输入短信验证码WebElement pwdinput =WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//input[contains(@class,'el-input__inner') and contains(@type,'text') and contains(@placeholder,'请输入短信验证码')]"));if(pwdinput!=null){String mobilemsg="";long time=new Date().getTime();task.setTask_status(2);while(sys_constants.mobilemsg.get(task.getSessionId())==null&&(new Date().getTime()-time<5*60*1000)){Thread.currentThread().sleep(5000);}mobilemsg=sys_constants.mobilemsg.get(task.getSessionId());if(mobilemsg!=null&&!mobilemsg.trim().equals("")){pwdinput.sendKeys(mobilemsg);}else{resultMap.put("result", "error");resultMap.put("msg", "请输入短信验证码,登录失败");return resultMap;}}WebElement submit_btn=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//a[contains(@class,'btn btn-login') and contains(string(), '登录')]"));if(submit_btn!=null){submit_btn.click();//error-- 为保证账号安全,请使用手机验证码登录Thread.currentThread().sleep(1000);WebDriverUtil.getInstance(getSerid()).WebDriverWaitElement(10,1,By.xpath("//a[@class='avatar el-popover__reference']"));WebElement img_btn=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//a[@class='avatar el-popover__reference']"));if(img_btn!=null){resultMap.put("result", "success");resultMap.put("msg", "登录成功");}else{resultMap.put("result", "error");resultMap.put("msg", "登录失败");return resultMap;}}}catch(Exception e){e.printStackTrace();resultMap.put("result", "error");resultMap.put("msg", "登录异常,请求页面异常");}return resultMap;}/*** 浏览器登录B站* @return*/public Map<String,String> login(String username,String password){//webDriver.manage().deleteAllCookies();Map<String,String> resultMap=new HashMap<String,String>();return resultMap;}public Map<String,String> UploadVideo(String path,String content){Map<String,String> resultMap=new HashMap<String,String>();try{webDriver.get("https://member.bilibili.com/platform/upload/video/frame");WebDriverUtil.getInstance(getSerid()).WebDriverWaitElement(2,1,By.xpath("//div[@class='guide_left__wrap']/div[@class='tips_wrap']/img[@class='jump']"));WebElement guide_left_btn=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//div[@class='guide_left__wrap']/div[@class='tips_wrap']/img[@class='jump']"));if(guide_left_btn!=null&&guide_left_btn.isDisplayed()){guide_left_btn.click();}WebDriverUtil.getInstance(getSerid()).WebDriverWaitElement(2,1,By.xpath("//div[@class='guide_right__wrap']/div[@class='tips_wrap']/img[@class='jump']"));WebElement guide_right_btn=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//div[@class='guide_right__wrap']/div[@class='tips_wrap']/img[@class='jump']"));if(guide_right_btn!=null&&guide_right_btn.isDisplayed()){guide_right_btn.click();}WebDriverUtil.getInstance(getSerid()).WebDriverWaitElement(10,1,By.id("video-up"));WebDriverUtil.getInstance(getSerid()).getDriver().switchTo().frame("videoUpload");((JavascriptExecutor)WebDriverUtil.getInstance(getSerid()).getDriver()).executeScript("document.getElementsByTagName('input').style='display:block';");WebElement upload_btn=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//*[@id='video-up-app']/div/div[2]/div/div[1]/div/div/input"));if(upload_btn!=null){//upload_btn.setAttribute("value", "D:\\CRM生成代码\\VID_20211113_111758.mp4");upload_btn.sendKeys(path);//       List<String> imglist=videoImage(path, 960, 600);
//       WebElement upload_img_btn=WebDriverUtil
//            .getInstance(getSerid())
//            .findElement(By.xpath("//input[@type='file']"));
//       for(String img:imglist){
//        upload_img_btn.sendKeys(img);
//        Thread.currentThread().sleep(5000);
//       }WebDriverUtil.getInstance(getSerid()).WebDriverWaitElement(10*60,5,By.xpath("//span[contains(@class, 'success') and contains(string(),'上传完成')]"));WebElement finish_text=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//span[contains(@class, 'success') and contains(string(),'上传完成')]"));if(finish_text.isDisplayed()){//上传完成Thread.currentThread().sleep(1000);//等待5秒加载完WebElement tag_text=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//div[@class='tag-list']/div[2]"));if(tag_text!=null){tag_text.click();}WebElement title_text=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//input[contains(@class, 'input-val') and contains(@placeholder, '请输入稿件标题')]"));if(title_text!=null){title_text.sendKeys(content);}WebElement desc_text=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//div[contains(@class, 'ql-editor ql-blank') and contains(@placeholder, '填写更全面的相关信息,让更多的人能找到你的视频吧')]"));if(desc_text!=null){desc_text.sendKeys(content);}WebElement submit_btn=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//span[contains(@class, 'submit-add') and contains(string(),'立即投稿')]"));if(submit_btn!=null){Thread.currentThread().sleep(1000);submit_btn.click();try{WebElement success_text=WebDriverUtil.getInstance(getSerid()).findElement(By.xpath("//div[contains(@class, 'step-des') and contains(string(), '稿件投递成功')]"));if(success_text!=null){resultMap.put("result", "success");resultMap.put("msg", "视频上传成功");}}catch(Exception e){resultMap.put("result", "success");resultMap.put("msg", "视频上传成功");}}}}}catch(Exception e){e.printStackTrace();resultMap.put("result", "error");resultMap.put("msg", "视频上传异常,检测是否视频文件");}return resultMap;}/*** 截取视频第六帧的图片** @param filePath 视频路径* @param dir      文件存放的根目录* @return 图片的相对路径 例:pic/1.png*/public  List<String> videoImage(String filePath,int width,int height) throws Exception {String pngPath = "";
//        FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);File file=new File(filePath);String dir=file.getParent()+"/";System.out.println(dir);FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(file);List<String> list=new ArrayList<String>();ff.start();int ffLength = ff.getLengthInFrames();Frame f;int i = 0;int m=0;while (i < ffLength) {f = ff.grabFrame();//截取第6帧if ((i > 5&&i%20==0) && (f.image != null)) {//生成图片的相对路径 例如:pic/uuid.pngpngPath = getPngPath();//执行截图并放入指定位置System.out.println("存储图片 : " + (dir + pngPath));doExecuteFrame(f, dir + pngPath,width,height);list.add(dir + pngPath);m++;if(m>4)break;}i++;}ff.stop();return list;}/*** 生成图片的相对路径** @return 图片的相对路径 例:pic/1.png*/private static String getPngPath() {return getUUID() + ".png";}/*** 生成唯一的uuid** @return uuid*/private static String getUUID() {return UUID.randomUUID().toString().replace("-", "");}/*** 截取缩略图** @param f                       Frame* @param targerFilePath:封面图片存放路径*/private static void doExecuteFrame(Frame f, String targerFilePath,int width,int height) {String imagemat = "png";if (null == f || null == f.image) {return;}Java2DFrameConverter converter = new Java2DFrameConverter();BufferedImage bi = converter.getBufferedImage(f);BufferedImage thumbimg = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);thumbimg.getGraphics().drawImage(bi.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);File output = new File(targerFilePath);try {ImageIO.write(thumbimg, imagemat, output);} catch (IOException e) {e.printStackTrace();}}
}

难点

  • 适配各种视频平台

后端需要利用selenium模拟各种平台的视频上传操作,这块工作量是最大的,另外如果平台升级了,可能会影响开发的接口功能,需要跟着调整对应平台的功能接口,遇要验证还需要利用打码平台(机器验证码)

AI   训练集

图片

下图是核心后端API,下面是利用Apifox的免费功能,输出的API文档

图片

私活合作加VX:itwang007

参考文档:

  1. 某打码平台

    http://www.kuaishibie.cn/?spm=null

  2. 免费的分布式的自动化测试工具 

    http://www.selenium.org.cn/

  3. uniapp

    https://uniapp.dcloud.net.cn/

  4. APIFOX

    https://www.apifox.cn/

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

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

相关文章

vs2017离线安装(配合QT5.9.2使用)

以vs2017_Professional版本为例&#xff1a; 一、下载安装包vs2017_Professional.exe&#xff08;在线安装包即可&#xff09; 二、创建在目录&#xff1a;C:\vs2017_Professional_Package&#xff0c;把vs2017_Professional.exe放在该目录下。 ID&#xff1a; Microsoft.Vis…

路径规划——曲线拟合详解(二):贝塞尔曲线、B样条曲线与QP优化( Fast-Planner算法核心部分)

1. 贝塞尔曲线 (1). 贝塞尔曲线的作用 贝塞尔曲线的作用是给定控制点&#xff0c;通过控制点生成对应的曲线进行轨迹拟合&#xff0c;输入为点&#xff0c;输出为受到控制点约束而产生的轨迹。 (2). 贝塞尔曲线的数学表达式 假设给定N个控制点&#xff0c;得到的为N-1阶的贝…

【Segment Anything Model】十三:Meta的最新工作EfficientSAM,微调到自己的数据集,代码。

&#x1f349; 博主微信 cvxiayixiao 还有其他专栏点击头像查询 &#x1f353; 【Segment Anything Model】计算机视觉检测分割任务专栏。 &#x1f351; 【公开数据集预处理】特别是医疗公开数据集的接受和预处理&#xff0c;提供代码讲解。 &#x1f348; 【opencv图像处理】…

【LeetCode热题100】118. 杨辉三角(动态规划)

一.题目要求 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 二.题目难度 简单 三.输入样例 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示…

Android Studio gradle-8.4 配置 GreenDao

1.配置项目下的build buildscript {repositories {mavenCentral()}dependencies {classpath ("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0")classpath ("org.greenrobot:greendao-gradle-plugin:3.3.1") // 使用最新版本} } 2.配置app下的build i…

跨越网络边界:借助C++编写的下载器程序,轻松获取Amazon商品信息

背景介绍 在数字化时代&#xff0c;数据是新的石油。企业和开发者都在寻找高效的方法来收集和分析网络上的信息。亚马逊&#xff0c;作为全球最大的电子商务平台之一&#xff0c;拥有丰富的商品信息&#xff0c;这对于市场分析和竞争情报来说是一个宝贵的资源。 问题陈述 然…

持续交付工具Argo CD的部署使用

Background CI/CD&#xff08;Continuous Integration/Continuous Deployment&#xff09;是一种软件开发流程&#xff0c;旨在通过自动化和持续集成的方式提高软件交付的效率和质量。它包括持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;两个主要阶…

自定义gitlog格式

git log命令非常强大而好用&#xff0c;在复杂系统的版本管理中扮演着重要的角色&#xff0c;但默认的git log命令显示出的东西实在太丑&#xff0c;不好好打扮一下根本没法见人&#xff0c;打扮好了用alias命令拍个照片&#xff0c;就正式出道了&#xff01; 在使用git查看lo…

【御控物联】JavaScript JSON结构转换(16):对象To数组——综合应用

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON数组》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

php反序列化题目

[NewStarCTF 公开赛赛道]UnserializeOne 分析代码&#xff0c;最终需要调用到 file_get_contents 即可获得flag 从后往前分析 触发 __invoke 需要 以调用函数的方式调用一个对象 可以找到Start类 里的__isset中可以将类当作函数调用 所以需要调用到 __isset 就需要 isset()…

提示工程中的10个设计模式

我们可以将提示词定义为向大型语言模型(Large Language Model&#xff0c;LLM)提供的一个查询或一组指令&#xff0c;这些指令随后使模型能够维持一定程度的自定义或增强&#xff0c;以改进其功能并影响其输出。我们可以通过提供细节、规则和指导来引出更有针对性的输出&#x…

组合数(费马小定理, 快速幂)

给定 n 组询问&#xff0c;每组询问给定两个整数 a&#xff0c;b&#xff0c;请你输出 Cbamod(1097)的值。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一组 a 和 b。 输出格式 共 n 行&#xff0c;每行输出一个询问的解。 数据范围 1≤n≤10000, 1≤…

iOS代码加固与保护方法详解 - 提升iOS应用安全性的关键步骤

憧憬blog主页 在强者的眼中&#xff0c;没有最好&#xff0c;只有更好。我们是移动开发领域的优质创作者&#xff0c;同时也是阿里云专家博主。 ✨ 关注我们的主页&#xff0c;探索iOS开发的无限可能&#xff01; &#x1f525;我们与您分享最新的技术洞察和实战经验&#xff0…

基于大模型的态势认知智能体

源自&#xff1a;指挥控制与仿真 作者&#xff1a;孙怡峰, 廖树范, 吴疆 李福林 “人工智能技术与咨询” 发布 摘要 针对战场态势信息众多、变化趋势认知困难的问题,提出基于大模型的态势认知智能体框架和智能态势认知推演方法。从认知概念出发,结合智能体的抽象性、具…

大厂高频面试题复习JAVA学习笔记-JUC多线程及高并发(上)

目录 0 JUC基础概念 wait/sleep的区别 并发与并行的区别 线程的六个状态 JUC结构 ​编辑 1 请谈谈你对volatile的理解 JMM&#xff08;java内存模型&#xff09; 可见性 不保证原子性 有序性​编辑 指令重排 哪些地方用到volatile&#xff1a; 双端检查机制DLC …

MySQL-6.表的高级查询(多表查询、子查询、表复制、合并查询、表外连接)

6.1 多表查询 基于两个或以上表的查询&#xff0c;默认从表1取出一行&#xff0c;与表2的每一行组合&#xff0c;返回的记录数为表1表2&#xff0c;默认返回的结果为笛卡尔集&#xff0c;需写出正确的WHERE条件进行筛选。 多表查询的条件不能少于表的个数-1&#xff0c;否则会…

LeetCode刷题之105. 从前序与中序遍历序列构造二叉树

文章目录 1.题目描述2. 分析2.1 前序遍历2.1.1 什么是前序遍历&#xff1f;2.1.2 前序遍历有什么特点&#xff1f; 2.2 中序遍历2.2.1 什么是中序遍历2.2.2 中序遍历有什么特点&#xff1f; 2.3 后序遍历2.3.1 什么是后序遍历&#xff1f;2.3.2 特点 2.4 总结 3. 解法 1.题目描…

漏洞挖掘 | 两个src案例分享

案例一 - 存储型XSS 文前废话:某天正在刷着**社区的帖子,突然间评论区的一条评论引起了我的注意,类似于下面这样 其中字体是蓝色的&#xff0c;这种评论在html标签中代码格式是<a>这是文字</a>这样的链接个格式。 同时评论区XSS漏洞的高发区,想着可能会有操作点 …

每日一题|字符迁移【算法赛】|字符数组+前缀和+差分

每日一题|字符迁移【算法赛】 字符迁移 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 字符迁移 注意&#xff1a; 预习知识&#xf…

【InternLM 实战营第二期笔记】使用茴香豆搭建你的RAG智能助理

RAG RAG是什么 RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;通过检索与用户输入相关的信息片段&#xff0c;并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追…