https://github.com/SylverQG/BlogsRSS feed of SylverQG's Blogs2025-10-21T12:33:09.796182+00:00SylverQGdoublc_qluv@163.compython-feedgenhttps://github.com/SylverQG/Blogs/issues/10LLM2025-10-21T12:33:10.846420+00:00快速入门RAG

来源:王海文

0.安装依赖库

%pip install -U langchain_community tiktoken langchain_openai chromadb langchain langchain_core
%pip install sentence_transformers
%pip install huggingface_hub
%pip install ipywidgets
%pip install unstructured
%pip install sentencepiece bs4

1.加载文档

from langchain_community.document_loaders import WebBaseLoader

url = "https://techdiylife.github.io/blog/202401/240327-ollama-20question.html"
loader = WebBaseLoader(
    web_paths=[url],
    requests_kwargs={
        "headers": {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
        }
    }
)
docs = loader.load()

2.文本切分

from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)
split_text = text_splitter.split_documents(docs)

3.向量化(Embedding)并存储

%pip install langchain_ollama socksio httpcore[socks]
from langchain_community.embeddings import OllamaEmbeddings
# from langchain_ollama import OllamaEmbeddings
from langchain_chroma import Chroma

# ollama下载embedding模型:https://ollama.ai/ 
# ollama pull mofanke/acge_text_embedding
# ollama pull qwen3-embedding:4b

embedding_model = OllamaEmbeddings(model="qwen3-embedding:4b")  # 参数名应为 model 而不是 model_name
vectorstore = Chroma.from_documents(documents=split_text, embedding=embedding_model)
retriever = vectorstore.as_retriever()
print("向量数据库构建完成")
向量数据库构建完成
/tmp/ipykernel_1796418/1638132037.py:8: LangChainDeprecationWarning: The class `OllamaEmbeddings` was deprecated in LangChain 0.3.1 and will be removed in 1.0.0. An updated version of the class exists in the `langchain-ollama package and should be used instead. To use it run `pip install -U `langchain-ollama` and import as `from `langchain_ollama import OllamaEmbeddings``.
  embedding_model = OllamaEmbeddings(model="qwen3-embedding:4b")  # 参数名应为 model 而不是 model_name
向量数据库构建完成

4.构建prompt模板

from langchain_core.prompts import ChatPromptTemplate

template = """你是一个回答问题的助手。请使用以下检索到的信息来回答问题。如果没有相关的信息,请回答"没有找到相关的信息。"。请用最多三句话来保持回答的简洁性

问题: {question}

背景: {context}

答案:
"""
prompt = ChatPromptTemplate.from_template(template) 


# 也可以从hub中加载
# from langchain import hub
# prompt = hub.load("tongshi/prompt_template_ragopenai")

5.初始化LLM

# 在线api
# import os
# from dotenv import load_dotenv
# from langchain_openai import ChatOpenAI

# load_dotenv() # loads contents of the .env file

# llm = ChatOpenAI(
#     openai_api_base="https://api.openai.com/v1",
#     openai_api_version="2020-11-07",
#     openai_api_key=os.getenv("OPENAI_API_KEY")
#     model="gpt-3.5-turbo",
# )
# ==============================================

# 本地ollama
from langchain_community.llms import Ollama
llm = Ollama(model="deepseek-r1:7b")
# from langchain_ollama import OllamaLLM
# llm = OllamaLLM(model="deepseek-r1:7b")

/tmp/ipykernel_1796418/3311084766.py:18: LangChainDeprecationWarning: The class `Ollama` was deprecated in LangChain 0.3.1 and will be removed in 1.0.0. An updated version of the class exists in the `langchain-ollama package and should be used instead. To use it run `pip install -U `langchain-ollama` and import as `from `langchain_ollama import OllamaLLM``.
  llm = Ollama(model="deepseek-r1:7b")

6.构建 RAG Chain

from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

def format_docs(docs):
    return "\n\n".join([f"{d.page_content}\n\n" for d in docs])

rag_chain = (
    {"context":retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

# RunnablePassthrough():将原始输入传送给下一个节点

7.执行查询

result = rag_chain.invoke("ollama支持哪些模型?")
print(result)
ollama支持的模型包括70b、8b等版本,具体取决于下载和配置。instruct标签通常指代中文生成模型,text标签则指代中文推理模型,默认为text-3.5-turbo-instruct。官方支持的详细信息可参考https://ollama.com/library。

8.批量测试

test_questions = [
    "ollama支持那些模型?",
    "Linux系统上,模型下载之后,模型存放在哪里?",
    "Windows系统上,如何修改默认下载位置?",
    "Modelfile是什么?",
    "如何导入safetensors格式的模型?",
    "有什么webui可用吗?",
]

for i,q in enumerate(test_questions[:3],start=1):
    print(f"问题 {i} : {q}")
    print(f"答案 {i} : {rag_chain.invoke(q)}\n")
问题 1 : ollama支持那些模型?
答案 1 : Ollama模型库中,70b和8b分别对应Qwen-7B和Qwen-8B模型;instruct是Instruct系列指令模型,text是专门的文本生成模型。

问题 2 : Linux系统上,模型下载之后,模型存放在哪里?
答案 2 : 在 Linux 系统上,默认情况下,下载好的模型会被存放在 `/home/<username>/.ollama/models` 的位置。

问题 3 : Windows系统上,如何修改默认下载位置?
答案 3 : 如何修改下载模型的默认存放目录?  
在 Windows 系统中,可以进入 Documentary 或 Document folder 设置,默认存储位置为 C:\Users\<username>\.ollama\models。打开系统属性,选择“文档”或“更多文件夹”,找到 ollama_models 文件夹并修改其路径。

关键技术点

1.通过Ollama使用Embeddinng模型

%ollama pull mxbai-embed-large
# 或
%ollama pull mofanke/acge_text_embedding
# 或
%ollama pull qwen3-embedding:4b
from langchain_community.embeddings import OllamaEmbeddings
# from langchain_ollama import OllamaEmbeddings
embedding_model = OllamaEmbeddings(model="qwen3-embedding:4b")

2.如何通过Ollama使用LLM

# 本地ollama
from langchain_community.llms import Ollama
llm = Ollama(model="deepseek-r1:7b")
# llm = Ollama(model="qwen3")

支持流式输出:

for chunk in llm.stream("讲个笑话"):
   print(chunk,end="",flush=True)

3.将Prompt提示词改为中文

prompt = hub.pull("rlm/rag-prompt")
prompt.message[0].prompt.template = """你是一个回答问题的助手。请使用以下检索到的信息来回答问题。如果没有相关的信息,请回答"没有找到相关的信息。"。请用最多三句话来保持回答的简洁性

问题: {question}

背景: {context}

答案: """

或者直接用ChatPromptTemplate.from_template()自定义

4.RAG是如何进行检索的

  1. 向量化:使用Embedding模型将文本转换为向量(如 mxbai-embed-large)
  2. 相似度计算:使用余弦相似度 (cosine similarity) 向量数据库中查找最接近的文档
  3. 返回Top-K:返回最相关的K个文档的上下文

retriever = vectorstore.as_retriever(search_kwargs={"k":3}) # 返回前三个结果

5.RAG是如何生成答案的

  1. 将用户问题+检索到的上下文 -> 拼接成Prompt
  2. 输入给LLM进行推理
  3. LLM仅基于上下文作答,避免进行幻觉

你是一个回答问题的助手。请使用以下检索到的信息来回答问题……

问题: {question}

背景: {context}

答案: """

6.Runnable 接口

Runnable 是LangChain的抽象接口,它定义了如何运行一个任务,支持统一调用各种组件(LLM, Prompt, Chain, Agent, Parser等)

核心方法:

  • .invoke(inputs): 运行一个任务,返回结果
  • .batch(inputs, batch_size=1): 批量运行任务,返回结果
  • .stream(inputs): 运行一个任务,返回结果,支持流式输出
  • .bind(**kwargs): 绑定参数,返回一个新的Runnable对象
  • .ainvoke(inputs): 异步运行一个任务,返回结果
  • .abatch(inputs, batch_size=1): 异步批量运行任务,返回结果

组合方式(LCEL):

chain = prompt | llm | StrOutputParser()
chain.invoke({"topic": "bears"})

7.修改为读取本地文档

# TXT文件
from langchain.document_loaders import TextLoader
loader = TextLoader('data/guide.txt')
docs = loader.load()

# HTML文件
from langchain.document_loaders import WebBaseLoader
loader = WebBaseLoader("example.html")
docs = loader.load()

# PDF文件(需要安装pypdf2)
from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("example.pdf")
docs = loader.load()

8.如何使用HuggingFace的Embedding模型

# from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_chroma import Chroma

model_name = "sentence-transformers/all-MiniLM-L6-v2"
model_kwargs = {"device": "gpu"}
ecode_kwargs = {"normalize_embeddings": False}
hf_embeddings = HuggingFaceEmbeddings(
    model_name=model_name, 
    model_kwargs=model_kwargs, 
    encode_kwargs=ecode_kwargs)
vector_store = Chorma.from_documents(splits, embedding=hf_embeddings)

9.使用HuggingFace的LLM

方法一:使用transformers+pipeline

from transformers import AutoModelForCausalLm, AutoTokenizer, pipeline
from langchain.llms import HuggingFacePipeline

model_id = "THUDM/chatglm3-6b"
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForCausalLm.from_pretrained(model_id, trust_remote_code=True, device_map="auto")
pipe = pipeline(task="text-generation", model=model, tokenizer=tokenizer, new_max_length=512)
llm = HuggingFacePipeline(pipeline=pipe)

方法二:使用from_model_id

from langchain_huggingface import HuggingFacePipeLine

llm = HuggingFacePipeLine.from_model_id(
    model_id="google/gemma2-7b",
    task="text-generation",
    device_map="auto",
    model_kwargs={"temperature": 0.7, "max_length": 512,"trust_remote_code": True}
)

RAG优化

方向 描述
模型升级 使用更大更强的模型
Embedding优化 使用更高效的Embedding模型
文本切分 调整chunk_size (256512)、overlap (50100)
检索策略 修改K 值 (15)、尝试similarity_threshold (0.70.9);过滤低分结果
Prompt工程 明确指令、限制输出格式、添加示例(few-shot)
引入Rerank 使用bge-rerank对检索结果重排序
]]>
2025-10-21T12:32:11+00:00
https://github.com/SylverQG/Blogs/issues/9Web Development2025-10-21T12:33:11.271844+00:00和风天气API使用指南

和风天气API

由腾讯元宝辅助生成

基于代码分析,和风天气API目前主要使用JWT认证方式,以下是详细使用说明:

一、认证方式

和风天气API采用JWT (JSON Web Token) 认证,替代了传统的API Key方式:

  1. 密钥生成

    • 需要生成Ed25519密钥对(公钥和私钥)
    • 私钥用于签名JWT,公钥需上传到和风天气控制台
    openssl genpkey -algorithm ED25519 -out ed25519-private.pem \
    && openssl pkey -pubout -in ed25519-private.pem > ed25519-public.pem
    
  2. JWT生成

    import jwt
    import time
    from cryptography.hazmat.primitives.serialization import load_pem_private_key
    
    def get_jwt():
        # 加载私钥
        with open('ed25519-private.pem', 'rb') as f:
            private_key = load_pem_private_key(f.read(), password=None)
        
        # 设置payload
        payload = {
            'iat': int(time.time()) - 30,  # 签发时间(提前30秒避免时间误差)
            'exp': int(time.time()) + 900,  # 过期时间(15分钟)
            'sub': PROJECT_ID  # 项目ID
        }
        
        # 设置headers
        headers = {'kid': KEY_ID}  # 密钥ID
        
        # 生成JWT
        encoded_jwt = jwt.encode(payload, private_key, algorithm='EdDSA', headers=headers)
        return encoded_jwt
    
  3. 使用方式

    • 在HTTP请求头中添加:Authorization: Bearer {JWT令牌}

二、API基本结构

  1. 基础URL

    https://{API_HOST}/{version}/{endpoint}
    
    • API_HOST: 和风天气分配的专属域名(如abcd.as.qweatherapi.com
    • version: API版本(如v7
    • endpoint: 具体接口(如weather/now
  2. 请求方法

    • 主要使用GET请求
  3. 请求参数

    • 通过URL查询字符串传递
    • 必需参数:location(城市ID或经纬度)
    • 可选参数:lang(语言)、number(结果数量)等

三、常用接口

  1. 城市查询接口

    def get_city_code(city, jwt_token):
        url = f"https://{API_HOST}/geo/v2/city/lookup?location={city}&number=1&lang=zh"
        headers = {'Authorization': f'Bearer {jwt_token}'}
        r = requests.get(url, headers=headers)
        data = r.json()
        if data.get("code") == "200" and data.get("location"):
            return data["location"][0]["id"]  # 返回城市ID
        return None
    
  2. 天气查询接口

    def get_weather(city_id, jwt_token):
        url = f"https://{API_HOST}/v7/weather/now?location={city_id}&lang=zh"
        headers = {'Authorization': f'Bearer {jwt_token}'}
        r = requests.get(url, headers=headers)
        data = r.json()
        if data.get("code") == "200" and data.get("now"):
            return data["now"]  # 返回天气数据
        return None
    

四、响应处理

API返回JSON格式数据,包含以下主要字段:

  • code: 响应状态码(200表示成功)
  • location: 位置信息(城市查询接口返回)
  • now: 实时天气数据(天气查询接口返回)

天气数据字段说明:

  • temp: 温度
  • text: 天气状况
  • windDir: 风向
  • windScale: 风力
  • humidity: 湿度
  • icon: 天气图标代码

五、完整示例流程

  1. 生成JWT令牌
  2. 使用城市名称获取城市ID
  3. 使用城市ID获取天气信息
  4. 解析并展示天气数据
# 完整流程示例
jwt_token = get_jwt()
city = "西安"
city_id = get_city_code(city, jwt_token)
weather = get_weather(city_id, jwt_token)

if weather:
    print(f"{city}的天气信息:")
    print(f"温度: {weather.get('temp', '未知')}°C")
    print(f"天气: {weather.get('text', '未知')}")
    print(f"风向: {weather.get('windDir', '未知')}")
    print(f"风力: {weather.get('windScale', '未知')}级")
    print(f"湿度: {weather.get('humidity', '未知')}%")

六、注意事项

  1. JWT令牌有效期为15分钟,过期后需重新生成
  2. 确保私钥安全存储,不要泄露
  3. 公钥需上传到和风天气控制台
  4. 城市查询接口返回的城市ID是获取天气的关键
  5. 遇到错误时,检查API_HOST、PROJECT_ID和KEY_ID是否正确
  6. 使用requests库时,添加异常处理确保程序稳定性

七、图

Image

八、代码

weather_widget.py

import jwt
import requests
import os
import time

from flask import Flask, jsonify, request
from flask_cors import CORS 

from cryptography.hazmat.primitives.serialization import load_pem_private_key
from cryptography.hazmat.backends import default_backend

app = Flask(__name__)
CORS(app) # CORS 跨域请求支持
# 配置信息
API_HOST = "" # https://console.qweather.com/setting?lang=zh
PROJECT_ID = "" # 项目ID
KEY_ID = "" # 凭据ID
PRIVATE_KEY_PATH = os.path.join(os.path.dirname(__file__), 'ed25519-private.pem')

def get_jwt():
    """生成JWT令牌"""
    with open(PRIVATE_KEY_PATH, 'rb') as f:
        private_key = load_pem_private_key(f.read(), password=None, backend=default_backend())

    payload = {
        'iat': int(time.time()) - 30,
        'exp': int(time.time()) + 900,
        'sub': PROJECT_ID
    }
    headers = {'kid': KEY_ID}
    
    return jwt.encode(payload, private_key, algorithm='EdDSA', headers=headers)

def get_city_code(city, jwt_token):
    """获取城市代码"""
    url = f"https://{API_HOST}/geo/v2/city/lookup?location={city}&number=1&lang=zh"
    headers = {'Authorization': f'Bearer {jwt_token}'}
    
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        data = r.json()
        if data.get("code") == "200" and data.get("location"):
            return data["location"][0]["id"]
    except Exception as e:
        app.logger.error(f"获取城市代码失败: {e}")
    return None

def get_weather(city_id, jwt_token):
    """获取天气信息"""
    url = f"https://{API_HOST}/v7/weather/now?location={city_id}&lang=zh"
    headers = {'Authorization': f'Bearer {jwt_token}'}
    
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        data = r.json()
        if data.get("code") == "200" and data.get("now"):
            return data["now"]
    except Exception as e:
        app.logger.error(f"获取天气失败: {e}")
    return None

@app.route('/weather', methods=['GET'])
def weather():
    """天气API端点"""
    city = request.args.get('city', '北京')
    
    jwt_token = get_jwt()
    if not jwt_token:
        return jsonify({"error": "JWT生成失败"}), 500
    
    city_id = get_city_code(city, jwt_token)
    if not city_id:
        return jsonify({"error": f"找不到城市: {city}"}), 404
    
    weather_data = get_weather(city_id, jwt_token)
    if not weather_data:
        return jsonify({"error": "天气数据获取失败"}), 500
    
    return jsonify({
        "city": city,
        "temperature": weather_data.get('temp', 'N/A'),
        "condition": weather_data.get('text', 'N/A'),
        "windDir": weather_data.get('windDir', 'N/A'),
        "windScale": weather_data.get('windScale', 'N/A'),
        "humidity": weather_data.get('humidity', 'N/A'),
        "icon": weather_data.get('icon', '100')
    })

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

weather.html

<!DOCTYPE html>
<html>
<head>
    <title>天气小组件</title>
    <style>
        .weather-widget { font-family: Arial, sans-serif; background: rgba(255,255,255,0.9); padding: 16px; border-radius: 24px; font-size: 14px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); width: 280px; margin: 20px auto; }
        .weather-form { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }
        .weather-form input { padding: 8px 12px; border: 1px solid #e0e0e0; border-radius: 16px; flex-grow: 1; }
        .weather-form button { padding: 8px 16px; background: #4285f4; color: white; border: none; border-radius: 16px; cursor: pointer; }
        .weather-info { display: flex; align-items: center; gap: 12px; }
        .weather-icon { font-size: 32px; min-width: 40px; text-align: center; }
        .weather-details { line-height: 1.5; }
        .temperature { font-size: 24px; font-weight: bold; }
        .condition { font-size: 16px; }
        .wind-humidity { font-size: 12px; color: #666; }
    </style>
    <link href="https://cdn.jsdelivr.net/npm/qweather-icons@1.7.0/font/qweather-icons.css" rel="stylesheet">
</head>
<body>
    <div class="weather-widget">
        <div class="weather-form">
            <input type="text" id="city-input" placeholder="输入城市名" value="西安">
            <button id="get-weather">查询</button>
        </div>
        <div class="weather-info" id="weather-container">
            <div class="weather-icon"><i class="qi-999" id="weather-icon"></i></div>
            <div class="weather-details">
                <div class="temperature" id="temperature">--°C</div>
                <div class="condition" id="condition">加载中...</div>
                <div class="wind-humidity">
                    <span id="wind">风向: --</span> | <span id="humidity">湿度: --%</span>
                </div>
            </div>
        </div>
    </div>

    <script>
        document.getElementById('get-weather').addEventListener('click', fetchWeather);
        window.addEventListener('DOMContentLoaded', fetchWeather);
        
        async function fetchWeather() {
            const city = document.getElementById('city-input').value;
            const container = document.getElementById('weather-container');
            const originalHTML = container.innerHTML;
            
            container.innerHTML = '<div style="text-align:center;padding:10px">加载中...</div>';
            
            try {
                const response = await fetch(`http://127.0.0.1:5000/weather?city=${encodeURIComponent(city)}`);
                const text = await response.text();
                const data = JSON.parse(text);
                
                if (data.error) {
                    container.innerHTML = `<div style="color:red;text-align:center">${data.error}</div>`;
                    return;
                }
                
                if (!data.temperature || !data.condition || !data.windDir || !data.windScale || !data.humidity || !data.icon) {
                    container.innerHTML = '<div style="color:red;text-align:center">数据不完整: 缺少必要字段</div>';
                    return;
                }
                
                container.innerHTML = originalHTML;
                document.getElementById('weather-icon').className = `qi-${data.icon}`;
                document.getElementById('temperature').textContent = `${data.temperature}°C`;
                document.getElementById('condition').textContent = data.condition;
                document.getElementById('wind').textContent = `风向: ${data.windDir} ${data.windScale}级`;
                document.getElementById('humidity').textContent = `湿度: ${data.humidity}%`;
                
            } catch (error) {
                console.error('请求错误:', error);
                container.innerHTML = `<div style="color:red;text-align:center">${error.name === 'SyntaxError' ? '数据格式错误' : '网络请求失败'}: ${error.message}</div>`;
            }
        }
    </script>
</body>
</html>
]]>
2025-08-04T16:41:43+00:00
https://github.com/SylverQG/Blogs/issues/8Update Note2025-10-21T12:33:11.778444+00:00我更新了一下Action里面需要的版本,似乎又make了,因为我重新看了一下仓库issues的更新的提示https://github.com/yihong0618/gitblog/issues/177需要把Backup文件夹删除

再次复制一下整个的yml

name: Generate README

on:
  issues:
    types: [opened, edited]
  issue_comment:
    types: [created, edited]
  push:
    branches:
      - main
    paths:
      - main.py

env:
  GITHUB_NAME: SylverQG
  GITHUB_EMAIL: doublc_qluv@163.com

jobs:
  sync:
    name: Generate README
    runs-on: ubuntu-latest
    if: github.repository_owner_id == github.event.issue.user.id || github.event_name == 'push'
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: 3.13
          cache: pip
          cache-dependency-path: "requirements.txt"
      
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          python -m venv venv
          source venv/bin/activate
          pip install -r requirements.txt
      
      - name: Generate new md
        run: |
          source venv/bin/activate
          python main.py ${{ secrets.G_T }} ${{ github.repository }} --issue_number '${{ github.event.issue.number }}'

      - name: Push README
        run: |
          git config --local user.email "${{ env.GITHUB_EMAIL }}"
          git config --local user.name "${{ env.GITHUB_NAME }}"
          git add BACKUP/*.md
          git commit -a -m 'update new blog' || echo "nothing to commit"
          git push || echo "nothing to push"
]]>
2025-08-02T10:37:49+00:00
https://github.com/SylverQG/Blogs/issues/7加速世界2025-10-21T12:33:12.219319+00:00GitHub 加速镜像

kgithub

一个公益加速项目,仅需在 github.com 前加上’k‘即可,若提示访问限制请刷新。

任意 github 的项目,均可在网址前面加上 k 变为 kgithub.com 就正常了,如无法使用大概率使用的是国外 IP 访问呢,该服务必须使用国内 ip 访问。

如:github.com/XIU2/UserScript 将链接更换后 https://github.com/X/UserScript https://kgithub.com/X/UserScript

github.hscsec.cn

一个国内加速项目,只需要把 github.com 替换为 github.hscsec.cn 就可以解决访问问题。

如:github.com/X/UserScript 将链接更换后 https://github.com/X/UserScript https://github.hscsec.cn/X/UserScript

]]>
2023-10-27T08:55:00+00:00
https://github.com/SylverQG/Blogs/issues/6math2025-10-21T12:33:12.663185+00:00考研数学一的高等数学部分的知识速记如下: 函数极限连续: 极限是高等数学的灵魂,函数连续很重要; 极限存在准则,洛必达法则很好用; 函数连续定义,间断点类型要分清。 导数与微分: 导数定义求导数,公式法则要掌握; 微分概念要理解,求导运算别出错。 中值定理: 拉格朗日中值定理,罗尔定理和柯西定理; 三个定理各自的应用,题目类型要分清。 不定积分与定积分: 不定积分换元法,分部积分法要掌握; 定积分定义别出错,原函数存在定理要清楚。 向量代数与空间解析几何: 向量代数别忘记,平面方程和空间直线方程; 空间曲面方程和曲线方程,投影曲线方程要记牢。 多元函数微分学: 多元函数概念要理解,偏导数和全微分要掌握; 多元函数极值和最值,条件极值要会做。 多元函数积分学: 多元函数积分定义,格林公式、斯托克斯公式要掌握; 二次积分和多重积分,选择方法计算别出错。 常微分方程: 常微分方程定义,解法和通解公式要掌握; 变量分离和恰当方程,降阶法要学会运用。 以上是考研数学一高等数学部分的速记口诀,希望对您有所帮助。


考研数学一的线性代数部分的知识点很多,以下是一些速记方法: 记住线性代数的基本概念,包括向量、矩阵、线性方程组、特征值、特征向量等。这些基本概念是理解后续知识点的基础。 掌握矩阵的运算,包括矩阵的加法、减法、乘法、转置等。这些运算在实际问题中经常用到,需要熟练掌握。 理解矩阵的行列式和秩的概念,掌握它们的计算方法。行列式和秩是矩阵的重要性质,对于解决线性方程组和特征值等问题非常重要。 掌握向量组的线性相关性和无关性的概念,掌握向量组极大线性无关组的计算方法。这些概念和计算方法是解决线性方程组和特征值等问题的基础。 掌握线性方程组的求解方法,包括克莱姆法则、高斯消元法、矩阵分解法等。这些方法在实际问题中经常用到,需要熟练掌握。 了解特征值和特征向量的概念,掌握特征值的计算方法和特征向量的求解方法。特征值和特征向量是矩阵的重要性质,对于解决线性方程组和相似对角化等问题非常重要。 掌握正交变换的概念和性质,包括正交矩阵的定义和性质、正交变换的性质等。正交变换是解决二次型等问题的基础,需要熟练掌握。 以上是一些考研数学一线性代数部分的速记方法,但这些知识点需要反复练习和巩固才能真正掌握。建议多做一些相关的练习题和模拟题,同时可以参考一些教材和辅导资料,加深对知识点的理解和记忆。


考研数学一的概率论部分的知识速记如下: 随机事件: 互斥对立加减功,条件立乘除清; 概逆概百分比,二项分布是核心; 然事件随便用,选择先试不可能。 随机变量及其概率分布: 随机变量注意分布,离散连续不可疏; 离散注意分布律,连续分布看密度; 分布函数两函数,考试只考求分布。 随机变量的数字特征: 期望方差加协方,数学期望定投方; 方差协方别混淆,期望方差均可用; 数字特征都适用,考试只考大期望。 大数定律和中心极限定理: 切比雪夫不等式,强大数律中心极; 切比雪夫考最多,其他三个考选择。 数理统计的基本概念: 总体个体犯错误,统计总体要犯错; 样本容量的定义,样本个体要记清; 样本均值与方差,两个统计别搞混; 总体分布函数好,样本分布函数妙。 参数估计: 点估计与区间估计,矩估计与最大似然估计; 点估计优缺点,区间估计优缺点; 最大似然优缺点,考试只考矩估计。 以上是考研数学一概率论部分的速记口诀,希望对您有所帮助。

]]>
2023-10-19T14:31:49+00:00
https://github.com/SylverQG/Blogs/issues/5ComputerNet2025-10-21T12:33:13.163724+00:00一、概述
  1. 计算机性能
    1. 速率(比特每秒bit/s):比特(bit):信息论中信息量的单位;网络技术中速率指的是数据的传送速率也称为数据率比特率
    2. 带宽(两种不同意义):
      1. 频域称谓,指信号具有的频带宽度,单位Hz
      2. 时域称谓,表示在单位时间内网络中某信道所能通过的“最高数据率”,单位比特每秒(bit/s);两者本质一样,一条通信链路的“带宽”越宽,传输的“最高数据率”自然越高
    3. 吞吐量:单位时间内通过某个网络(或信道、接口)的实际数据量。受网络的带宽或网络的额定速率的限制
    4. 时延:时延是指数据(一个报文或分组,甚至是比特)从网络(或链路)的一端传送到另一端所需的时间,有时也成为延迟或迟延
  • 发送时延(传输时延):主机或路由器发送数据帧所需要的时间
   发送时延=\frac{数据帧长度(b)}{发送速率(b/s)}
  • 传播时延:电磁波在信道中传播一定的距离需要花费的时间
   传输时延=\frac{信道长度(m)}{电磁波在信道上的传播率(m/s)}
  • 处理时延:主机或路由器在收到分组时需要花费一定的时间进行处理
  • 排队时延:结点缓存队列中分组排队所经历的时延(取决于网络当时的通信量);数据在网络中经历的总时延就是以上四种时延之和
  • 注:对于高速网络,提高的仅仅是数据的发送率不是比特在链路上的传播速率 5. 时延带宽积: $时延带宽积(体积)= 传播时延(长)\times 带宽(截面积)$,以比特为单位的链路长度 6. 往返时间(RTT):简单来说,就是两倍传播时延(实际上还包括处理时延,排队时延,转发时的发送时延) 7. 利用率:信道利用率 $\rightarrow$ 网络利用率(全网络的信道利用率的加权平均值) $D=\frac{D_0}{1-U}, D_0$表示网络空间时的延时, $D_0$表示网络空闲时时延, $U$为利用率, $D$表示网络当前的时延;可见信道利用率并不是越高越好,当某信道的利用率增大时,该信道引起的时延也就迅速增大。 减少方法是增大线路的带宽
  1. 计算机网络体系结构
    1. OSI/RM:开放系统互联参考模型(法律上的国际标准):简称OSI
    2. TCP/IP:事实上的国际标准
    3. 协议:为进行网络中的数据交换而建立的规则、标准或约定。三要素:语法(结构和格式),语义(动作),同步(顺序)
    4. 分层的好处
      1. 各层之间是独立的
      2. 灵活性好
      3. 结构上可分割开
      4. 易实现和维护
      5. 能促进标准化工作
    5. 五层体系结构
      1. 应用层:通过应用进程(正在运行的程序)间的交互来完成特定网络应用。(如DNS,HTTP,SMTP,FTP)
      2. 运输层:负责向两台主机中进程之间的通信提供的数据传输服务。(复用和分用)
        1. 传输控制协议TCP:提供面向连接的、可靠的数据传输服务,其数据传输单位是报文段
        2. 用户数据报协议UDP:提供无连接的、尽最大努力的数据传输服务(不保证可靠性),其数据传输单位是用户数据报
      3. 网络层:负责为分组交换网上的不同主机提供通信服务(TCP/IP体系中,分组也叫IP数据报)
      4. 数据链路层:将网络层交下来的IP数据报组装成帧,在两个相邻结点(主机和路由器之间或路由器之间)间的链路上传送帧;每一帧包括数据和必要的控制信息
      5. 物理层:透明地传送比特流(双绞线、同轴电缆、光缆、无线信道等不在物理层)
  2. 词语
    1. 实体:任何可发送或接受信息的硬件或软件进程
    2. 协议:控制两个对等实体(或多个实体)进行通信的规则的集合。(水平的)
    3. 在协议控制下,两个对等实体间的通信使得本层能够向上一层提供服务(垂直的)要实现本层协议,还需要使用下面一层所提供的服务
    4. 同一系统相邻两层的实体进行交互(即交换信息)的地方,称为服务访问SAP

二、物理层

  1. 基本概念
    • 机械特性(接口)
    • 电气特性(电压范围)
    • 功能特性(电压的意义)
    • 过程特征(顺序)
  2. 数据通信系统 一个数据通信系统可划分为三大部分,即源系统(发送端、发送方) $\rightarrow$ 传输系统(传输网络) $\rightarrow$ 目的系统(接收端、接收方)
    • 数据(data):运送消息的实体
    • 信号(signal):数据的电气的或电磁的表现
    • 模拟信号或连续信号(analogous):代表消息的参数的取值是连续的
    • 数字信号或离散信号(digital):代表消息的参数的取值是离散的
    • 码元(code):代表不同离散数值的基本波形
  3. 信道的基本概念 信道用来表示向某个方向传送信息的媒体;可以有以下三种基本方式
    1. 单向通信(单工通信):只能有一个方向的通信而没有反方向的交互(广播)
    2. 双向交替通信(半双工通信):通信的双方都可以发送信息,但不能双方同时发送(当然也就不能同时接收)这种通信方式是一方发送另一方接收,过一段时间后,可以再反过来
    3. 双向同时通信(全双工通信):通信的双方可以同时发送和接收信息
  4. 信道的极限容量
    1. 信道能够通过的频率范围(码间串扰):加宽频带
    2. 信噪比:信号的平均功率的噪声的平均功率之比;常记为 $S/N$,并用分贝(dB)作为度量单位。即: $信噪比(dB)=10\log_{10} (S/N)(dB)$
    3. 香农公式:信道的极限信息传输速率 $C=W\log_{2}(1+S/N) (bit/s)$;式中W为信道的带宽(单位Hz),S为信道内所传信号的平均功率,N为信道内部的高斯噪声功率
    4. 香农公式表明:信道的带宽或信道中的信噪比越大,信息的极限传输速率就越高。只要信息传输速率低于信道的极限传输速率,就一定存在某种方法实现无差错传输
  5. 信道复用技术
    1. 频分复用(FDM):所有用户在同样的时间占用不同的资源
    2. 时分复用(TDM)(同步时分复用):所有用户在不同的时间用同样的频带宽度;(更有利于数字信号的传输)
    3. 以上两种复用方法的优点是技术比较成熟,缺点是不够灵活
    4. 统计时分复用(STDM)(异步时分复用):动态分配时隙;集中器常使用统计时分复用
    5. 波分复用:光的频分复用
    6. 码分多址(码分多址CDMA):各用户使用不同的码型,因此各用户之间不会造成干扰。每个站分配的码片序列不仅必须各不相同,并且还必须互相正交(相乘为0,0写为-1,1写为+1)。在使用的系统中是使用为随机序列。
    7. 任何一个码片向量和该码片向量自己的规格内积都是 1;
    8. 任何一个码片向量和该码片反码的向量自己的规格内积都是 -1;
    9. 任何一个码片向量和其他该码片向量自己的规格内积都是 0;
  6. 宽带接入技术
    • ADSL(非对称数字用户线)技术:用数字技术对现有模拟电话用户线进行改造。ADSL的极限传输距离取决于数据率和用户线的线经(用户线越细,信号传输时的衰减就越大)
    • 光纤同轴混合网(HFC网)
    • FTTx技术:光纤到户FTTH
  7. 例:假定某信道受奈氏准则限制的最高码元速率为20000码元/元。如果采用振幅调制,把码元的振幅划分为16个不同的等级来传送,那么可以获得多高的数据率(b/s)答: $C = R \ast log_{2}{16} = 20000b/s \ast 4 = 80000b/s $
  8. 共有4个站进行CDMA通信。4个站的码片序列为 A. (-1-1-1+1+1-1+1+1) B. (-1-1+1-1+1+1+1-1) C. (-1+1-1+1+1+1-1-1) D. (-1+1-1-1-1-1+1-1) 现在受到这样的码片序列S:(-1+1-3+1-1-3+1+1)。问哪个站发送数据了发送数据的站发送的是0还是1? 解: $S\cdot A= (+1-1+3+1-1+3+1+1) / 8=1, A 发送1$ $S\cdot B= (+1-1-3-1-1-3+1-1) / 8=-1, B 发送0$ $S\cdot C= (+1+1+3+1-1-3-1-1) / 8=0, C 无发送$ $S\cdot D= (+1+1+3-1+1+3+1-1) / 8=1, D 发送1$
]]>
2023-10-06T14:56:13+00:00
https://github.com/SylverQG/Blogs/issues/4DataStructure2025-10-21T12:33:13.635811+00:00一、绪论|顺序表
  1. 数据元素、数据项以及数据结构三者之间的关系
  2. 逻辑结构、存储结构(物理结构)的区分
  3. 算法的特征与设计要求
  4. 时间复杂度、空间复杂度的理解与计算
  5. 线性表的定义与特点
  6. 顺序表的定义、特点以及操作
  7. 算法
    1. 顺序表的插入
    2. 顺序表的删除
    3. 顺序表的合并算法

二、链表|约瑟夫环

  1. 链表的特点
  2. 链表的定义
  3. 为什么要设置头节点
  4. 单链表的基本操作(查找、插入、删除、合并、头插法、尾插法)
  5. 链表的分类及其特征
  6. 约瑟夫环
  7. 算法
    1. 单链表的查找
    2. 单链表的插入
    3. 单链表的删除
    4. 表头插入法建立单链表
    5. 表尾插入法建立带头结点的单链表
    6. 表尾插入法建立不带头结点的单链表
    7. 两个有序单链表的合并
    8. 约瑟夫环算法

三、栈|队列

  1. 栈、队列的定义与特点
  2. 栈、队列的存储结构与基本操作
  3. 栈、队列的应用
  4. 循环队列
  5. 算法
    1. 顺序栈
      1. 初始化
      2. 元素入栈
    2. 链栈
      1. 初始化
      2. 入队
      3. 出队列
    3. 循环队列
      1. 初始化
      2. 入队
      3. 出队

四、串|压缩矩阵

  1. 串的基本运算
  2. 串的模式匹配、KMP
  3. 矩阵的压缩矩阵与三元组
  4. 算法
      1. 朴素的串匹配算法
      2. 模式匹配算法——KMP
      3. KMP模式匹配算法——求next[j]的算法
    1. 数组
      1. 三元组顺序表上的转置

四、树

  1. 树的定义和基本术语
  2. 二叉树的定义、基本运算、性质以及存储结构
  3. 二叉树的遍历(递归算法,非递归算法)
  4. 树和森林与二叉树的关系
  5. 森林与二叉树的转换及遍历
  6. 哈夫曼树的构造、哈夫曼编码
  7. 连接线索二叉树
  8. 算法
    1. 二叉树递归遍历
      1. 先须递归遍历
      2. 中序递归遍历
      3. 后序递归遍历
    2. 二叉树遍历非递归算法
      1. 先序遍历
      2. 中序遍历
    3. 中序线索二叉树
      1. 创建中序线索二叉树
      2. 中序线索二叉树上找指定结点的后继
    4. 哈夫曼编码和译码
      1. 哈夫曼编码
      2. 哈夫曼译码

五、图的遍历和图的遍历

  1. 图的基本术语
  2. 图的两种基本存储结构
  3. 图的遍历,广度、深度遍历结果的区别
  4. 图的应用(拓扑排序、最小生成树、最短路径、关键路径),掌握手动模拟
  5. 图的入度、出度计算
  6. 关键路径长度计算
  7. 算法
    1. 图的深度优先搜索遍历(DFS)
    2. 图的广度优先搜索遍历(BFS)
    3. 最小生成树
      1. Prim
      2. Kruskal
    4. 拓扑排序算法x
    5. 关键路径算法x
      1. 最早发生
      2. 最晚发生
      3. 输出关键路径、关键活动
    6. 最短路径
      1. Dijkstra
      2. Floyd

六、索引结构|散列技术

  1. 顺序表的查找
  2. 索引结构
  3. 有序表的查找(折半查找)
  4. 索引顺序表的查找
  5. 二叉排序树
  6. 平衡二叉树
  7. 哈希表(又称散列表)掌握开放地址法和拉链法
  8. 平均查找长度(ASL、 $ASL_{成功}$、 $ASL_{失败}$)
  9. 算法
    1. 常规
      1. 无序表的顺序查找
      2. 有序表的顺序查找
    2. 二叉排序树
      1. 二叉排序树的插入算法
      2. 二叉排序树的查找算法
      3. 二叉排序树的操作有多种形式
    3. 平衡二叉树
      1. 平衡二叉树
        1. RR
        2. LL
        3. LR
        4. RL
    4. 哈希表
      1. 构造方法
        1. 直接定址法
        2. 数字分析法
        3. 平方取中法
        4. 折叠法
        5. 除留余数法
      2. 冲突处理方法
        1. 开放定址法
        2. 链地址法
        3. 再哈希法
        4. 公共溢出区法

七、缩小规模算法

  1. 分治算法(分解、求解、合并)
  2. 二分查找
  3. 归并排序(二路归并排序、多路归并排序)
  4. 交换排序(冒泡排序、快速排序)
  5. 动态规划(矩阵连乘、重叠子问题、备忘录方法、图像压缩、最优二叉搜索树)
  6. 贪心算法
  7. 算法
    1. 简单算法
      1. 有序顺序表上的折半查找
      2. 直接插入排序
      3. 折半插入排序
      4. 归并算法
      5. 冒泡排序
    2. 动态规划
      1. 矩阵连乘
      2. 重叠子问题
      3. 备忘录方法
      4. 图像压缩
      5. 最有二叉搜索树
    3. 贪心算法
      1. 背包问题
      2. 0-1背包问题
]]>
2023-10-05T14:52:23+00:00
https://github.com/SylverQG/Blogs/issues/3Crypto2025-10-21T12:33:14.090662+00:00现代密码学目录(仅目录)

1. 基础

1.1 威胁

1.2 信息安全模型

1.3 密码学基本概念

1.4 古典密码

2. 流密码

2.1 基本概念

2.2 线性反馈移位寄存器

2.3 线性移位寄存器的一元多项式表达式

2.4 m序列的伪随机性

2.5 m序列密码的破译

2.6 非线性序列

3. 分组密码体制

3.1 概述

3.2 数据加密标准

3.3 差分密码分析与线性密码分析

3.4 分组密码的运行模式

3.5 IDEA

3.6 AES|Rijindael

3.7 SM4

3.8 祖冲之

4. 公钥密码

4.1 数学知识

4.2 基本概念

4.3 RSA

4.4 背包密码体制

4.5 NTRU

4.6 椭圆曲线密码体制

4.7 SM2椭圆曲线公钥密码加密算法

5. 密钥分配与密钥管理

5.1 单钥加密体制的密钥分配

5.2 公钥加密体制的密钥分配

5.3 随机数的产生

5.4 秘密分割

6. 消息认证与哈希函数

6.1 消息认证

6.2 哈希函数

6.3 MD5

6.4 安全哈希算法

6.5 HMAC

6.6 SM3

7. 数字签名和认证协议

7.1 基本概念

7.2 数字签名标准

7.3 其他签名方案

7.4 SM2椭圆曲线公钥密码签名算法

7.4 认证协议

8. 密码协议

8.1 基本协议

8.2 零知识证明

8.3 安全多方计算

9. 可证明安全

9.1 语义安全的公钥密码体制定义

9.2 语义安全的RSA的加密方案

9.3 Paillier公钥密码系统

9.4 Cramer-Shoup密码系统

9.5 RSA-FDH签名方案

9.6 BLS短签名方案

9.7 基于身份的密码体制

10. 网络加密与认证

10.1 网络通信加密

10.2 Kerberos认证系统

10.3 X.509认证业务

10.4 PGP

]]>
2023-09-21T14:01:39+00:00
https://github.com/SylverQG/Blogs/issues/2how issues go to the md?2025-10-21T12:33:14.541500+00:00
  • 本仓库搭建概况

  • 搭建过程的一些问题(遇到的,并从issue里总结的)

    1. cookbook依旧是https://github.com/yihong0618/gitblog/issues/177中的这些步骤,即
      • ①生成个人Token,并添加到仓库设置中。
      • ②文件.github/workflows/generate_readme.ymlenv项的nameemail设置更改为自己的
    2. .github/workflows/generate_readme.yml的其他修改如下:即添加注释的地方
        name: Generate README
        
        on:
          issues:
            types: [opened, edited]
          issue_comment:
            types: [created, edited]
          push:
            branches:
              - main
            paths:
              - main.py
        
        env:
          GITHUB_NAME: SylverQG
          GITHUB_EMAIL: doublc_qluv@163.com
        
        jobs:
          sync:
            name: Generate README
            runs-on: ubuntu-latest
            if: github.repository_owner_id == github.event.issue.user.id || github.event_name == 'push'
            steps:
              - name: Checkout
                uses: actions/checkout@v3
              - name: Set up Python
                uses: actions/setup-python@v3
                with:
                  python-version: 3.9
                  cache: pip
                  cache-dependency-path: "requirements.txt"
        
              # - name: Configure pip cache
              #   uses: actions/cache@v2
              #   id: pip-cache
              #   with:
              #     path: venv
              #     key: pip-1-${{ "hashFiles('**/requirements.txt')" }}
              #     restore-keys: |
              #       pip-
              
              - name: Install dependencies
                run: |
                  python -m pip install --upgrade pip
                  python -m venv venv
                  source venv/bin/activate
                  pip install -r requirements.txt
                # if: steps.pip-cache.outputs.cache-hit != 'true'
              
              - name: Generate new md
                run: |
                  source venv/bin/activate
                  python main.py ${{ secrets.G_T }} ${{ github.repository }} --issue_number '${{ github.event.issue.number }}'
        
              # - name: Push README
              #   uses: github-actions-x/commit@v2.9
              #   with:
              #     github-token: ${{ secrets.G_T }}
              #     commit-message: "UPDATE README"
              #     files: BACKUP/*.md README.md feed.xml
              #     rebase: 'true'
              #     name: SylverQG 
              #     email: doublc_qluv@163.com
        
              - name: Push README
                run: |
                  git config --local user.email "${{ env.GITHUB_EMAIL }}"
                  git config --local user.name "${{ env.GITHUB_NAME }}"
                  git add BACKUP/*.md
                  git commit -a -m 'update new blog' || echo "nothing to commit"
                  git push || echo "nothing to push"
    
  • 警告详情 actions/checkout@v2,actions/setup-python@v1,actions/cache@v1 update to actions/checkout@v3,actions/setup-python@v2,actions/cache@v2

  • Generate README
    Node.js 12 actions are deprecated. Please update the following actions to use Node.js 16: actions/setup-python@v2, actions/cache@v2. For more information see: https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/.
    
    1. 错误详情 github-actions-x/commit@v2.6 update to v2.9 (the latest) the error shows:
    Command line: | /usr/bin/git pull --rebase --autostash origin main
    Stderr:       | fatal: detected dubious ownership in repository at '/github/workspace'
                  | To add an exception for this directory, call:
                  | 
                  | 	git config --global --add safe.directory /github/workspace
    
    1. 错误详情 生成通过但是仓库没有变更 ,此时可以重新生成Token,重新添加到仓库的设置中。[这与本地的错误类似,即没有当前仓库的权限]
    remote: Permission to SylverQG/Blogs.git denied to github-actions[bot].
    fatal: unable to access 'https://github.com/SylverQG/Blogs/': The requested URL returned error: 403
    nothing to push
    
    ]]>
    2023-06-15T12:56:55+00:00
    https://github.com/SylverQG/Blogs/issues/1A New Try as Restart2025-10-21T12:33:15.001736+00:00A New Try

    To make blogs by the issues

    To say goodbye to the old world

    To put the ping in the e-world

    The new ID/github_repository

    • Sylver,即Silver,避免被注册哈哈
      • Silver Bullet: 杀狼人的特效武器,万金油,杀手锏,最强杀招,王牌,a simple solution to a complicated problem
      • 《名侦探柯南》中的两人有此称呼,琴说是赤井秀一,贝尔摩德认为还有江户川柯南
      • 希望我有朝一日可以值此新名
    • QG,名字大写缩写

    put the ping

    You will die but github long live.

    尝试了很多种类的github博客形式。、

    • 从本地编译上传的形式
    • 读取issue并有一套漂亮前端的形式
      • 二次元的 aurora 可惜没有高频维护,我自己还没学过[TypeScript 或者 JavaScript]
      • 简洁的 Marverick 本来想弄这个的,但好像失败了。那就考虑不如直接找到化繁为简
    • 终于本仓库暂时使用 gitblog

    Plan

    之后考虑从原来的GitHub仓库一点一点搬运,还是也把那个github.io也搞成这样,或者再找个好看的主题也不是不行

    ]]>
    2023-06-13T14:09:48+00:00