🚀 RAG高效召回实战(三):让知识库从被动存储到主动进化

70 阅读19分钟

📖 知识库全生命周期管理 | 主动进化 | 实战指南


📋 前言

在大模型时代,知识库不再是静态文档,而是决定问答效果的核心资产。我们总结了一套可落地、可度量、可复用的全生命周期管理方法:

核心能力技术方案核心价值
🔄 问题生成 + 检索优化LLM 自动生成多样问法 + BM25让知识"更容易被问到"
💬 对话知识沉淀自动提取 + 智能去重归并持续补全知识盲区
🩺 健康度体检完整性/时效性/一致性检查LLM 自动生成体检报告
🗂️ 版本管理与性能对比Embedding + 文本比对 + A/B测试支持回归验证与回滚

💡 核心理念:让知识库从"被动存储"走向"主动进化"


🔍 场景一:问题生成与检索优化

⚠️ 典型痛点

问题表现
🎯 问法多样性用户问法高度多样,和知识切片原文相似度不高
🔍 检索偏差传统基于原文的 BM25 / 关键词检索,经常「看上去像,实则答歪」
📉 长尾召回差长尾问题召回差,靠堆 Embedding 成本并不能完全解决

🎯 目标

在不大幅重构知识结构的前提下,通过:

  • 为每个知识切片生成多样化问题
  • 内容/问题双索引

显著提升命中率和长尾表现。

1.1 🤖 自动生成多样化问题

📊 两层问题生成策略

函数用途生成数量
generate_questions_for_chunk()为单个知识切片生成基础问题5 个
generate_diverse_questions()为重点切片生成更丰富、更复杂的问题8 个

🎯 设计要点

1. 问法多样化

  • 直接问 / 间接问 / 对比问 / 条件问 / 假设问 / 推理问等

2. 难度分层

  • 简单 / 中等 / 困难,方便用于构造评估集和教学用例

3. 角度多元

  • 时间、地点、价格、流程、注意事项、体验视角等

📝 Prompt 设计要点

角色:专业问答系统专家
目标:基于给定知识内容,生成多类型、不同难度、不同角度且不出界的问题
约束

  1. 不引入知识中不存在的信息(不脑补)
  2. 问题之间不能重复或只做同义改写
  3. 标注问题类型、难度和提问角度,必要时附 answer 字段
    输出:JSON 格式 questions 数组

💻 Prompt 示例

示例 1:为单个知识切片生成基础问题

instruction = """你是一个专业的问答系统专家。给定的知识内容能回答哪些多样化的问题,这些问题可以:
1. 使用不同的问法(直接问、间接问、对比问等)
2. 避免重复和相似的问题
3. 确保问题不超出知识内容范围

请返回JSON格式:
{
    "questions": [
        {
            "question": "问题内容",
            "question_type": "问题类型(直接问/间接问/对比问/条件问等)",
            "difficulty": "难度等级(简单/中等/困难)"
        }
    ]
}"""

示例 2:生成更多样化的问题(8个)

instruction = """你是一个专业的问答系统专家。请为给定的知识内容生成高度多样化的问题,确保:
1. 问题类型多样化:直接问、间接问、对比问、条件问、假设问、推理问等
2. 表达方式多样化:使用不同的句式、词汇、语气
3. 难度层次多样化:简单、中等、困难的问题都要有
4. 角度多样化:从不同角度和维度提问
5. 确保问题不超出知识内容范围

请返回JSON格式:
{
    "questions": [
        {
            "question": "问题内容",
            "question_type": "问题类型",
            "difficulty": "难度等级",
            "perspective": "提问角度",
            "is_answerable": "给出的知识能否回答该问题",
            "answer": "基于该知识的回答"
        }
    ]
}"""

1.2 🔍 内容 + 问题双 BM25 索引

在实现中分别为「知识原文」和「生成的问题+原文拼接」构建了 BM25 索引,其本质可以概括为:

索引类型构建方式适用场景
📄 内容索引以原文做分词、清洗和 BM25 建索引适合「问法接近原文」的场景
问题索引对「原文 + 生成问题」做联合分词,然后建立问题索引更适合「隐含问法和长尾问法」
🏷️ 元数据管理为每个文档记录 id / category / chunk / question_data方便后续评估和调试

💻 实现代码

# 原文索引
content_docs = [preprocess_text(c['content']) for c in kb]
content_bm25 = BM25Okapi(content_docs)

# 问题索引
question_docs = []
for c in kb:
    for q in c['generated_questions']:
        combined = f"内容:{c['content']} 问题:{q['question']}"
        question_docs.append(preprocess_text(combined))
question_bm25 = BM25Okapi(question_docs)

def search(query):
    tokens = preprocess_text(query)
    c_scores = content_bm25.get_scores(tokens)
    q_scores = question_bm25.get_scores(tokens)
    return fuse_scores(c_scores, q_scores)  # 例如线性加权、学习排序等

1.3 📊 检索评估与观察结论

🧪 测试代码

# 测试查询 - 设计更有挑战性的问题
test_queries = [
    {
        "query": "如果我想体验最刺激的过山车,应该去哪个区域?",
        "correct_chunk": knowledge_base[4]['content']
    },
    {
        "query": "什么时间去人比较少?",
        "correct_chunk": knowledge_base[2]['content']
    },
    {
        "query": "可以带食物进去吗?",
        "correct_chunk": knowledge_base[5]['content']
    }
]

# 为知识库生成问题
print('正在为知识库生成问题...')
for chunk in knowledge_base:
    chunk['generated_questions'] = optimizer.generate_questions_for_chunk(chunk['content'])
print('为知识库生成问题完毕')

# 评估检索方法
results = optimizer.evaluate_retrieval_methods(knowledge_base, test_queries)

📈 实验结果

基于 3 个「更有挑战性」的测试查询:

检索方法准确率说明
📄 原文 BM2566.7%3 条命中 2 条
问题 BM25100%全部命中
🚀 提升效果+0.845在「最刺激过山车去哪」这类隐性问法上,问题索引得分从 0.155 → 1.000,直接从错判变成 Top1 命中

💡 核心结论

重要发现:对非标准化问法,先把知识转成"问题空间"再检索,往往比直接在"文本空间"里检索效果更好。

✅ 落地建议

  • 🔧 把「问题生成 + 双索引 + 评估」封装成一个可配置模块,对不同知识分类启用/禁用
  • ⭐ 高价值类目(客服、价格、流程)优先开启问题生成
  • 🔮 后续可以进一步引入「向量检索」,构成 BM25 内容 + BM25 问题 + 向量的三模融合架构

💬 场景二:对话知识沉淀

⚠️ 典型痛点

问题表现
📊 更新滞后产品上线后,每天产生海量对话,但知识库更新节奏跟不上真实用户提问
🗑️ 内容嘈杂对话内容极其嘈杂:有需求、有情绪、有个性化背景,直接入库会把知识库"搞脏"
🔄 重复堆叠同一问题被反复回答,知识不断被复制粘贴、堆叠,越来越难维护

🎯 目标

  • ✅ 从对话中自动提取「可复用」的结构化知识点
  • 🚫 过滤掉「需求 / 一次性问题」,避免噪声入库
  • 🔀 对相似知识点自动合并,产出更精炼、更高置信度的新知识

2.1 📥 从对话提取结构化知识

📋 输出结构

通过 LLM 输出统一的 JSON 结构:

字段说明示例
knowledge_type知识类型事实 / 需求 / 问题 / 流程 / 注意
content知识内容本身具体知识描述
confidence置信度0-1 之间的数值
keywords关键词用于后续索引与聚合
category分类知识分类标签
conversation_summary对话摘要对话的简要总结
user_intent用户意图为运营和分析提供视角

💻 Prompt 示例

"""从单次对话中提取知识"""
instruction = """你是一个专业的知识提取专家。请从给定的对话中提取有价值的知识点,包括:
1. 事实性信息(地点、时间、价格、规则等)
2. 用户需求和偏好
3. 常见问题和解答
4. 操作流程和步骤
5. 注意事项和提醒

请返回JSON格式:
{
    "extracted_knowledge": [
        {
            "knowledge_type": "知识类型(事实/需求/问题/流程/注意)",
            "content": "知识内容",
            "confidence": "置信度(0-1)",
            "source": "来源(用户/AI/对话)",
            "keywords": ["关键词1", "关键词2"],
            "category": "分类"
        }
    ],
    "conversation_summary": "对话摘要",
    "user_intent": "用户意图"
}"""

💡 工程价值

  • ✅ 让非结构化对话直接映射到统一格式的「知识切片候选」,便于后续筛选和入库
  • 📊 为「用户意图分类」「热门需求分析」提供免费副产品

2.2 🚫 过滤掉"不该进库"的内容

💻 实现代码

# 过滤掉需求和问题类型的知识,因为它们是临时的、个性化的
filtered_knowledge = [
    knowledge for knowledge in knowledge_list
    if knowledge.get('knowledge_type') not in ['需求', '问题']
]

🎯 核心区分

知识类型处理方式说明
可复用知识沉淀进知识库事实、流程、注意事项等
一次性需求/问题不入库适合作为测试集、意图统计、产品需求输入,而不是入库回答未来所有人

💡 关键提示:这一步能极大降低知识库噪声,是对话沉淀中最容易被忽视、但非常关键的一道闸门。

2.3 🔀 用 LLM 合并相似知识,生成"更好"的新知识

📋 实现步骤

步骤 1:按 knowledge_type 分组,同一类型一起处理

# 按知识类型分组
knowledge_by_type = {}
for knowledge in filtered_knowledge:
    knowledge_type = knowledge.get('knowledge_type', '其他')
    if knowledge_type not in knowledge_by_type:
        knowledge_by_type[knowledge_type] = []
    knowledge_by_type[knowledge_type].append(knowledge)

# 对每个知识类型分别进行LLM合并
for knowledge_type, knowledge_group in knowledge_by_type.items():
    if len(knowledge_group) == 1:
        # 只有一个知识点,直接添加
        merged_knowledge.append(knowledge_group[0])
    else:
        # 多个知识点,使用LLM合并
        merged = self.merge_knowledge_with_llm(knowledge_group, knowledge_type)
        merged_knowledge.append(merged)

步骤 2:若同组内知识点 > 1,进行智能合并

prompt = f"""你是一个专业的知识整理专家。请将以下{knowledge_type}类型的知识点进行智能合并,生成一个更完整、准确的知识点。

### 合并要求:
1. 保留所有重要信息,避免信息丢失
2. 消除重复内容,整合相似表述
3. 提高内容的准确性和完整性
4. 保持逻辑清晰,结构合理
5. 合并后的置信度取所有知识点中的最高值

### 待合并的知识点:
{chr(10).join(knowledge_contents)}

### 请返回JSON格式:
{{
    "knowledge_type": "{knowledge_type}",
    "content": "合并后的知识内容",
    "confidence": 最高置信度值,
    "keywords": ["合并后的关键词列表"],
    "category": "合并后的分类",
    "sources": ["所有来源"],
    "frequency": {len(knowledge_group)}
}}"""

📊 实测效果

22 个原始知识点 
    ↓ 过滤
17 个知识点
    ↓ 合并
3 个高质量知识点

效果:这从工程上完成了「碎片 → 结构化切片 → 高质量百科段落」的升级。

✅ 落地建议

  • 📊 为每条合并后的知识记录 frequencysources,高频 + 多来源的知识优先展示
  • ⚠️ 给低置信度或高风险(价格、政策)知识设置人工复核阈值
  • 🔒 抽取前先对对话做脱敏,避免把隐私信息带入知识库

🩺 场景三:知识库健康度检查

⚠️ 典型痛点

问题表现
📊 质量未知知识库上线久了之后,很难回答「现在总体质量怎么样?」
时效性不明新增内容不断堆叠,老内容是否已过期无人知道
⚔️ 冲突增多不同来源的信息混在一起,冲突与矛盾越来越多

🎯 目标

  • 🔍 用 LLM 对知识库做「定期体检」:查缺失、查过期、查冲突
  • 📊 产出一份带有各项评分的健康度报告
  • ✅ 给出可执行的改进清单(补充、更新、消冲突)

🏥 核心功能

检查类型功能说明
完整性检查评估知识库是否覆盖用户的主要查询需求
时效性检查识别过期或需要更新的知识内容
⚔️ 一致性检查发现知识库中的冲突和矛盾信息
📊 综合评分提供量化的健康度评分和改进建议

3.1 ✅ 完整性检查:找"缺什么"

📋 输出结构

通过 Prompt 让 LLM 在「测试查询 + 知识库内容」上进行分析,输出:

字段说明
missing_knowledge[]对每个测试查询,列出缺失的知识方面、重要性,以及建议补充的内容
coverage_score整体覆盖率评分(0-1)
completeness_analysis文字版的完整性分析说明

💻 Prompt 示例

instruction = """你是一个知识库完整性检查专家。请分析给定的测试查询和知识库内容,判断知识库中是否缺少相关的知识。

检查标准:
1. 查询是否能在知识库中找到相关答案
2. 知识是否完整、准确
3. 是否覆盖了用户的主要需求
4. 是否存在知识空白

请返回JSON格式:
{
    "missing_knowledge": [
        {
            "query": "测试查询",
            "missing_aspect": "缺少的知识方面",
            "importance": "重要性(高/中/低)",
            "suggested_content": "建议的知识内容",
            "category": "知识分类"
        }
    ],
    "coverage_score": "覆盖率评分(0-1)",
    "completeness_analysis": "完整性分析"
}"""

3.2 ⏰ 时效性检查:找"过期的是什么"

针对价格、政策、活动等高时效性信息,Prompt 要求模型:

  • 📌 标出每条知识的 outdated_aspect(过期方面)和 severity(严重程度)
  • 💡 给出建议更新内容 suggested_update
  • 📊 输出整体新鲜度评分 freshness_score

💻 Prompt 示例

instruction = """你是一个知识时效性检查专家。请分析给定的知识内容,判断是否存在过期或需要更新的信息。

检查标准:
1. 时间相关信息是否过期(年份、日期、时间范围)
2. 价格信息是否最新(价格、费用、票价等)
3. 政策规则是否更新(政策、规定、规则等)
4. 活动信息是否有效(活动、节日、特殊安排等)
5. 联系方式是否准确(电话、地址、网址等)
6. 技术信息是否过时(版本、技术标准等)

请返回JSON格式:
{
    "outdated_knowledge": [
        {
            "chunk_id": "知识切片ID",
            "content": "知识内容",
            "outdated_aspect": "过期方面",
            "severity": "严重程度(高/中/低)",
            "suggested_update": "建议更新内容",
            "last_verified": "最后验证时间"
        }
    ],
    "freshness_score": "新鲜度评分(0-1)",
    "update_recommendations": "更新建议"
}"""

3.3 ⚔️ 一致性检查:找"哪里打架了"

🔍 检查角度

让 LLM 从以下角度扫描冲突:

  • 📍 同一主题的不同说法(地点、名称、描述)
  • 💰 价格 / 时间 / 规则政策 / 流程 / 联系方式等方面的不一致

📋 输出结构

字段说明
conflicting_knowledge[]冲突类型、相关切片 ID、冲突内容、严重程度、解决建议
consistency_score一致性评分(0-1)
conflict_analysis冲突分析说明

💻 Prompt 示例

instruction = """你是一个知识一致性检查专家。请分析给定的知识库,找出可能存在冲突或矛盾的信息。

检查标准:
1. 同一主题的不同说法(地点、名称、描述等)
2. 价格信息的差异(价格、费用、收费标准等)
3. 时间信息的不一致(营业时间、开放时间、活动时间等)
4. 规则政策的冲突(规定、政策、要求等)
5. 操作流程的差异(步骤、方法、流程等)
6. 联系方式的差异(地址、电话、网址等)

请返回JSON格式:
{
    "conflicting_knowledge": [
        {
            "conflict_type": "冲突类型",
            "chunk_ids": ["相关切片ID"],
            "conflicting_content": ["冲突内容"],
            "severity": "严重程度(高/中/低)",
            "resolution_suggestion": "解决建议"
        }
    ],
    "consistency_score": "一致性评分(0-1)",
    "conflict_analysis": "冲突分析"
}"""

✅ 落地建议

  • 📝 设计一套固定的「测试查询集」,包含高频问 + 长尾问 + 故意的无法回答问题
  • 🎫 把缺失、过期、冲突转成工单(Issue / 任务),分配到具体负责人
  • 🚨 为健康度设定阈值:低于某分数时限制发布新版本,必须先补齐

🗂️ 场景四:版本管理和性能比较

⚠️ 典型痛点

问题表现
效果不明知识库频繁更新,但「这次改好没好」说不清楚
🔄 缺乏回滚上线后才发现新版本把老问题搞挂了,缺乏回滚与回归机制
📊 无法量化多版本并行试验无法量化对比,只能凭感觉

🎯 目标

让知识库像代码一样:有版本号、有差异报告、有回归基线、有 A/B 测试与回滚方案。

🔧 核心功能模块

4.1 🔢 文本向量化模块

功能:将文本转换为 1024 维向量表示。相似语义的文本向量距离更近。

def get_text_embedding(text):
    """获取文本的 Embedding"""
    response = client.embeddings.create(
        model=TEXT_EMBEDDING_MODEL,
        input=text,
        dimensions=TEXT_EMBEDDING_DIM
    )
    return response.data[0].embedding

4.2 🗂️ 向量索引构建模块

功能:构建 FAISS 向量索引支持高效检索。

流程:遍历知识库 → 生成向量 → 创建索引 → 添加向量数据

def build_vector_index(self, knowledge_base):
    # 遍历知识库,生成向量和元数据
    for chunk in knowledge_base:
        vector = get_text_embedding(chunk['content'])
        metadata = {"id": i, "content": content, "chunk_id": chunk_id}
    
    # 创建FAISS索引并添加向量
    text_index = faiss.IndexFlatL2(1024)
    text_index.add_with_ids(vectors, ids)
    return metadata_store, text_index

4.3 🔍 版本差异检测模块

通过对两个版本的切片 ID 做集合运算,你可以快速识别:

变更类型说明
新增新增的知识切片
删除被删除的知识切片
🔄 修改ID 相同但内容不同的「修改切片」

应用场景

  • 📝 发布说明(Release Note)的输入
  • 🔍 审核时的对比材料
  • 🔙 回滚时确认影响面
def detect_changes(self, kb1, kb2):
    # 创建ID映射字典
    kb1_dict = {chunk['id']: chunk for chunk in kb1}
    kb2_dict = {chunk['id']: chunk for chunk in kb2}
    
    # 使用集合运算检测变化
    added_ids = set(kb2_dict.keys()) - set(kb1_dict.keys())
    removed_ids = set(kb1_dict.keys()) - set(kb2_dict.keys())
    common_ids = set(kb1_dict.keys()) & set(kb2_dict.keys())
    
    # 检测内容修改
    for chunk_id in common_ids:
        if kb1_dict[chunk_id]['content'] != kb2_dict[chunk_id]['content']:
            modified_chunks.append(...)

4.4 🔎 向量检索模块

功能:使用向量检索来评估不同版本下的检索能力

流程

  1. 查询向量化 → FAISS 搜索 → 取 Top-K 切片
  2. 通过「简单字符串匹配」评估检索质量(期望答案是否出现在任一检索结果中)
  3. 记录每个查询的响应时间,计算平均延迟
def retrieve_relevant_chunks(self, query, version_name, k=3):
    # 获取查询向量
    query_vector = get_text_embedding(query)
    
    # FAISS相似度搜索
    distances, indices = text_index.search(query_vector, k)
    
    # 构造返回结果
    for i, doc_id in enumerate(indices[0]):
        chunk = {
            "id": match["chunk_id"],
            "content": match["content"],
            "similarity_score": 1.0 / (1.0 + distances[0][i])
        }

4.5 📊 性能评估模块

功能:量化评估知识库检索性能

流程:执行测试查询 → 记录响应时间 → 评估准确性 → 计算综合指标

核心指标

指标计算公式说明
📈 准确率accuracy = 正确检索次数 / 总查询次数检索准确性
⏱️ 平均响应时间avg_response_time响应速度
🎯 扩展指标Top-K 命中率、NMSE 等可扩展的评估指标
def evaluate_version_performance(self, version_name, test_queries):
    # 遍历测试查询
    for query_info in test_queries:
        # 记录响应时间
        start_time = datetime.now()
        retrieved_chunks = self.retrieve_relevant_chunks(query, version_name)
        response_time = (end_time - start_time).total_seconds()
        
        # 评估检索质量
        is_correct = self.evaluate_retrieval_quality(query, retrieved_chunks, expected_answer)
    
    # 计算整体指标
    accuracy = correct_answers / total_queries
    avg_response_time = sum(response_times) / len(response_times)

4.6 ⚖️ 性能比较模块

功能:对比版本性能并生成建议

流程:分别评估 → 计算差异 → 权衡分析 → 生成推荐建议

原理:基于 A/B 测试思想,在相同测试集上比较两个版本的性能指标,计算改进幅度并权衡准确率和速度。

def compare_version_performance(self, version1_name, version2_name, test_queries):
    # 分别评估两个版本
    perf1 = self.evaluate_version_performance(version1_name, test_queries)
    perf2 = self.evaluate_version_performance(version2_name, test_queries)
    
    # 计算改进幅度
    accuracy_improvement = perf2['accuracy'] - perf1['accuracy']
    time_improvement = perf1['avg_response_time'] - perf2['avg_response_time']
    
    # 生成建议
    recommendation = self.generate_performance_recommendation(perf1, perf2)

4.7 🔄 回归测试模块

功能:确保版本更新不破坏原有功能

流程:执行测试用例 → 验证检索质量 → 统计通过情况 → 计算通过率

测试用例:在固定测试集上跑历史关键用例(如:在哪里?多少钱?营业时间?怎么去?有什么好玩的?)

通过率pass_rate = 通过测试数 / 总测试数,防止新版本出现功能倒退

def generate_regression_test(self, version_name, test_queries):
    # 执行测试用例
    for query_info in test_queries:
        retrieved_chunks = self.retrieve_relevant_chunks(query, version_name)
        is_passed = self.evaluate_retrieval_quality(query, retrieved_chunks, expected_answer)
        if is_passed:
            passed_tests += 1
    
    # 计算通过率
    pass_rate = passed_tests / total_tests

✅ 落地建议

  • 📝 版本命名建议采用:kb-{date}-{tag}-{seq},并附简要变更说明
  • 💾 保持上一个「健康可用版本」的索引与数据快照,一键回滚
  • 🎯 对关键路径问题(价格、政策、支付、合规等)建立固定回归基线,用脚本自动每次版本前跑一遍

✅ 快速落地清单

阶段任务说明
📋 准备阶段梳理现有知识切片,构造 20–50 条高质量测试查询高频 + 长尾 + 故意为难问
🔍 检索优化为高价值切片生成多样化问题,上线 BM25 内容 + 问题双索引视情况接入向量检索
💬 对话沉淀每天/每周对对话做抽取 → 过滤 → 合并 → 入库对低置信度和高风险知识做人工抽检
🩺 健康度体检定期跑完整性 / 时效性 / 一致性检查生成健康度报告和工单清单
🗂️ 版本治理每次较大变更都打版本号,做差异对比、性能评估和回归测试再灰度上线
🔒 安全底线不牺牲准确率和安全性冲突和过期项保持在可控范围内

❓ FAQ / 踩坑小结

💰 生成成本过高怎么办?

优先覆盖高流量类目,问题数量按类目分级控制;Prompt 中限制输出长度和问题数量。

🤖 如何防止 LLM「瞎编」?

Prompt 中明确「不得超出给定知识内容」,并把检索层和回答层解耦:检索严格基于索引,回答时只允许引用检索结果。

⚠️ 价格、政策这些高风险内容如何保证不出错?

对价格、政策、活动类知识单独打标签,体检时提高权重;强制定期复核或与权威数据源对账。

🔒 用户敏感信息会不会被写进知识库?

在对话抽取前增加一层脱敏与内容安全检查,对人名、电话、订单号等敏感字段做替换或过滤。


📝 总结

💡 核心理念:通过「生成 → 检索 → 沉淀 → 体检 → 版本」这个闭环,你的知识库不再是一次性工程,而会像一个可持续运营的产品,持续成长、可度量、可优化。


🎉 感谢阅读

如果你觉得本文有帮助,欢迎:

👍 点赞 | 👀 在看 | 📤 转发 | 💬 留言分享你的经验


📚 往期文章回顾

文章链接
🎯 RAG高效召回实战(二):双向改写、索引扩展三剑客点击查看
🎯 RAG高效召回实战(一):6大策略解决"找不准"难题点击查看
⚠️ RAG效果差,90%的问题出在这三个环节!点击查看
☁️ 论云智一体架构的AI应用与实现点击查看
🤖 项目实战-7×24小时在线的AI客服助手点击查看
📖 手把手教你用 RAG 打造专属知识库问答系统点击查看
🗄️ 一文看懂主流向量数据库:选型不再踩坑点击查看
🔢 AI 并不懂文字,它只认向量:一文搞懂 Embedding点击查看
✍️ 不会写提示词?难怪你的AI总在胡说八道!点击查看
🛠️ Spec Kit+Cursor:AI驱动的软件开发新范式点击查看

⭐ 持续更新中,敬请关注!