当前位置: 首页 > news >正文

RAGFlow 学习笔记

RAGFlow 学习笔记

  • 0. 引言
  • 1. RAGFlow 支持的文档格式
  • 2. 嵌入模型选择后不再允许改变
  • 3. 干预文件解析​
  • 4. RAGFlow 与其他 RAG 产品有何不同? ​
  • 5. RAGFlow 支持哪些语言? ​
  • 6. 哪些嵌入模型可以本地部署? ​
  • 7. 为什么RAGFlow解析文档的时间比LangChain要长? ​
  • 8. 为什么RAGFlow比其他项目需要更多的资源? ​
  • 9. RAGFlow 支持哪些架构或设备? ​
  • 10. 可以通过URL分享对话吗? ​
  • 11. 为什么我的 pdf 解析在接近完成时停止,而日志没有显示任何错误? ​
  • 12. 为什么我无法将 10MB 以上的文件上传到本地部署的 RAGFlow? ​
  • 13. 如何增加RAGFlow响应的长度? ​
  • 14. Empty response(空响应)是什么意思?怎么设置呢? ​
  • 15. 如何配置 RAGFlow 以 100% 匹配的结果进行响应,而不是利用 LLM? ​
  • 16. 使用 DataGrip 连接 ElasticSearch
  • 99. 功能扩展
    • 99-1. 扩展支持本地 LLM 功能
    • 99-2. 扩展支持 OCI Cohere Embedding 功能
    • 99-3. 扩展支持 OCI Cohere Command-r 功能
    • 99-4. 扩展支持 Cohere Rerank 功能

0. 引言

这篇文章记录一下学习 RAGFlow 是一些笔记,方便以后自己查看和回忆。

1. RAGFlow 支持的文档格式

RAGFlow 支持的文件格式包括文档(PDF、DOC、DOCX、TXT、MD)、表格(CSV、XLSX、XLS)、图片(JPEG、JPG、PNG、TIF、GIF)和幻灯片(PPT、PPTX)。

2. 嵌入模型选择后不再允许改变

一旦您选择了嵌入模型并使用它来解析文件,您就不再允许更改它。明显的原因是我们必须确保特定知识库中的所有文件都使用相同的嵌入模型进行解析(确保它们在相同的嵌入空间中进行比较)。

3. 干预文件解析​

RAGFlow 具有可见性和可解释性,允许您查看分块结果并在必要时进行干预。

4. RAGFlow 与其他 RAG 产品有何不同? ​

尽管 LLMs 显着推进了自然语言处理 (NLP),但“垃圾进垃圾出”的现状仍然没有改变。为此,RAGFlow 引入了与其他检索增强生成 (RAG) 产品相比的两个独特功能。

  • 细粒度文档解析:文档解析涉及图片和表格,您可以根据需要灵活干预。
  • 可追踪的答案,减少幻觉:您可以信任 RAGFlow 的答案,因为您可以查看支持它们的引文和参考文献。

5. RAGFlow 支持哪些语言? ​

目前有英文、简体中文、繁体中文。

6. 哪些嵌入模型可以本地部署? ​

  • BAAI/bge-large-zh-v1.5
  • BAAI/bge-base-en-v1.5
  • BAAI/bge-large-en-v1.5
  • BAAI/bge-small-en-v1.5
  • BAAI/bge-small-zh-v1.5
  • jinaai/jina-embeddings-v2-base-en
  • jinaai/jina-embeddings-v2-small-en
  • nomic-ai/nomic-embed-text-v1.5
  • sentence-transformers/all-MiniLM-L6-v2
  • maidalun1020/bce-embedding-base_v1

7. 为什么RAGFlow解析文档的时间比LangChain要长? ​

RAGFlow 使用了视觉模型,在布局分析、表格结构识别和 OCR(光学字符识别)等文档预处理任务中投入了大量精力。这会增加所需的额外时间。

8. 为什么RAGFlow比其他项目需要更多的资源? ​

RAGFlow 有许多用于文档结构解析的内置模型,这些模型占用了额外的计算资源。

9. RAGFlow 支持哪些架构或设备? ​

目前,我们仅支持 x86 CPU 和 Nvidia GPU。

10. 可以通过URL分享对话吗? ​

是的,此功能现已可用。

11. 为什么我的 pdf 解析在接近完成时停止,而日志没有显示任何错误? ​

如果您的 RAGFlow 部署在本地,则解析进程可能会因 RAM 不足而被终止。尝试通过增加 docker/.env 中的 MEM_LIMIT 值来增加内存分配。

12. 为什么我无法将 10MB 以上的文件上传到本地部署的 RAGFlow? ​

您可能忘记更新 MAX_CONTENT_LENGTH 环境变量:

将环境变量 MAX_CONTENT_LENGTH 添加到 ragflow/docker/.env

MAX_CONTENT_LENGTH=100000000

更新 docker-compose.yml:

environment:- MAX_CONTENT_LENGTH=${MAX_CONTENT_LENGTH}

重新启动 RAGFlow 服务器:

docker compose up ragflow -d

现在您应该能够上传大小小于 100MB 的文件。

13. 如何增加RAGFlow响应的长度? ​

右键单击所需的对话框以显示“Chat Configuration(聊天配置)”窗口。

切换到Model Setting(模型设置)选项卡并调整Max Tokens(最大令牌)滑块以获得所需的长度。

单击“确定”确认您的更改。

14. Empty response(空响应)是什么意思?怎么设置呢? ​

如果从您的知识库中未检索到任何内容,则您可以将系统的响应限制为您在“Empty response(空响应)”中指定的内容。如果您没有在空响应中指定任何内容,您就可以让您的 LLM 即兴创作,给它一个产生幻觉的机会。

15. 如何配置 RAGFlow 以 100% 匹配的结果进行响应,而不是利用 LLM? ​

单击页面中间顶部的知识库。
右键单击所需的知识库以显示配置对话框。
选择“Q&A(问答)”作为块方法,然后单击“保存”以确认您的更改。

16. 使用 DataGrip 连接 ElasticSearch

curl -X POST -u "elastic:infini_rag_flow" -k "http://localhost:1200/_license/start_trial?acknowledge=true&pretty"

99. 功能扩展

99-1. 扩展支持本地 LLM 功能

vi rag/utils/__init__.py---
# encoder = tiktoken.encoding_for_model("gpt-3.5-turbo")
encoder = tiktoken.encoding_for_model("gpt-4-128k")
---
vi api/settings.py---"Local-OpenAI": {"chat_model": "gpt-4-128k","embedding_model": "","image2text_model": "","asr_model": "",},    
---
vi api/db/init_data.py---
factory_infos = [{"name": "OpenAI","logo": "","tags": "LLM,TEXT EMBEDDING,SPEECH2TEXT,MODERATION","status": "1",
}, {"name": "Local-OpenAI","logo": "","tags": "LLM","status": "1",
},
---# ---------------------- Local-OpenAI ------------------------{"fid": factory_infos[0]["name"],"llm_name": "gpt-4-128k","tags": "LLM,CHAT,128K","max_tokens": 128000,"model_type": LLMType.CHAT.value},
vi rag/llm/__init__.py---
ChatModel = {"OpenAI": GptTurbo,"Local-OpenAI": GptTurbo,
---
vi web/src/pages/user-setting/setting-model/index.tsx---
const IconMap = {'Tongyi-Qianwen': 'tongyi',Moonshot: 'moonshot',OpenAI: 'openai','Local-OpenAI': 'openai',  'ZHIPU-AI': 'zhipu',文心一言: 'wenxin',Ollama: 'ollama',Xinference: 'xinference',DeepSeek: 'deepseek',VolcEngine: 'volc_engine',BaiChuan: 'baichuan',Jina: 'jina',
};
---
vi web/src/pages/user-setting/setting-model/api-key-modal/index.tsx---{llmFactory === 'Local-OpenAI' && (<Form.Item<FieldType>label={t('baseUrl')}name="base_url"tooltip={t('baseUrlTip')}><Input placeholder="https://api.openai.com/v1" /></Form.Item>)}
---
连接 MySQL 数据库,1. 向llm_factories表插入数据
Local-OpenAI,1717812204952,2024-06-08 10:03:24,1717812204952,2024-06-08 10:03:24,"",LLM,12. 向llm表插入数据
gpt-4-128k,1717812204975,2024-06-08 10:03:24,1717812204975,2024-06-08 10:03:24,chat,Local-OpenAI,128000,"LLM,CHAT,128K",1

99-2. 扩展支持 OCI Cohere Embedding 功能

连接 MySQL 数据库,1. 向llm_factories表插入数据
OCI-Cohere,1717812204967,2024-06-08 10:03:24,1717812204967,2024-06-08 10:03:24,"",TEXT EMBEDDING,12. 向llm表插入数据
cohere.embed-multilingual-v3.0,1717812204979,2024-06-08 10:03:24,1717812204979,2024-06-08 10:03:24,embedding,OCI-Cohere,512,"TEXT EMBEDDING,",1
vi api/apps/llm_app.py---fac = LLMFactoriesService.get_all()return get_json_result(data=[f.to_dict() for f in fac if f.name not in ["Youdao", "FastEmbed", "BAAI"]])# return get_json_result(data=[f.to_dict() for f in fac if f.name not in ["Youdao", "FastEmbed", "BAAI", "OCI-Cohere"]])
------for m in llms:m["available"] = m["fid"] in facts or m["llm_name"].lower() == "flag-embedding" or m["fid"] in ["Youdao","FastEmbed", "BAAI"]# m["available"] = m["fid"] in facts or m["llm_name"].lower() == "flag-embedding" or m["fid"] in ["Youdao","FastEmbed", "BAAI", "OCI-Cohere"]
---
vi api/settings.py---"OCI-Cohere": {"chat_model": "","embedding_model": "cohere.embed-multilingual-v3.0","image2text_model": "","asr_model": "",},
---
vi api/db/init_data.py---
factory_infos = [{"name": "OpenAI","logo": "","tags": "LLM,TEXT EMBEDDING,SPEECH2TEXT,MODERATION","status": "1",
}, {"name": "OCI-Cohere","logo": "","tags": "TEXT EMBEDDING","status": "1",
},
---# ---------------------- OCI-Cohere ------------------------{"fid": factory_infos[0]["name"],"llm_name": "cohere.embed-multilingual-v3.0","tags": "TEXT EMBEDDING,512","max_tokens": 512,"model_type": LLMType.EMBEDDING.value},
vi rag/llm/__init__.py---
EmbeddingModel = {"OCI-Cohere": OCICohereEmbed,
---
vi rag/llm/embedding_model.py---
class OCICohereEmbed(Base):def __init__(self, key, model_name="cohere.embed-multilingual-v3.0",base_url="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com"):if not base_url:base_url = "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com"CONFIG_PROFILE = "DEFAULT"config = oci.config.from_file('~/.oci/config', CONFIG_PROFILE)self.client = oci.generative_ai_inference.GenerativeAiInferenceClient(config=config, service_endpoint=base_url,retry_strategy=oci.retry.NoneRetryStrategy(),timeout=(10, 240))self.model_name = model_nameself.compartment = keydef encode(self, texts: list, batch_size=1):token_count = 0texts = [truncate(t, 512) for t in texts]for t in texts:token_count += num_tokens_from_string(t)embed_text_detail = oci.generative_ai_inference.models.EmbedTextDetails()embed_text_detail.serving_mode = oci.generative_ai_inference.models.OnDemandServingMode(model_id=self.model_name)embed_text_detail.inputs = textsembed_text_detail.truncate = "NONE"embed_text_detail.compartment_id = self.compartmentres = self.client.embed_text(embed_text_detail)print(f"{res.data=}")return res.data.embeddings, token_countdef encode_queries(self, text):text = truncate(text, 512)token_count = num_tokens_from_string(text)res = self.encode(texts=[text])return res[0], token_count

在服务器上设置好 ~/.oci/config
添加的模型时,OCI-Cohere输入使用的OCI CompartmentID。

制作图标,访问 https://brandfetch.com/oracle.com 下载 oracle svg 图标,保存到 web/src/assets/svg/llm 目录下面。

vi web/src/pages/user-setting/setting-model/index.tsx---
const IconMap = {'OCI-Cohere': 'oracle',
---

99-3. 扩展支持 OCI Cohere Command-r 功能

连接 MySQL 数据库,1. 向llm_factories表插入数据
OCI-Cohere,1717812204967,2024-06-08 10:03:24,1717812204967,2024-06-08 10:03:24,"",LLM,TEXT EMBEDDING,12. 向llm表插入数据
cohere.embed-multilingual-v3.0,1717812204979,2024-06-08 10:03:24,1717812204979,2024-06-08 10:03:24,embedding,OCI-Cohere,512,"TEXT EMBEDDING,",1
vi api/apps/llm_app.py---fac = LLMFactoriesService.get_all()return get_json_result(data=[f.to_dict() for f in fac if f.name not in ["Youdao", "FastEmbed", "BAAI"]])# return get_json_result(data=[f.to_dict() for f in fac if f.name not in ["Youdao", "FastEmbed", "BAAI", "OCI-Cohere"]])
------for m in llms:m["available"] = m["fid"] in facts or m["llm_name"].lower() == "flag-embedding" or m["fid"] in ["Youdao","FastEmbed", "BAAI"]# m["available"] = m["fid"] in facts or m["llm_name"].lower() == "flag-embedding" or m["fid"] in ["Youdao","FastEmbed", "BAAI", "OCI-Cohere"]
---
vi api/settings.py---"OCI-Cohere": {"chat_model": "cohere.command-r-16k","embedding_model": "cohere.embed-multilingual-v3.0","image2text_model": "","asr_model": "",},
---
vi api/db/init_data.py---
factory_infos = [{"name": "OpenAI","logo": "","tags": "LLM,TEXT EMBEDDING,SPEECH2TEXT,MODERATION","status": "1",
}, {"name": "OCI-Cohere","logo": "","tags": "LLM,TEXT EMBEDDING","status": "1",
},
---# ---------------------- OCI-Cohere ------------------------{"fid": factory_infos[0]["name"],"llm_name": "cohere.embed-multilingual-v3.0","tags": "TEXT EMBEDDING,512","max_tokens": 512,"model_type": LLMType.EMBEDDING.value},{"fid": factory_infos[0]["name"],"llm_name": "cohere.command-r-16k","tags": "LLM,CHAT,16K","max_tokens": 16385,"model_type": LLMType.CHAT.value},
vi rag/llm/__init__.py---
ChatModel = {"OCI-Cohere": OCICohereChat,
---
vi rag/llm/chat_model.py---
class OCICohereChat(Base):def __init__(self, key, model_name="cohere.command-r-16k",base_url="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com"):if not base_url:base_url = "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com"CONFIG_PROFILE = "DEFAULT"config = oci.config.from_file('~/.oci/config', CONFIG_PROFILE)self.client = oci.generative_ai_inference.GenerativeAiInferenceClient(config=config, service_endpoint=base_url,retry_strategy=oci.retry.NoneRetryStrategy(),timeout=(10, 240))self.model_name = model_nameself.compartment = key@staticmethoddef _format_params(params):return {"max_tokens": params.get("max_tokens", 3999),"temperature": params.get("temperature", 0),"frequency_penalty": params.get("frequency_penalty", 0),"top_p": params.get("top_p", 0.75),"top_k": params.get("top_k", 0),}def chat(self, system, history, gen_conf):chat_detail = oci.generative_ai_inference.models.ChatDetails()chat_request = oci.generative_ai_inference.models.CohereChatRequest()params = self._format_params(gen_conf)chat_request.max_tokens = params.get("max_tokens")chat_request.temperature = params.get("temperature")chat_request.frequency_penalty = params.get("frequency_penalty")chat_request.top_p = params.get("top_p")chat_request.top_k = params.get("top_k")chat_detail.serving_mode = oci.generative_ai_inference.models.OnDemandServingMode(model_id=self.model_name)chat_detail.chat_request = chat_requestchat_detail.compartment_id = self.compartmentchat_request.is_stream = Falseif system:chat_request.preamble_override = systemprint(f"{history[-1]=}")chat_request.message = history[-1]['content']chat_response = self.client.chat(chat_detail)# Print resultprint("**************************Chat Result**************************")print(vars(chat_response))chat_response = vars(chat_response)chat_response_data = chat_response['data']chat_response_data_chat_response = chat_response_data.chat_responseans = chat_response_data_chat_response.texttoken_count = 0for t in history[-1]['content']:token_count += num_tokens_from_string(t)for t in ans:token_count += num_tokens_from_string(t)return ans, token_countdef chat_streamly(self, system, history, gen_conf):chat_detail = oci.generative_ai_inference.models.ChatDetails()chat_request = oci.generative_ai_inference.models.CohereChatRequest()params = self._format_params(gen_conf)chat_request.max_tokens = params.get("max_tokens")chat_request.temperature = params.get("temperature")chat_request.frequency_penalty = params.get("frequency_penalty")chat_request.top_p = params.get("top_p")chat_request.top_k = params.get("top_k")chat_detail.serving_mode = oci.generative_ai_inference.models.OnDemandServingMode(model_id=self.model_name)chat_detail.chat_request = chat_requestchat_detail.compartment_id = self.compartmentchat_request.is_stream = Trueif system:chat_request.preamble_override = systemprint(f"{history[-1]=}")token_count = 0for t in history[-1]['content']:token_count += num_tokens_from_string(t)chat_request.message = history[-1]['content']chat_response = self.client.chat(chat_detail)# Print resultprint("**************************Chat Result**************************")chat_response = vars(chat_response)chat_response_data = chat_response['data']# for msg in chat_response_data.iter_content(chunk_size=None):for event in chat_response_data.events():token_count += 1yield json.loads(event.data)["text"]yield token_count

在服务器上设置好 ~/.oci/config
添加的模型时,OCI-Cohere输入使用的OCI CompartmentID。

99-4. 扩展支持 Cohere Rerank 功能

连接 MySQL 数据库,1. 向llm_factories表插入数据
Cohere,1717812204971,2024-06-08 10:03:24,1717812204971,2024-06-08 10:03:24,"",TEXT RE-RANK,12. 向llm表插入数据
rerank-multilingual-v3.0,1717812205057,2024-06-08 10:03:25,1717812205057,2024-06-08 10:03:25,rerank,Cohere,4096,"RE-RANK,4k",1
vi api/settings.py---"Cohere": {"chat_model": "","embedding_model": "","image2text_model": "","asr_model": "","rerank_model": "rerank-multilingual-v3.0",},
---
vi api/db/init_data.py---
factory_infos = [{"name": "OpenAI","logo": "","tags": "LLM,TEXT EMBEDDING,SPEECH2TEXT,MODERATION","status": "1",
}, {"name": "Cohere","logo": "","tags": "TEXT RE-RANK","status": "1",
}
---# ---------------------- Cohere ------------------------{"fid": factory_infos[12]["name"],"llm_name": "rerank-multilingual-v3.0","tags": "RE-RANK,4k","max_tokens": 4096,"model_type": LLMType.RERANK.value},
vi rag/llm/__init__.py---
RerankModel = {"Cohere": CohereRerank,
---
vi rag/llm/rerank_model.py---def similarity(self, query: str, texts: list):token_count = 1texts = [truncate(t, 4096) for t in texts]for t in texts:token_count += num_tokens_from_string(t)for t in query:token_count += num_tokens_from_string(t)response = self.co.rerank(model=self.model,query=query,documents=texts,top_n=len(texts),return_documents=False,)return np.array([r.relevance_score for r in response.results]), token_count

添加的模型时,Cohere输入使用的Cohere 的 API Key。

制作图标,访问 https://brandfetch.com/cohere.com 下载 cohere svg 图标,保存到 web/src/assets/svg/llm 目录下面。

vi web/src/pages/user-setting/setting-model/index.tsx---
const IconMap = {'Cohere': 'cohere',
---

未完待续!

相关文章:

RAGFlow 学习笔记

RAGFlow 学习笔记 0. 引言1. RAGFlow 支持的文档格式2. 嵌入模型选择后不再允许改变3. 干预文件解析​4. RAGFlow 与其他 RAG 产品有何不同&#xff1f; ​5. RAGFlow 支持哪些语言&#xff1f; ​6. 哪些嵌入模型可以本地部署&#xff1f; ​7. 为什么RAGFlow解析文档的时间比…...

使用Docker-Java监听Docker容器的信息

使用Docker-Java监听Docker容器的信息 Docker作为一种轻量级的容器化平台&#xff0c;极大地方便了应用的部署与管理。然而&#xff0c;在实际使用过程中&#xff0c;我们常常需要对运行中的容器进行监控&#xff0c;以确保其健康状态&#xff0c;并能及时响应各种异常情况。本…...

Spring Boot + Mybatis Plus实现登录注册

Spring Boot 实现登录注册 1. 注册 业务逻辑 客户端输入注册时需要的用户参数&#xff0c;比如&#xff1a;账户名、密码、确认密码、其他服务端接收到客户端的请求参数进行校验&#xff0c;然后判断是否有误&#xff0c;有误的地方就将错误信息抛出将密码进行加密之后存储到…...

IDEA创建web项目

IDEA创建web项目 第一步&#xff1a;创建一个空项目 第二步&#xff1a;在刚刚创建的项目下创建一个子模块 第三步&#xff1a;在子模块中引入web 创建结果如下&#xff1a; 这里我们需要把这个目录移到main目录下&#xff0c;并改名为webapp&#xff0c;结果如下 将pom文件…...

二手物品交易系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;商家管理&#xff0c;用户管理&#xff0c;商品管理&#xff0c;用户咨询管理 商家账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;商品管理&#xff0c;用…...

探索大数据在信用评估中的独特价值

随着我国的信用体系越来越完善&#xff0c;信用将影响越来越多的人。现在新兴的大数据信用和传统信用&#xff0c;形成了互补的优势&#xff0c;大数据信用变得越来越重要&#xff0c;那大数据信用风险检测的重要性主要体现在什么地方呢?本文将详细为大家介绍一下&#xff0c;…...

MFC基础学习应用

MFC基础学习应用 1.基于对话框的使用 左上角为菜单键&#xff08;其下的关于MFC主要功能由IDD_ABOUTBOX决定) 附图 右下角为按钮&#xff08;基本功能由IDD_DIALOG决定,添加按钮使用由左上角的工具箱完成) 附图 2.自行添加功能与按钮//功能代码 void CMFCApplication4Dlg:…...

Gradle实现类似Maven的profiles功能

版本说明 GraalVM JDK 21.0.3Gradle 8.7Spring Boot 3.2.5 目录结构 指定环境打包 application.yml/yaml/properties 执行 bootJar 打包命令前要先执行 clean【其它和 processResources 相关的命令也要先执行 clean】&#xff0c;否则 active 值不会变&#xff01; spring…...

【强化学习】gymnasium自定义环境并封装学习笔记

【强化学习】gymnasium自定义环境并封装学习笔记 gym与gymnasium简介gymgymnasium gymnasium的基本使用方法使用gymnasium封装自定义环境官方示例及代码编写环境文件__init__()方法reset()方法step()方法render()方法close()方法 注册环境创建包 Package&#xff08;最后一步&a…...

TLE9879的基于Arduino调试板SWD刷写接口

官方的Arduino评估板&#xff0c;如下图所示&#xff1a; 如果你有官方的调试器&#xff0c;应该不用关注本文章&#xff0c;如下图连接就是&#xff1a; 如果&#xff0c;您和博主一样需要自己飞线的话&#xff0c;如下图所示&#xff1a;PCB的名称在右边整理&#xff0c;SWD的…...

基于 Delphi 的前后端分离:之五,使用 HTMX 让页面元素组件化之面向对象的Delphi代码封装

前情提要 本博客上一篇文章&#xff0c;描述了使用 Delphi 作为后端的 Web Server&#xff0c;前端使用 HTMX 框架&#xff0c;把一个开源的前端图表 JS 库&#xff0c;进行了组件化。 上一篇文章仅仅是描述了简单的前端代码组件化的可能性&#xff0c;依然是基于前端库的 JS…...

讲透计算机网络知识(实战篇)01——计算机网络和协议

一、计算机网络和协议 1、网络和互联网络 1.1 网络、互联网、Internet 用交换机、集线器连接在一起的计算机构成一个网络。 用路由器连接多个网络&#xff0c;形成互联网。 全球最大的互联网&#xff1a;Internet。 1.2 网络举例 家庭互联网 图中的无线拨号路由器既是路由…...

8个宝藏APP,个个都牛逼哈拉!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 目前win7已经逐渐淡出人们的视野&#xff0c;大部分人都开始使用win10&#xff0c;在日常工作和使用中&#xff0c;创客们下载神奇的软件能大幅提…...

使用docker构建java应用

1、docker简介 Docker是一个开源的容器化平台&#xff0c;可以帮助开发人员将应用程序及其依赖项打包成一个可移植的容器。容器化是一种轻量级的虚拟化技术&#xff0c;可以使应用程序在不同的操作系统和环境中具有一致的运行方式。 使用Docker带来的好处包括&#xff1a; 简…...

Oracle 存储过程

Oracle存储过程 创建存储过程 CREATE OR REPLACE PROCEDURE UPDATE_EMPLOYEE_SALARY(p_employee_id IN NUMBER,p_employee_salary IN NUMBER )AS BEGINUPDATE employeesSET salary p_employee_salaryWHERE employee_id p_employee_id;COMMIT;EXCEPTIONWHEN NO_DATA_FOUND T…...

下载站名文件

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 得到了请求地址与请求参数后&#xff0c;可以发现请求参数中的出发地与目的地均为车站名的英文缩写。而这个英文缩写的字母是通过输入中文车站名转换…...

345453

38744...

Java操作redis

目录 一&#xff1a;Jedis 二&#xff1a;使用Spring Data Redis Redis 的 Java 客户端很多&#xff0c;官方推荐的有三种&#xff1a; 1.Jedis 2.Lettuce 3.Redisson 同时&#xff0c;Spring 对 Redis 客户端进行了整合&#xff0c;提供了 Spring Data Redis&#xff0c;在S…...

【数据结构(邓俊辉)学习笔记】图03——拓扑排序

文章目录 0. 概述1. 零入度算法1. 1 拓扑排序1. 2 算法 2. 零出度算法2.1 算法2.2 实现2.3. 复杂度 0. 概述 学习下拓扑排序 1. 零入度算法 1. 1 拓扑排序 首先理解下拓扑排序 其实老师经常干这事&#xff0c;如编讲义&#xff0c;将已经知道的知识点串起来变成讲课序列。那…...

C#参数使用场景简要说明

C#参数使用场景简要说明 1、传值参数 方法、类成员的初始化 2、输出参数 方法返回值不能满足&#xff0c;需要多个返回值时&#xff1b; 3、引用参数 方法需要修改变量需带回原变量时&#xff1b; 4、具名参数 代码可读性高&#xff0c;参数可交换位置 5、方法扩展&#xff08…...

线性代数|机器学习-P10最小二乘法的四种方案

文章目录 1. 概述2. SVD奇异值分解3. 最小二乘法方程解4. 最小二乘法图像解释5. Gram-Schmidt 1. 概述 当我们需要根据一堆数据点去拟合出一条近似的直线的时候&#xff0c;就会用到 最小二乘法 .根据矩阵A的情况&#xff0c;有如下四种方法 在r n m 时&#xff0c;SVD奇异…...

【Android面试八股文】你能描述一下JVM中的类加载过程吗?

文章目录 一、Java类的生命周期二、JVM类加载过程1. 加载(Loading)2. 链接(Linking)a. 验证(Verification)b. 准备(Preparation)b.1 准备阶段的初始值b.2 用户定义的初值b.3 常量的初始化c. 解析(Resolution)3. 初始化(Initialization)3.1 什么是 `<clinit>`…...

MYSQL八、MYSQL的SQL优化

一、SQL优化 sql优化是指&#xff1a;通过对sql语句和数据库结构的调整&#xff0c;来提高数据库查询、插入、更新和删除等操作的性能和效率。 1、插入数据优化 要一次性往数据库表中插入多条记录&#xff1a; insert into tb_test values(1,tom); insert into tb_tes…...

鸿蒙轻内核M核源码分析系列二一 02 文件系统LittleFS

1、LFS文件系统结构体介绍 会分2部分来介绍结构体部分&#xff0c;先介绍LittleFS文件系统的结构体&#xff0c;然后介绍LiteOS-M内核中提供的和LittleFS相关的一些结构体。 1.1 LittleFS的枚举结构体 在openharmony/third_party/littlefs/lfs.h头文件中定义LittleFS的枚举、…...

【ARMv8/ARMv9 硬件加速系列 3 -- SVE 指令语法及编译参数详细介绍】

文章目录 SVE 汇编语法SVE 单通道谓词SVE 测试代码 SVE 软件和库支持SVE 编译参数配置-marcharmv8-alseprofilememtagsve2-aessve2-bitpermcryptosve2sve2-sha3sve2-sm4 SVE 汇编语法 在介绍 SVE 汇编指令语法之前&#xff0c;先介绍下如何判断自己所使用的芯片是否实现了SVE功…...

Java版+ SaaS应用+接口技术RESTful API 技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开

Java版 SaaS应用接口技术RESTful API WebSocket WebService技术开发的智慧医院HIS系统源码 专注医院管理系统研发 支持二开 医院住院管理系统&#xff08;Hospital Information System简称HIS&#xff09;是一门医学、信息、管理、计算机等多种学科为一体的边缘科学&#xff…...

工业机器人远程运维,增强智慧工厂运营管理

1、需求背景 随着工业自动化技术的普及和工业机器人应用的增加&#xff0c;制造业对于生产线稳定性和效率的要求不断提高。然而&#xff0c;传统的现场监控方式存在着地理位置限制、实时监控难度大以及诊断能力有限等问题&#xff0c;迫切需要一种更具灵活性和效率的监控方式。…...

理解Python的元类

1.type()函数 type 函数是一个内置函数&#xff0c;用来获取一个对象的类型。它可以接受一个参数&#xff0c;返回这个参数的数据类型。type也可以用来创建类&#xff0c;type就是元类 x333 list["ab"] tuple (1, "a", True, 3.14) dict {name: Alice,…...

web前端黑马下载:探索学习资源的海洋

web前端黑马下载&#xff1a;探索学习资源的海洋 在数字化时代&#xff0c;Web前端技术日益成为互联网行业的核心驱动力。为了跟上这一趋势&#xff0c;众多学习者纷纷投身于Web前端的学习之中。而在这个过程中&#xff0c;“黑马”作为一个备受瞩目的品牌&#xff0c;其Web前…...

最新版jd-gui下载

对于java开发的工程师来说&#xff0c;jd-gui应该是经常会用到的工具了 官网的jd-gui目前只支持到JAVA13&#xff0c;更新版本JAVA编译出来的JAR包就反编译不出来了 此版本支持到了JAVA23 如果需要win以外的其他版本&#xff0c;可以查看我的其他上传 如果不想花积分&#…...