使用 LLM 命令行工具进行文本嵌入从 CLI 命令到 Python API 的完整指南【免费下载链接】llmAccess large language models from the command-line项目地址: https://gitcode.com/gh_mirrors/llm/llm本指南以docs/embeddings/index.md及其子页面docs/embeddings/cli.md、docs/embeddings/python-api.md、docs/embeddings/writing-plugins.md、docs/embeddings/storage.md为核心系统讲解 LLM 项目中的嵌入Embeddings能力如何把文本甚至图片转换为浮点向量、如何把向量存储进 SQLite 集合、如何做语义相似度搜索以及如何通过插件接入新的嵌入模型。读完本文你将能熟练使用llm embed、llm embed-multi、llm similar等命令能用 Python API 管理集合还能自己编写一个嵌入模型插件。什么是 Embeddings嵌入模型Embedding Model可以把一段文本——一个单词、一句话、一个段落甚至整篇文章——转换成一个浮点数数组。这个数组被称为嵌入向量embedding vector它是内容语义意义在一个高维空间中的数值化表示。通过计算嵌入向量之间的距离我们可以判断哪些内容在语义上与其他内容最近。这一能力可以用来构建相关文章推荐之类的功能也可以用来构建语义搜索semantic search用户可以搜索一个短语即使结果与搜索词不共享任何精确关键词也能返回语义相似的匹配项。部分嵌入模型例如 CLIP 这类多模态模型甚至可以直接处理图片等二进制文件从而实现以图搜图或者用一段文字搜索语义相近的图片。LLM 通过插件机制支持多种嵌入模型参见 插件体系。安装插件后嵌入模型即可在命令行或 Python API 中使用用来计算并存储内容的嵌入向量然后对这批向量执行相似度搜索。LLM 项目将这一整套能力拆分为四个相互衔接的层面也正是本文的四个主体章节命令行工具docs/embeddings/cli.mdllm embed、llm embed-multi、llm similar等命令Python APIdocs/embeddings/python-api.mdllm.Collection类与模型加载函数存储格式docs/embeddings/storage.md向量在 SQLite 中的二进制编码方式插件编写docs/embeddings/writing-plugins.md如何接入新的嵌入模型。命令行用 llm embed 计算单个向量llm embed命令用于计算一段内容的嵌入向量结果可以直接输出到终端、存入 SQLite 数据库或两者同时进行。把向量输出到终端最简单的用法是通过-c/--content选项传入内容llm embed -c This is some content -m 3-small这里的-m 3-small指定了 OpenAI 的text-embedding-3-small模型3-small是该模型在 LLM 中注册的别名。使用该模型前需要先用llm keys set openai设置 OpenAI API Key。如果你不想依赖已存储的 key 或环境变量也可以用--key选项直接传入 API Key。该选项同样适用于llm embed-multi命令。除了 OpenAI还可以安装插件使用其他模型。例如 llm-sentence-transformers 插件可以在本机运行 MiniLM-L6 等开源模型llm install llm-sentence-transformers llm embed -c This is some content -m sentence-transformers/all-MiniLM-L6-v2llm embed默认向终端输出一个 JSON 数组[0.123, 0.456, 0.789...]如果你已经设置了默认嵌入模型见下文llm embed-models default可以省略-m/--model选项。此外还可以通过环境变量LLM_EMBEDDING_MODEL为当前 shell 会话设置默认模型export LLM_EMBEDDING_MODEL3-small llm embed -c This is some content二进制格式输出除了 JSON 数组LLM 还提供了一种节省空间的二进制存储格式详见 嵌入存储格式 一节。可以用--format blob输出原始字节、--format hex输出十六进制、--format base64输出 Base64llm embed -c This is some content -m 3-small --format base64输出示例8NGzPFtdgTqHcZw7aUT6uWrwwpZo8XbSxv...处理二进制数据像 llm-clip 这类模型可以直接处理二进制数据如图片。用-i加--binary选项传入二进制文件llm embed --binary -m clip -i image.jpg也可以从标准输入读取cat image.jpg | llm embed --binary -m clip -i -把向量存储进 SQLite 集合嵌入向量只有存下来才有更大的价值——你可以在之后计算不同向量之间的相似度。LLM 引入了集合collection的概念一个集合是由同一个模型生成的、带唯一 ID 的一组嵌入向量。同时每条嵌入还保存了内容的哈希值用于后续避免对相同内容重复计算嵌入去重。这一去重逻辑在源码中有明确实现Collection.content_hash()使用 MD5 对文本UTF-8 编码后或二进制内容取摘要Collection.embed()在写入前会先按content_hash查询是否已存在参见 llm/embeddings.py。首先设置默认模型省去重复指定llm embed-models default 3-smallllm embed可以把结果直接存进命名集合llm embed quotations philkarlton-1 -c \ There are only two hard things in Computer Science: cache invalidation and naming things这条命令把给定文本存入quotations集合、ID 为philkarlton-1。第一个参数是集合名第二个参数是条目 ID。也可以把内容通过管道输入cat one.txt | llm embed files one这会把one.txt的内容以one为 ID 存入files集合。需要注意两个行为特征集合在第一次被提及时自动创建集合的嵌入模型是固定的即存入该集合的第一条向量所用的模型。上面例子中就是命令运行时处于生效状态的默认模型。下面这个例子把字符串my happy hound以hound为 ID 存入phrases集合并显式指定模型3-smallllm embed phrases hound -m 3-small -c my happy hound默认情况下嵌入存储于 LLM 管理的用户内容目录下的embeddings.db。运行llm collections path可以查看该目录的具体路径。如果想把嵌入存到别的 SQLite 数据库用-d/--database选项传入路径文件不存在时会自动创建llm embed phrases hound -d my-embeddings.db -c my happy hound这条命令会在当前目录创建my-embeddings.db数据库文件。同时存储内容与元数据默认情况下数据库表只保存条目 ID 和嵌入向量。用--store选项可以把原始文本副本存入content列llm embed phrases hound -c my happy hound --store用--metadata选项可以把包含任意元数据的 JSON 对象存入metadata列。下面的例子同时使用了--store与--metadatallm embed phrases hound \ -m 3-small \ -c my happy hound \ --metadata {name: Hound} \ --store这些额外存储的数据会在调用llm similar时一并返回llm similar phrases -c hound{id: hound, score: 0.8484683588631485, content: my happy hound, metadata: {name: Hound}}命令行用 llm embed-multi 批量嵌入llm embed一次只处理一条字符串而llm embed-multi可以一次性嵌入多条内容从而利用嵌入模型在处理批量输入时的效率优势。llm embed-multi有三种调用方式传入一个 CSV、TSV、JSON 或换行分隔 JSONnewline-delimited JSON文件传入一个 SQLite 数据库和一条 SQL 查询传入一个或多个目录路径每个目录配一个 glob 模式。三种方式都支持以下通用选项-m model_id指定嵌入模型-d database.db指定用于存储嵌入的不同数据库文件--store除嵌入向量外把原始内容也存入嵌入表--prefix为每个条目的 ID 加上前缀--prepend在嵌入前向内容前附加一段字符串--batch-size SIZE按指定大小分批处理嵌入。--prepend选项对需要前置特殊 token的模型尤其有用。例如nomic-embed-text-v2-moe模型要求文档内容以search_document: 开头、搜索查询以search_query: 开头。从 CSV、TSV 或 JSON 文件嵌入把文件作为第二个参数集合名之后传给命令即可。文件必须至少包含两列第一列是条目 ID后续所有列都被当作要嵌入的内容。CSV 文件示例id,content one,This is the first item two,This is the second itemTSV 与 CSV 相同只是用制表符替代逗号。JSON 文件可以是数组形式[ {id: one, content: This is the first item}, {id: two, content: This is the second item} ]也可以是换行分隔 JSON{id: one, content: This is the first item} {id: two, content: This is the second item}无论哪种格式都可以这样传给llm embed-multillm embed-multi items mydata.csv第一个参数是集合名第二个参数是文件名。也可以把内容通过标准输入管道传入用-表示标准输入cat mydata.json | llm embed-multi items -LLM 会自动检测数据格式。如果自动检测失败可以用--format显式指定。向标准输入管道传入换行分隔 JSON 时必须使用--formatcat mydata.json | llm embed-multi items - --format nl其他受支持的--format值还有csv、tsv和json。下面这个综合示例把 JSON 文件中的数据嵌入到items集合、数据库为docs.db、模型为3-small同时把原始内容存进embeddings表并为每个 ID 加上my-items/前缀llm embed-multi items mydata.json \ -d docs.db \ -m 3-small \ --prefix my-items/ \ --store从 SQLite 数据库嵌入用--sql选项可以从 SQLite 数据库读取数据必要时配合--attach附加另一个数据库。如果源数据与嵌入存储在同一数据库llm embed-multi docs \ -d docs.db \ --sql select id, title, content from documents \ -m 3-small这里的docs.db中含有一个documents表我们提取其中的title与content两列进行嵌入结果存回同一数据库。如果源数据在另一个数据库用--attach附加并在 SQL 中使用alias.table形式引用llm embed-multi docs \ -d embeddings.db \ --attach other other.db \ --sql select id, title, content from other.documents \ -m 3-small从目录中的文件嵌入LLM 可以嵌入指定目录下每个文本文件的内容以文件路径和文件名作为 ID。假设目录结构如下docs/aliases.md docs/contributing.md docs/embeddings/binary.md docs/embeddings/cli.md docs/embeddings/index.md docs/index.md docs/logging.md docs/plugins/directory.md docs/plugins/index.md要嵌入所有这些文档可以运行llm embed-multi documentation \ -m 3-small \ --files docs **/*.md \ -d documentation.db \ --store这里的--files docs **/*.md表示扫描docs目录中匹配**/*.mdglob 模式的文件——该模式会匹配任意嵌套目录下的 Markdown 文件。命令执行后embeddings表将包含如下 IDaliases.md contributing.md embeddings/binary.md embeddings/cli.md embeddings/index.md index.md logging.md plugins/directory.md plugins/index.md每个 ID 对应该文件内容的嵌入。用--prefix可以为每个 ID 加前缀llm embed-multi documentation \ -m 3-small \ --files docs **/*.md \ -d documentation.db \ --store \ --prefix llm-docs/结果 ID 变为llm-docs/aliases.md llm-docs/contributing.md llm-docs/embeddings/binary.md llm-docs/embeddings/cli.md llm-docs/embeddings/index.md llm-docs/index.md llm-docs/logging.md llm-docs/plugins/directory.md llm-docs/plugins/index.md文件默认按 UTF-8 解码如果遇到编码错误LLM 会回退到latin-1。可以用--encoding选项指定一组不同的编码按顺序尝试。下面这个例子先尝试utf-16再尝试mac_roman最后回退到latin-1llm embed-multi documentation \ -m 3-small \ --files docs **/*.md \ -d documentation.db \ --encoding utf-16 \ --encoding mac_roman \ --encoding latin-1如果某个文件读取失败错误会记录到标准错误脚本会继续运行而不会中断。如果要嵌入图片之类的二进制内容配合 CLIP 使用加上--binary选项llm embed-multi photos \ -m clip \ --files photos/ *.jpeg --binary命令行用 llm similar 做相似度搜索llm similar命令基于余弦相似度cosine similarity在嵌入集合中检索与给定内容或条目 ID 最相似的条目。注意当前实现采用慢速的暴力遍历brute-force方式对大规模集合扩展性不佳。官方计划通过插件提供的向量索引引入更可扩展的方案。搜索quotations集合中与computer science语义相似的条目llm similar quotations -c computer science该命令先嵌入提供的字符串然后返回一个换行分隔的 JSON 对象列表{id: philkarlton-1, score: 0.8323904531677017, content: null, metadata: null}用-p/--plain可以让结果以纯文本而不是 JSON 返回llm similar quotations -c computer science -p输出示例philkarlton-1 (0.8323904531677017)还可以用-i filename与文件中的文本比较llm similar quotations -i one.txt或者用-i -从标准输入读取文本echo computer science | llm similar quotations -i -使用 CLIP 这类模型时可以用-i filename加--binary查找与输入图片相似的图片llm similar photos -i image.jpg --binary用--prefix可以只展示 ID 以指定前缀开头的条目llm similar quotations --prefix movies/ -c star wars命令行模型管理与集合管理llm embed-models列出可用的嵌入模型列出所有可用嵌入模型含插件提供的llm embed-models输出大致如下OpenAIEmbeddingModel: text-embedding-ada-002 (aliases: ada, ada-002) OpenAIEmbeddingModel: text-embedding-3-small (aliases: 3-small) OpenAIEmbeddingModel: text-embedding-3-large (aliases: 3-large) ...叠加-q可以按关键词过滤模型llm embed-models -q 3-smallllm embed-models default查看与设置默认模型不带参数返回当前默认模型名称llm embed-models default设置默认模型llm embed-models default 3-small这会把默认模型设为 OpenAI 的3-small模型。模型注册的任何别名都可以传给该命令。取消默认模型llm embed-models default --remove-default当没有设置默认模型时llm embed和llm embed-multi命令必须用-m/--model显式指定模型。llm collections管理集合列出嵌入数据库中的所有集合llm collections list加--json输出 JSON 格式llm collections list --json加-d/--database指定不同的数据库文件llm collections list -d my-embeddings.db删除集合llm collections delete collection-name同样支持-d指定数据库文件llm collections delete collection-name -d my-embeddings.dbPython API加载模型与计算向量除命令行外LLM 还提供完整的 Python API。加载嵌入模型按模型 ID 或别名import llm embedding_model llm.get_embedding_model(3-small)调用.embed()方法嵌入字符串返回 Python 浮点数列表vector embedding_model.embed(my happy hound)可以用key直接传 API Key——既可以是 Key 本身也可以是通过llm keys set存储的 Key 别名vector embedding_model.embed(my happy hound, keysk-...)如果模型支持二进制输入可以把字节串传给.embed()。用supports_binary属性判断是否支持from pathlib import Path if embedding_model.supports_binary: vector embedding_model.embed(Path(my-image.jpg).read_bytes())embedding_model.supports_text属性则表明模型是否支持文本输入。许多嵌入模型在批量处理多条内容时效率更高。要一次嵌入多条字符串用.embed_multi()方法vectors list(embedding_model.embed_multi([my happy hound, my dissatisfied cat]))它返回一个生成器为每条字符串产出一个嵌入向量。embed_multi()也接受与embed()相同的key参数。嵌入按批次计算。默认所有内容在单个批次中处理除非底层模型自己定义了首选批次大小例如 OpenAI 系列模型的batch_size为 100参见 llm/default_plugins/openai_models.py。可以用batch_sizeN自定义批次大小vectors list(embedding_model.embed_multi(lines_from_file, batch_size20))从源码看EmbeddingModel.embed_multi()会根据self.batch_size模型定义或调用方传入的batch_size用islice分批调用_embed_batch()参见 llm/models.py。Python API用 Collection 类管理集合llm.Collection类用于在 Python 代码中操作嵌入集合。集合是一组命名嵌入向量与各自的 ID 一起存储在 SQLite 数据库表中。使用它需要一个 sqlite-utils Database 实例再连同集合名和所用嵌入模型的 ID 一起传给llm.Collection构造函数import sqlite_utils import llm # 使用内存数据库进程退出即丢弃 collection llm.Collection(entries, model_id3-small) # 或者持久化到磁盘 db sqlite_utils.Database(my-embeddings.db) collection llm.Collection(entries, db, model_id3-small) # 也可以用 model 直接传模型实例替代 model_id embedding_model llm.get_embedding_model(3-small) collection llm.Collection(entries, db, modelembedding_model)如果集合已存在于数据库中可以省略model或model_id参数——模型 ID 会从collections表读取。嵌入单条字符串并存入集合用embed()方法collection.embed(hound, my happy hound)这会把my happy hound的嵌入以hound为 ID 存入entries集合。可以传key...直接指定 API Keycollection.embed_multi()和collection.embed_multi_with_metadata()也接受该参数。加storeTrue可以把文本内容本身与嵌入向量一起存入数据库表。要给条目附加额外元数据把 JSON 兼容字典作为metadata参数collection.embed(hound, my happy hound, metadata{name: Hound}, storeTrue)元数据会以 JSON 形式存储在嵌入数据库表的metadata列中。批量存储collection.embed_multi()可以一次存储多个条目的嵌入对部分模型效率更高collection.embed_multi( [ (hound, my happy hound), (cat, my dissatisfied cat), ], # 加上这行以把字符串存入 content 列 storeTrue, )要为每条内容附带元数据调用embed_multi_with_metadata()collection.embed_multi_with_metadata( [ (hound, my happy hound, {name: Hound}), (cat, my dissatisfied cat, {name: Cat}), ], # 这里同样可以加 storeTrue storeTrue, )batch_size参数默认为 100除非嵌入模型自身定义了更小的批次大小。在嵌入大规模集合遇到内存问题时可以调小该值collection.embed_multi( ( (i, line) for i, line in enumerate(lines_in_file) ), batch_size10 )从源码看embed_multi_with_metadata()会先计算所有条目的content_hash跳过已存在的 ID 以去重再按min(batch_size, model.batch_size)分批调用模型并原子写入数据库参见 llm/embeddings.py。测试 tests/test_embed.py 验证了默认批次100 条一批共 100 批与自定义批次batch_size5时 200 批两种场景下 1000 条数据全部正确入库。Collection 类参考一个集合实例具有以下属性和方法id—— 集合在数据库中的整数 IDname—— 集合的字符串名称数据库中唯一model_id—— 该集合所用嵌入模型的字符串 IDmodel()—— 根据model_id返回对应的EmbeddingModel实例count()—— 返回集合中的条目数embed(id: str, value: str | bytes, metadata: dict[str, Any] | None None, store: bool False, *, key: str | None None)—— 嵌入给定值并以指定 ID 存入集合可选附带元数据存为 JSON、把文本或二进制内容存入表、传入 API Key 或已存储 Key 别名embed_multi(entries: Iterable[tuple[str, str | bytes]], store: bool False, batch_size: int 100, *, key: str | None None)—— 见上文embed_multi_with_metadata(entries: Iterable[tuple[str, str | bytes, dict[str, Any] | None]], store: bool False, batch_size: int 100, *, key: str | None None)—— 见上文similar(value: str | bytes, number: int 10, prefix: str | None None)—— 返回与给定值嵌入最相似的条目列表similar_by_id(id: str, number: int 10, prefix: str | None None)—— 返回与指定 ID 条目的嵌入最相似的条目列表similar_by_vector(vector: list[float], number: int 10, skip_id: str | None None, prefix: str | None None)—— 返回与给定嵌入向量最相似的条目列表可跳过指定 ID 的条目delete()—— 从数据库删除集合及其嵌入。此外还有Collection.exists(db, name)类方法返回布尔值用于判断集合在数据库中是否存在if Collection.exists(db, entries): print(The entries collection exists)需要说明的是Collection构造函数的createFalse参数源码见 llm/embeddings.py可以在集合不存在时抛出Collection.DoesNotExist异常这为只读场景提供了更严格的检查手段。检索相似条目集合填充完毕后用similar()方法检索与给定字符串最相似的条目。该方法同样是暴力遍历——对每个文档计算距离分数适合小型集合大规模集合下扩展性受限。for entry in collection.similar(hound): print(entry.id, entry.score)字符串会先被集合所用模型嵌入。返回的entry对象具有以下属性id—— 条目的字符串 IDscore—— 条目与查询字符串之间的浮点相似度分数content—— 条目的文本内容如果存过否则为Nonemetadata—— 条目的元数据字典来自 JSON如果存过否则为None。默认返回最相似的 10 条可以用number修改for entry in collection.similar(hound, number5): print(entry.id, entry.score)similar_by_id()接受集合中另一个条目的 ID基于其已存储的嵌入返回最相似条目该条目自身会从结果中排除for entry in collection.similar_by_id(cat): print(entry.id, entry.score)源码中similar_by_vector()把余弦相似度注册为 SQLite 函数后直接在 SQL 中排序取前 N 条参见 llm/embeddings.pycosine_similarity()的具体实现在 llm/init.py。测试 tests/test_embed.py 验证了similar、带前缀过滤的similar以及similar_by_id三种检索路径。SQL schema嵌入数据库的表结构嵌入数据库使用如下 SQL schema由迁移脚本 llm/embeddings_migrations.py 逐步构建CREATE TABLE collections ( id INTEGER PRIMARY KEY, name TEXT, model TEXT ) CREATE TABLE embeddings ( collection_id INTEGER REFERENCES collections(id), id TEXT, embedding BLOB, content TEXT, content_blob BLOB, content_hash BLOB, metadata TEXT, updated INTEGER, PRIMARY KEY (collection_id, id) )两点值得注意collections.name建有唯一索引保证集合名唯一embeddings表以(collection_id, id)为联合主键迁移从m001建表一路演进到m005新增content_blob列逐步加入了外键约束、updated时间戳列与content_hash去重列因此老数据库可以通过迁移平滑升级。存储格式向量的二进制编码llm embed命令的默认输出是浮点数 JSON 数组但 LLM 在存储时使用更节省空间的格式小端序的 32 位浮点数二进制序列每个浮点数占 4 字节存放在 SQLite 的BLOB列中。以下 Python 函数可以在该格式与浮点数数组之间互相转换import struct def encode(values): return struct.pack( f * len(values), *values) def decode(binary): return struct.unpack( f * (len(binary) // 4), binary)这两个函数在 LLM 中可直接使用即llm.encode()和llm.decode()实现见 llm/init.py。如果使用 NumPy可以这样解码一个二进制值import numpy as np numpy_array np.frombuffer(value, f4)这里的f4格式串让 NumPy 把数据按小端序 32 位浮点数序列处理。编写插件接入新的嵌入模型编写插件接入新嵌入模型前建议先阅读插件开发教程见 docs/plugins/tutorial-model-plugin.md了解插件的开发与打包流程。一个嵌入模型插件由两个部分组成register_embedding_models()钩子的实现接收一个register回调函数调用它把新模型注册进 LLM 插件系统一个继承llm.EmbeddingModel抽象基类的类该基类唯一必须实现的方法是embed_batch(texts)它接收一个字符串可迭代对象返回浮点数列表的迭代器。下面的示例使用 sentence-transformers 包提供 MiniLM-L6 嵌入模型import llm from sentence_transformers import SentenceTransformer llm.hookimpl def register_embedding_models(register): model_id sentence-transformers/all-MiniLM-L6-v2 register(SentenceTransformerModel(model_id, model_id), aliases(all-MiniLM-L6-v2,)) class SentenceTransformerModel(llm.EmbeddingModel): def __init__(self, model_id, model_name): self.model_id model_id self.model_name model_name self._model None def embed_batch(self, texts): if self._model is None: self._model SentenceTransformer(self.model_name) results self._model.encode(texts) return (list(map(float, result)) for result in results)调用托管 API 的嵌入模型应设置needs_key及可选的key_env_var并在embed_batch()中接受关键字参数key。LLM 会在调用该方法前解析显式 Key、已存储 Key 别名和环境变量class HostedEmbeddingModel(llm.EmbeddingModel): model_id hosted-embedding-model needs_key hosted key_env_var HOSTED_API_KEY def embed_batch(self, texts, *, keyNone): # key 是解析后的 API Key results hosted_client.embed(texts, api_keykey) return (list(map(float, result)) for result in results)key的值可以来自llm embed --key、llm embed-multi --key或 Python 侧的embed(..., key)与embed_multi(..., key)。为了兼容旧插件LLM 也支持embed_batch()不接受key参数的插件——此时解析后的 Key 会临时暴露为self.key兼容逻辑见 llm/models.py。插件安装后其模型即可配合llm embed命令使用cat file.txt | llm embed -m sentence-transformers/all-MiniLM-L6-v2或使用注册的别名cat file.txt | llm embed -m all-MiniLM-L6-v2支持二进制内容如果模型可以嵌入二进制内容用supports_binary属性声明class ClipEmbeddingModel(llm.EmbeddingModel): model_id clip supports_binary True supports_text Truesupports_text默认就是True此处可不写如果模型只支持二进制可以把它设为False。如果模型接受二进制输入你的.embed_batch()可能会收到 Python 字节串列表若模型同时接受两种类型这些字节串可能与普通字符串混在一起。从基类源码看EmbeddingModel还声明了batch_size类属性默认None表示不限制批次以及_check()对文本/二进制支持性的运行时校验参见 llm/models.pyOpenAIEmbeddingModel是needs_key、key_env_var与batch_size三者配合使用的现成范例参见 llm/default_plugins/openai_models.py。测试 tests/test_embed.py 还覆盖了仅二进制模型与仅文本模型的边界场景。延伸阅读嵌入 CLI 完整命令参考嵌入 Python API 详解嵌入存储格式说明编写嵌入模型插件指南插件体系总览相关测试tests/test_embed.py覆盖集合读写、相似度检索、批量嵌入与去重行为【免费下载链接】llmAccess large language models from the command-line项目地址: https://gitcode.com/gh_mirrors/llm/llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
3分钟吃透个人情况介绍源码解析与避坑指南 3分钟吃透个人情况介绍源码解析与避坑指南 官方文档往往长篇大论,让人一眼看过去就头晕,根本抓不住面试时该说什么。其实“个人情况介绍”在面试中不仅是礼仪,更是考察你逻辑表达与岗位匹配度的核心考点,其底层逻辑与代码中的 源码解析… · 2026/9/23 3:19:24
Rook 文件系统动态供给:从 CephFS 手动卷到 PVC/StorageClass 自动化编排 云原生存储容器编排运维 【免费下载链接】rook Storage Orchestration for Kubernetes 项目地址: https://gitcode.com/gh_mirrors/roo/rook 点击查看 免费下载 导读
本文围绕 Rook 仓库中的设计文档 dynamic-provision-filesystem.md 展开,深入剖析&q… · 2026/9/23 3:19:18
混合办公常态化下,2026团队协作工具选型与落地实战指南 1. 混合办公已是常态,协作工具从“能用”升级到“用好”过去几年,混合办公从应急方案变成了很多团队的默认工作模式。员工一周三天在办公室、两天在家,或者干脆全员分散在不同城市,已经不再是新鲜事。这件事带来的直接变化是&… · 2026/9/23 4:08:37
UE性能优化实战:GPU堆栈穿透与Texture Group拆解 做UE项目的性能分析,最怕的不是帧率低,而是拿到一份看起来完美无缺、实际上什么问题都没定位到的报告。stat gpu打开,每个Pass的耗时清清楚楚,可追问一句“到底是哪个材质、哪张贴图把这个Pass拖垮了”,很多人就卡住了… · 2026/9/23 4:08:37
C++ Qt实现宝石迷阵:桌面GUI工程能力实战指南 简介:本资源是一套完整可运行的高分本科毕业设计项目,基于C与Qt框架实现仿《宝石迷阵》(Bejeweled)的经典消除类游戏,专为计算机及相关专业本科生毕设、课程设计及C/Qt实战练习者打造。项目经导师指导并以99分高分通过… · 2026/9/23 4:08:37
UE5 UENUM完全指南:从反射原理到蓝图位掩码实战 1. 为什么蓝图里看不到你的枚举?——反射机制与UENUM的定位在开始之前,先说一个我经常在新手交流区看到的场景:C里明明定义好了枚举类型,编译也通过了,但打开蓝图编辑器,下拉列表里死活找不到这个枚举&… · 2026/9/23 4:08:37
从安全系数到失效概率:悬臂梁结构可靠性分析实战 一根设计完好的悬臂梁,按材料力学公式校核强度,安全系数取到1.5,按理说是稳稳当当的。可偏偏在实际使用中,它在远低于设计载荷的情况下出现了塑性变形。问题出在哪?不是公式算错,也不是材料以次充好&#x… · 2026/9/23 4:08:31
面试突击:搞懂40美金背后的技术深坑与新手避坑指南 面试突击:搞懂40美金背后的技术深坑与新手避坑指南 报错一堆看不懂?StackTrace 像天书一样刷屏,CPU 飙红,服务直接挂掉。这时候你慌不慌?别慌,这是 新手避坑… · 2026/9/23 4:08:31
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29