強大的開源文檔問答工具-Kotaemon

Kotaemon 是一個基于 RAG(Retrieval-Augmented Generation)架構的開源文檔問答工具,為用戶提供與文檔對話的智能交互體驗。該項目同時服務于終端用戶和開發者,具有高度的可擴展性和定制化能力。

技術棧分析

核心技術棧

  1. 后端框架
    • Python 3.10+: 主要開發語言
    • Gradio: Web UI 框架,用于構建交互式界面
    • FastAPI/Flask: API 服務層(推測)
  2. AI/ML 技術棧
    • LangChain: LLM 集成和管道構建
    • Transformers: 模型推理和嵌入
    • llama-cpp-python: 本地 LLM 支持
    • Ollama: 本地模型管理
  3. 向量數據庫和檢索
    • ChromaDB: 默認向量數據庫
    • LanceDB: 高性能向量存儲
    • Elasticsearch: 全文搜索支持
    • Milvus/Qdrant: 可選向量數據庫
  4. 文檔處理
    • Unstructured: 多格式文檔解析
    • PDF.js: PDF 瀏覽器內預覽
    • Azure Document Intelligence: OCR 和表格解析
    • Adobe PDF Extract: 高級 PDF 內容提取
    • Docling: 開源文檔解析
  5. 部署和容器化
    • Docker: 容器化部署
    • Docker Compose: 多服務編排

支持的 LLM 提供商

  • OpenAI (GPT-3.5, GPT-4)
  • Azure OpenAI
  • Cohere
  • Groq
  • Ollama (本地模型)
  • 本地 GGUF 模型

項目優勢

1. 架構設計優勢

  • 模塊化設計: 高度解耦的組件架構
  • 混合檢索: 結合全文檢索和向量檢索
  • 多模態支持: 處理文本、圖像、表格等多種內容
  • 插件化架構: 易于擴展和定制

2. 用戶體驗優勢

  • 直觀的 Web UI: 基于 Gradio 的現代化界面
  • 多用戶支持: 支持用戶權限管理和協作
  • 實時預覽: 內置 PDF 查看器和高亮顯示
  • 詳細引用: 提供來源追溯和相關性評分

3. 技術實現優勢

  • 混合 RAG 管道: 提高檢索準確性
  • 復雜推理支持: 支持 ReAct、ReWOO 等智能體
  • GraphRAG 集成: 支持知識圖譜增強檢索
  • 本地化部署: 支持完全離線運行

4. 開發者友好

  • 豐富的文檔: 詳細的開發和使用指南
  • 可定制性強: 支持自定義推理和索引管道
  • Docker 支持: 簡化部署流程

項目劣勢

1. 性能局限性

  • 資源消耗: 多模型并行可能消耗大量內存
  • 處理速度: 復雜文檔解析可能較慢
  • 擴展性: 單機部署在大規模使用時可能存在瓶頸

2. 技術依賴

  • 版本沖突: 多個 AI 庫可能存在依賴沖突
  • API 依賴: 某些功能強依賴外部 API
  • 模型兼容性: 不同模型格式的支持程度不一

3. 維護復雜性

  • 配置復雜: 多種組件需要協調配置
  • 更新維護: AI 技術棧更新頻繁,維護成本高
  • 調試困難: 復雜的 RAG 管道難以調試

使用場景

1. 企業知識管理

  • 內部文檔檢索: 企業內部知識庫建設
  • 技術文檔問答: 開發團隊技術資料查詢
  • 合規文檔管理: 法務和合規文件智能檢索

2. 教育培訓

  • 學術研究: 研究論文和資料分析
  • 在線教育: 教材內容智能問答
  • 培訓材料: 員工培訓資料互動學習

3. 個人知識助手

  • 文檔整理: 個人文檔集合管理
  • 閱讀助手: 長文檔快速理解
  • 筆記系統: 智能筆記檢索和整理

4. 專業服務

  • 法律咨詢: 法律條文和案例檢索
  • 醫療文檔: 醫學資料和病歷分析
  • 金融報告: 財務文檔智能分析

代碼結構分析

主要目錄結構

kotaemon/
├── app.py                 # 主應用入口
├── flowsettings.py        # 應用配置
├── libs/
│   └── ktem/
│       ├── ktem/
│       │   ├── reasoning/    # 推理模塊
│       │   ├── index/        # 索引模塊
│       │   ├── retrieval/    # 檢索模塊
│       │   ├── llms/         # LLM 集成
│       │   └── embeddings/   # 嵌入模型
├── ktem_app_data/         # 應用數據存儲
├── docker/                # Docker 配置
└── docs/                 # 文檔

核心組件架構

1. 推理引擎 (Reasoning Engine)

python

# 簡化的推理管道接口
class ReasoningPipeline:def __init__(self, retriever, generator, reranker):self.retriever = retrieverself.generator = generatorself.reranker = rerankerdef process(self, query: str, documents: List[Document]):# 檢索相關文檔retrieved = self.retriever.retrieve(query, documents)# 重新排序reranked = self.reranker.rerank(query, retrieved)# 生成答案answer = self.generator.generate(query, reranked)return answer
2. 文檔索引系統

python

# 混合索引實現
class HybridIndex:def __init__(self, vector_store, text_store):self.vector_store = vector_store  # 向量檢索self.text_store = text_store      # 全文檢索def add_document(self, document):# 向量化存儲embeddings = self.embed(document.content)self.vector_store.add(document.id, embeddings)# 全文索引self.text_store.add(document.id, document.content)def search(self, query, top_k=10):# 混合檢索vector_results = self.vector_store.similarity_search(query, top_k//2)text_results = self.text_store.keyword_search(query, top_k//2)return self.merge_results(vector_results, text_results)

主要執行流程

1. 文檔上傳和索引流程

2. 問答查詢流程

開發示例

1. 自定義推理管道

python

from ktem.reasoning.base import BaseReasoning
from ktem.llms.manager import LLMManager
from ktem.retrieval.manager import RetrievalManagerclass CustomQAPipeline(BaseReasoning):"""自定義問答管道"""def __init__(self):super().__init__()self.llm_manager = LLMManager()self.retrieval_manager = RetrievalManager()def run(self, query: str, conversation_id: str = None):"""執行問答流程"""# 1. 預處理查詢processed_query = self.preprocess_query(query)# 2. 檢索相關文檔retrieved_docs = self.retrieval_manager.retrieve(query=processed_query,top_k=10)# 3. 文檔重排序reranked_docs = self.rerank_documents(processed_query, retrieved_docs)# 4. 構建上下文context = self.build_context(reranked_docs[:5])# 5. 生成答案prompt = self.create_prompt(processed_query, context)response = self.llm_manager.generate(prompt)# 6. 后處理final_answer = self.postprocess_answer(response, reranked_docs)return {"answer": final_answer,"sources": [doc.metadata for doc in reranked_docs[:3]],"confidence": self.calculate_confidence(response, reranked_docs)}def preprocess_query(self, query: str) -> str:"""查詢預處理"""# 可以添加查詢擴展、糾錯等邏輯return query.strip()def rerank_documents(self, query: str, docs: List) -> List:"""文檔重排序"""# 實現自定義重排序邏輯return sorted(docs, key=lambda x: x.score, reverse=True)def build_context(self, docs: List) -> str:"""構建上下文"""context_parts = []for i, doc in enumerate(docs):context_parts.append(f"文檔{i+1}: {doc.content}")return "\n\n".join(context_parts)def create_prompt(self, query: str, context: str) -> str:"""創建提示詞"""prompt = f"""基于以下上下文信息,回答用戶問題。請確保答案準確且有據可依。上下文信息:{context}用戶問題:{query}請提供詳細的答案,并指出信息來源:"""return promptdef postprocess_answer(self, response: str, docs: List) -> str:"""答案后處理"""# 可以添加答案驗證、格式化等邏輯return responsedef calculate_confidence(self, response: str, docs: List) -> float:"""計算置信度"""# 實現置信度計算邏輯return 0.85

2. 自定義文檔解析器

python

from ktem.index.file.base import BaseFileIndexRetriever
from typing import List, Dict, Anyclass CustomDocumentParser(BaseFileIndexRetriever):"""自定義文檔解析器"""def __init__(self, **kwargs):super().__init__(**kwargs)self.supported_extensions = ['.txt', '.md', '.json']def parse_document(self, file_path: str) -> Dict[str, Any]:"""解析文檔內容"""if file_path.endswith('.json'):return self.parse_json(file_path)elif file_path.endswith('.md'):return self.parse_markdown(file_path)else:return self.parse_text(file_path)def parse_json(self, file_path: str) -> Dict[str, Any]:"""解析JSON文檔"""import jsonwith open(file_path, 'r', encoding='utf-8') as f:data = json.load(f)# 提取文本內容text_content = self.extract_text_from_json(data)return {'content': text_content,'metadata': {'file_type': 'json','source': file_path,'structure': self.analyze_json_structure(data)}}def parse_markdown(self, file_path: str) -> Dict[str, Any]:"""解析Markdown文檔"""with open(file_path, 'r', encoding='utf-8') as f:content = f.read()# 提取標題和內容sections = self.extract_markdown_sections(content)return {'content': content,'metadata': {'file_type': 'markdown','source': file_path,'sections': sections}}def extract_text_from_json(self, data: Dict) -> str:"""從JSON中提取文本"""text_parts = []def extract_recursive(obj, path=""):if isinstance(obj, dict):for key, value in obj.items():new_path = f"{path}.{key}" if path else keyif isinstance(value, str):text_parts.append(f"{new_path}: {value}")else:extract_recursive(value, new_path)elif isinstance(obj, list):for i, item in enumerate(obj):extract_recursive(item, f"{path}[{i}]")extract_recursive(data)return "\n".join(text_parts)def extract_markdown_sections(self, content: str) -> List[Dict]:"""提取Markdown章節"""import resections = []lines = content.split('\n')current_section = Nonefor line in lines:if re.match(r'^#+\s', line):if current_section:sections.append(current_section)level = len(line) - len(line.lstrip('#'))title = line.lstrip('# ').strip()current_section = {'level': level,'title': title,'content': []}elif current_section:current_section['content'].append(line)if current_section:sections.append(current_section)return sections# 使用示例
parser = CustomDocumentParser()
document_data = parser.parse_document('example.json')

3. 自定義檢索器

python

from ktem.retrieval.base import BaseRetriever
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarityclass TfidfRetriever(BaseRetriever):"""基于TF-IDF的檢索器"""def __init__(self, **kwargs):super().__init__(**kwargs)self.vectorizer = TfidfVectorizer(max_features=10000,stop_words='english',ngram_range=(1, 2))self.document_vectors = Noneself.documents = []def add_documents(self, documents: List):"""添加文檔到索引"""self.documents.extend(documents)# 提取文檔內容doc_contents = [doc.page_content for doc in self.documents]# 訓練TF-IDF向量器self.document_vectors = self.vectorizer.fit_transform(doc_contents)def retrieve(self, query: str, top_k: int = 10) -> List:"""檢索相關文檔"""if self.document_vectors is None:return []# 將查詢轉換為向量query_vector = self.vectorizer.transform([query])# 計算相似度similarities = cosine_similarity(query_vector, self.document_vectors).flatten()# 獲取top-k結果top_indices = np.argsort(similarities)[::-1][:top_k]results = []for idx in top_indices:if similarities[idx] > 0:  # 過濾相似度為0的結果doc = self.documents[idx]doc.metadata['retrieval_score'] = similarities[idx]results.append(doc)return results

二次開發建議

1. 系統架構優化

分布式部署
  • 微服務化: 將檢索、生成、索引等功能拆分為獨立服務
  • 負載均衡: 使用 Nginx 或云負載均衡器分發請求
  • 緩存層: 引入 Redis 緩存常用查詢結果
  • 消息隊列: 使用 RabbitMQ 或 Kafka 處理異步任務
數據庫優化

python

# 數據庫連接池配置示例
from sqlalchemy import create_engine
from sqlalchemy.pool import QueuePoolengine = create_engine("postgresql://user:pass@localhost/kotaemon",poolclass=QueuePool,pool_size=20,max_overflow=30,pool_recycle=3600
)

2. 性能優化策略

檢索性能優化

python

class OptimizedRetriever:def __init__(self):self.cache = {}self.batch_size = 100def retrieve_with_cache(self, query: str, top_k: int = 10):cache_key = f"{query}_{top_k}"if cache_key in self.cache:return self.cache[cache_key]results = self.retrieve(query, top_k)self.cache[cache_key] = resultsreturn resultsdef batch_retrieve(self, queries: List[str]):"""批量檢索提高效率"""results = []for i in range(0, len(queries), self.batch_size):batch = queries[i:i + self.batch_size]batch_results = [self.retrieve(q) for q in batch]results.extend(batch_results)return results
異步處理

python

import asyncio
from concurrent.futures import ThreadPoolExecutorclass AsyncProcessor:def __init__(self, max_workers=4):self.executor = ThreadPoolExecutor(max_workers=max_workers)async def async_retrieve(self, query: str):"""異步檢索"""loop = asyncio.get_event_loop()return await loop.run_in_executor(self.executor, self.retriever.retrieve, query)async def async_generate(self, prompt: str):"""異步生成"""loop = asyncio.get_event_loop()return await loop.run_in_executor(self.executor,self.llm.generate,prompt)

3. 功能擴展建議

A. 多語言支持

python

class MultiLanguageProcessor:def __init__(self):self.language_detectors = {'zh': ChineseProcessor(),'en': EnglishProcessor(),'ja': JapaneseProcessor()}def detect_language(self, text: str) -> str:# 語言檢測邏輯passdef process_by_language(self, text: str, lang: str):processor = self.language_detectors.get(lang)if processor:return processor.process(text)return text
B. 實時協作功能

python

import websocket
import jsonclass CollaborationManager:def __init__(self):self.active_sessions = {}self.document_locks = {}def handle_user_action(self, user_id: str, action: dict):"""處理用戶協作行為"""if action['type'] == 'document_edit':self.broadcast_change(action, exclude_user=user_id)elif action['type'] == 'comment_add':self.save_comment(action)self.notify_collaborators(action)def broadcast_change(self, change: dict, exclude_user: str = None):"""廣播文檔變更"""for session_id, session in self.active_sessions.items():if session.user_id != exclude_user:session.send_message(change)
C. 高級分析功能

python

class AnalyticsEngine:def __init__(self):self.query_analyzer = QueryAnalyzer()self.performance_monitor = PerformanceMonitor()def analyze_user_behavior(self, user_id: str):"""分析用戶行為模式"""queries = self.get_user_queries(user_id)patterns = self.query_analyzer.identify_patterns(queries)return {'frequent_topics': patterns['topics'],'query_complexity': patterns['complexity'],'usage_trends': patterns['trends']}def generate_insights(self):"""生成系統洞察報告"""return {'popular_documents': self.get_popular_documents(),'query_success_rate': self.calculate_success_rate(),'performance_metrics': self.performance_monitor.get_metrics()}

4. 安全性增強

用戶認證和授權

python

from flask_jwt_extended import JWTManager, create_access_token
from werkzeug.security import check_password_hashclass AuthManager:def __init__(self):self.jwt = JWTManager()def authenticate_user(self, username: str, password: str):"""用戶身份驗證"""user = self.get_user(username)if user and check_password_hash(user.password_hash, password):access_token = create_access_token(identity=user.id)return {'access_token': access_token, 'user': user}return Nonedef authorize_document_access(self, user_id: str, document_id: str):"""文檔訪問授權"""document = self.get_document(document_id)return document.is_accessible_by(user_id)
數據加密

python

from cryptography.fernet import Fernetclass DataEncryption:def __init__(self, key: bytes = None):self.key = key or Fernet.generate_key()self.cipher = Fernet(self.key)def encrypt_document(self, content: str) -> bytes:"""加密文檔內容"""return self.cipher.encrypt(content.encode())def decrypt_document(self, encrypted_content: bytes) -> str:"""解密文檔內容"""return self.cipher.decrypt(encrypted_content).decode()

5. 監控和運維

系統監控

python

import logging
import time
from functools import wrapsclass SystemMonitor:def __init__(self):self.logger = logging.getLogger('kotaemon_monitor')self.metrics = {'request_count': 0,'error_count': 0,'avg_response_time': 0}def monitor_function(self, func):"""函數監控裝飾器"""@wraps(func)def wrapper(*args, **kwargs):start_time = time.time()try:result = func(*args, **kwargs)self.metrics['request_count'] += 1return resultexcept Exception as e:self.metrics['error_count'] += 1self.logger.error(f"Error in {func.__name__}: {str(e)}")raisefinally:duration = time.time() - start_timeself.update_response_time(duration)return wrapperdef update_response_time(self, duration: float):"""更新平均響應時間"""current_avg = self.metrics['avg_response_time']count = self.metrics['request_count']self.metrics['avg_response_time'] = (current_avg * (count - 1) + duration) / count

6. 部署建議

Docker Compose 生產配置

yaml

version: '3.8'
services:kotaemon-app:build: .ports:- "7860:7860"environment:- POSTGRES_URL=postgresql://user:pass@db:5432/kotaemon- REDIS_URL=redis://redis:6379- ELASTICSEARCH_URL=http://elasticsearch:9200depends_on:- db- redis- elasticsearchvolumes:- ./app_data:/app/ktem_app_datadeploy:replicas: 3resources:limits:memory: 4Gcpus: '2'db:image: postgres:15environment:POSTGRES_DB: kotaemonPOSTGRES_USER: userPOSTGRES_PASSWORD: passvolumes:- postgres_data:/var/lib/postgresql/dataredis:image: redis:7-alpinevolumes:- redis_data:/dataelasticsearch:image: elasticsearch:8.8.0environment:- discovery.type=single-node- xpack.security.enabled=falsevolumes:- elasticsearch_data:/usr/share/elasticsearch/datavolumes:postgres_data:redis_data:elasticsearch_data:
CI/CD 管道

yaml

# .github/workflows/deploy.yml
name: Deploy Kotaemonon:push:branches: [main]jobs:test:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: Set up Pythonuses: actions/setup-python@v4with:python-version: '3.10'- name: Install dependenciesrun: |pip install -r requirements.txtpip install -r requirements-dev.txt- name: Run testsrun: pytest tests/deploy:needs: testruns-on: ubuntu-lateststeps:- name: Deploy to productionrun: |docker-compose -f docker-compose.prod.yml up -d

總結

Kotaemon 是一個技術棧豐富、架構合理的開源 RAG 項目,具有很高的實用價值和擴展潛力。通過合理的二次開發,可以構建出滿足特定業務需求的智能文檔問答系統。建議開發者在使用時注重性能優化、安全防護和系統監控,以確保系統的穩定性和可擴展性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/99108.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/99108.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/99108.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

區塊鏈:搭建簡單Fabric網絡并調用智能合約

使用docker服務搭建Hyperledger/fabric網絡的詳細教程,實現構建多節點的簡單聯盟鏈,并編寫、調用智能合約實現投票業務。 目錄 背景知識 Hyperledger Fabric 基本組件 交易(Transaction) 智能合約 實驗目的 實驗環境 基礎依賴 安裝Golang 安裝do…

Web前端面試題(2)

Web前端面試題(附答案及解析)&#xff08;2025.9月最新版&#xff09;-CSDN博客 1.link 與 import 的區別和用法 主要區別 特性<link>import語法類型HTML標簽CSS規則加載方式并行加載&#xff08;與其他資源同時加載&#xff09;串行加載&#xff08;必須等待主CSS文件…

Paxos協議

目錄 Paxos 是什么&#xff08;What&#xff09; Paxos 的目的&#xff08;Why&#xff09; 角色與職責&#xff08;Who&#xff09; 基本流程&#xff08;How&#xff09; 常見問題與對策 什么是多數派&#xff08;Quorum&#xff09; Paxos vs Raft 異同點 Paxos 是什…

第十二篇:Qcom Camx打印實時幀率 FPS

一、第一種方式(有些低平臺可能沒有) adb shell setprop persist.vendor.camera.enableFPSLog TRUE adb shell setprop persist.vendor.camera.systemLogEnable TRUE adb shell setprop vendor.debug.camera.overrideLogLevels 0xff chi-cdk/core/chiframework/chxextensi…

TRAE通用6A規則+敏捷開發5S規則

網上研究別人的一些規則,也搞一份給大家 6A工作流項目規則 身份定義 你是一位資深的軟件架構師和工程師,具備豐富的項目經驗和系統思維能力。你的核心優勢在于: 上下文工程專家:構建完整的任務上下文,而非簡單的提示響應 規范驅動思維:將模糊需求轉化為精確、可執行的規…

【Nginx開荒攻略】Nginx主配置文件結構與核心模塊詳解:從0到1掌握nginx.conf:

目錄 引言 1 nginx.conf的整體結構 2 main全局塊詳解 2.1 核心指令解析 2.1.1 user&#xff1a;運行用戶 2.1.2 worker_processes&#xff1a;工作進程數 2.1.3 pid&#xff1a;PID文件路徑 2.1.4 worker_rlimit_nofile&#xff1a;文件描述符限制 2.2 main塊配置示例…

【前端教程】從基礎到優化:一個登錄頁面的完善過程

最近做了一個簡單的登錄頁面,主要練習了文本框的onfocus與onblur事件的使用。雖然功能實現了,但仔細想想還有不少可以改進的地方。今天就來分享一下這個登錄頁面的開發過程和優化思路。 初始實現與解析 先來看一下最初的實現代碼: <!DOCTYPE html> <html> &l…

獨家 | 抖音生活服務調整:涂晴接管市場和達人運營,旭凱擔任北部大區負責人

文/刀客doc(頭條精選作者)刀客doc獨家獲悉&#xff0c;9月8日抖音生活服務完成新一輪組織調整&#xff0c;并已在內部all hands完成官宣。此次調整主要涉及北部大區、達人運營與市場部三大條線的人事輪換與匯報關系變更。核心變動如下&#xff1a;涂晴&#xff0c;原抖音生活服…

class_9:java 抽象類和接口

抽象類 需要用abstract 修飾類和接口abstract class Person{String address;String name;abstract public void eat();abstract public void drink();public void printInfo(){System.out.println("name " name);}} class Student extends Person{public void eat()…

【C++】隊列queue的使用

語法 在 C 中&#xff0c;隊列的語法如下&#xff1a; #include <queue>// 聲明隊列 std::queue<Type> q;這里 Type 是隊列中存儲元素的數據類型。 常用操作 隊列提供了以下常用操作&#xff1a; empty(): 檢查隊列是否為空。 size(): 返回隊列中的元素數量。 fron…

HTTP 協議的基本格式

目錄 &#xff08;一&#xff09;HTTP是什么 &#xff08;二&#xff09;報文格式 &#xff08;1&#xff09;請求 ①首行 1.URL 2.方法&#xff08;method&#xff09; Ⅰ.GET Ⅱ.POST Ⅲ.PUT Ⅳ.DELETE 3.版本號 ②請求頭&#xff08;header&#xff09; 1.鍵值對…

計算機網絡的基本概念-2

1、數據交換技術&#xff1a;電路交換、報文交換與分組交換網絡核心部分的關鍵設備是路由器&#xff0c;其工作方式是分組交換。要理解分組交換&#xff0c;必須先了解其前兩種技術。1. 電路交換 (Circuit Switching)核心思想&#xff1a;通信前必須預先建立一條專用的物理通路…

車載網絡技術--SOME_IP協議詳解

文章目錄前言SOME/IP概念SOME/IP協議格式SOME/IP功能介紹序列化序列化規則發布和訂閱服務發現&#xff08;SOME/IP-SD&#xff09;SOME/IP-TP協議使用場景SOME/IP-TP協議參考文章&#xff1a;前言 本文介紹了SOME/IP協議的具體內容&#xff0c;包括報文格式&#xff0c;協議選…

JVM 核心知識全解析:從類加載到垃圾回收的深度認知

什么是JVM&#xff1f; JVM全稱&#xff08;Java Virtual Machine&#xff09;&#xff0c;中譯為&#xff1a;Java虛擬機 本質&#xff1a;是一個運行在計算機上的程序 職責&#xff1a;運行Java字節碼文件&#xff08;因為計算機只能認識機器碼文件&#xff0c;所以需要JVM將…

Keepalived 負載均衡

Keepalived 負載均衡 Keepalived 可以與 LVS&#xff08;Linux Virtual Server&#xff09;結合&#xff0c;提供強大的四層負載均衡功能。它通過 IPVS&#xff08;IP Virtual Server&#xff09;內核模塊實現高性能的負載分發。 核心組件 Virtual Server&#xff1a;虛擬服務器…

拷打DeepSeek實現自動生成差分電荷計算文件和后處理

差分電荷&#xff08;charge density difference&#xff09;是材料模擬中分析電子結構變化的直觀工具。 它把成鍵后的真實電荷密度減去成鍵前各碎片疊加的電荷密度&#xff0c;得到一張“電子遷移地圖” 于是可以一眼看出化學鍵形成時電子從哪里來到哪里去&#xff0c;表面吸…

AI問答-Nuxt4:什么時候發布的,有哪些特性,和Nuxt3相比 有哪些優勢 / Nuxt4 / Nuxt-v4

Nuxt 4于2025年7月至8月期間正式發布&#xff0c;作為Nuxt框架的重大版本更新&#xff0c;其核心聚焦于穩定性提升、開發者體驗優化及性能增強&#xff0c;與Nuxt 3相比&#xff0c;優勢體現在項目結構、數據獲取、類型系統、開發工具鏈等多個層面。一、Nuxt 4 發布時間線測試階…

isinstance()和insubclass()

??isinstance() 和 issubclass() 的功能與用法????1. isinstance(obj, classinfo)????功能??&#xff1a;檢查對象 obj 是否是 classinfo 類&#xff08;或其子類&#xff09;的實例。 ??返回值??&#xff1a;True 或 False。 ??用法??&#xff1a;class A…

判斷QMetaObject::invokeMethod()里的函數是否調用成功

今天&#xff0c;在Qt編程&#xff0c;碰到一個需要使用invokeMethod方式來獲取函數是否執行成功的情況。 ? ? invokeMethod()即可以同步調用&#xff0c;也可以異步調用。若調用者、被調用者&#xff0c;都在同一個線程&#xff0c;則是同步調用&#xff1b;若調用者、被調用…

【linux】特殊權限

us對文件&#xff1a;用戶執行該文件時&#xff0c;會以文件所有者的權限運行chmod us filename # 符號模式 chmod 4755 filename # 數字模式&#xff08;4表示SetUID&#xff09;典型應用&#xff1a;/usr/bin/passwd&#xff08;允許普通用戶修改自己的密碼&#xff0c;…