基于向量数据库与RAG技术构建LLM专属知识库实战

.net core 微信扫码支付1(扫码支付,h5支付,公众号支付,app支付)  在做微信支付前,首先要了解你需要什么方式的微信支付,目前本人做过的支付包含扫码支付、H5支付、公众号支付、App支付等,本人使用的是asp.net mvc core2.0框架开发,core技术目前国内用的不算多,所以本人总结使用asp.net mvc core开发微信支付的一些经验,之前都在博客园学习,没有写过文章,文笔差(技术也差哈哈),欢迎指正。   首先定义个微信支付参数保存的类,本人定... 阅读详情

1. 项目概述:从“通用回答”到“精准回复”的LLM连接实战

如果你最近在捣鼓大语言模型,大概率遇到过这样的场景:你问了一个具体问题,比如“我们汽车4S店怎么提升客户满意度?”,结果模型给你回了一堆“用心服务、真诚沟通”之类的万金油建议。听起来都对,但完全没法落地,因为它根本不知道你是一家4S店,更不了解你客户的具体反馈。这个项目要解决的,就是这个核心痛点——如何让LLM的回答从“泛泛而谈”变得“言之有物”。我们不再满足于让模型凭空想象,而是要通过技术手段,将我们自己的业务数据(比如海量的客户评价、产品文档、历史工单)注入到对话中,让模型的每一次回复都建立在真实、具体的上下文之上。

这背后的关键技术,就是向量数据库和嵌入模型。你可以把它们想象成给LLM装上一个“外部知识库”和“智能检索系统”。当用户提问时,系统不是让模型凭空编造,而是先从这个专属知识库里快速找到最相关的几段信息,然后把“问题”和“找到的资料”一起交给模型,让它基于这些资料来组织答案。这样生成的回复,不仅准确性大幅提升,而且充满了你业务特有的细节和术语,真正具备了实用价值。无论你是数据科学家想构建一个智能问答机器人,还是开发者希望为自己的应用增加AI能力,亦或是业务人员试图从内部文档中快速提取洞察,掌握这套“LLM连接术”都是当前最值得投入学习的实践技能之一。接下来,我将以一个汽车经销商客户评价分析的场景为例,带你从零开始,完整走通数据准备、向量化存储、语义检索到生成式回答的全流程,并分享我趟过的坑和总结出的实战技巧。

2. 核心思路拆解:为什么是“向量搜索+上下文注入”?

在深入代码之前,我们必须先搞清楚为什么单纯的LLM调用会得到“正确的废话”,以及我们即将构建的管道如何从根本上解决这个问题。这关乎你对整个系统设计的理解深度。

2.1 传统LLM调用的局限性:知识固化与语境缺失

当你直接调用像Gemini、GPT这样的模型时,你实际上是在与一个在庞杂互联网数据上训练出来的“通才”对话。它的知识截止于某个训练时间点,并且无法动态获取或记忆你提供给它的、训练数据之外的新信息(除非进行昂贵的微调)。这就是为什么它关于“客户满意度”的回答虽然正确,却无比空洞——它没有你公司具体的客户评价数据作为依据。此外,LLM有上下文窗口限制,你无法在一次对话中把成千上万条客户评价都塞给它。因此,核心矛盾在于:我们拥有宝贵的私有数据,但LLM无法直接、高效地利用它。

2.2 检索增强生成的技术范式

我们采用的方案,在学术和工业界被称为“检索增强生成”(Retrieval-Augmented Generation, RAG)。它的工作流像一个高效的“研究员-作家”组合:

  1. 研究员(检索器) :当用户提出一个问题(Query)时,系统不会直接把问题丢给LLM。而是先将问题本身转换成一个数学向量(称为“查询向量”),然后在一个存储了大量文档向量的数据库(向量数据库)中进行快速相似度搜索,找出与问题最相关的几个文档片段。
  2. 作家(生成器) :系统将这些检索到的相关片段,连同原始问题,一起打包成一个详细的“提示”(Prompt),发送给LLM。指令通常是:“请基于以下上下文信息来回答问题。如果上下文不包含答案,请说明你不知道。”
  3. 输出 :LLM基于提供的具体上下文生成答案,其准确性和相关性得到质的飞跃。

这个范式的优势非常明显: 无需重新训练模型 ,就能让LLM获得最新的、私有的知识;答案 可追溯 ,你可以知道模型是基于哪几条数据得出的结论;并且 成本可控 ,主要开销在于检索和提示工程,而非天价的模型微调。

2.3 关键组件选型:ChromaDB与嵌入模型

在这个项目中,我们选择ChromaDB作为向量数据库,选择Google的 text-embedding 模型来生成嵌入向量。这是基于以下几个现实的考量:

  • ChromaDB :它是一个开源、轻量级、易上手的向量数据库,特别适合原型开发和小到中型项目。它可以直接在内存或本地磁盘运行,无需复杂的服务部署(如Weaviate, Pinecone),降低了入门门槛。其Python API设计得非常直观,几行代码就能完成集合创建、数据插入和相似性搜索,让我们能快速聚焦于RAG流程本身,而非基础设施运维。
  • 嵌入模型 :嵌入模型负责将文本(无论是客户评价还是用户问题)转换为高维空间中的向量。我们使用Google的嵌入模型,主要是为了与后端的Gemini生成模型保持生态一致,减少跨平台调用的复杂性。更重要的是,同一个厂商的嵌入模型和生成模型通常在语义空间的对齐上做得更好,这意味着“检索到的内容”和“生成时理解的内容”一致性更高,能提升最终答案的质量。对于中文场景,你完全可以替换为OpenAI的 text-embedding-3-small 或本地部署的 BGE 、 M3E 等优秀开源模型。

注意 :嵌入模型的选择至关重要。一个糟糕的嵌入模型会导致“语义检索”失效,比如搜索“汽车油耗高”却找不到“燃油经济性差”的评价。在正式业务系统中,务必对不同的嵌入模型在你自己数据上的表现进行基准测试。

3. 环境准备与数据基础构建

理论清晰后,我们开始动手。一切从准备一个干净、可复现的Python环境开始。

3.1 依赖安装与初始配置

我强烈建议使用虚拟环境来管理项目依赖,避免包冲突。这里使用 venv :

# 创建并激活虚拟环境
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS/Linux
source .venv/bin/activate

# 安装核心依赖
pip install google-generativeai chromadb

接下来,我们需要安全地管理API密钥。永远不要将密钥硬编码在代码中或上传到版本控制系统(如Git)。标准做法是使用环境变量或配置文件。这里我们采用一个本地的 config.json 文件,并确保它被添加到 .gitignore 中。

创建 config.json 文件,内容如下:

{
  "gemini-secret-key": "YOUR_ACTUAL_GEMINI_API_KEY_HERE"
}

请前往Google AI Studio获取你的API密钥并替换其中的内容。

然后,我们编写初始化的代码,建立与Gemini模型的连接,并观察其“原始”表现。这段代码与项目描述中一致,目的是建立一个性能基线。

import json
from google import genai
from google.genai import types

# 1. 安全加载API密钥
with open("config.json", mode="r") as json_file:
    config_data = json.load(json_file)

# 2. 实例化Gemini客户端
gemini = genai.Client(api_key=config_data.get("gemini-secret-key"))

# 3. 定义系统指令和用户问题
context = "You are a customer success employee at a large car dealership."
question = "What's the key to great customer satisfaction? Under 200 words."

# 4. 发起原始API调用
response = gemini.models.generate_content(
    model="gemini-2.5-flash", # 使用免费、快速的模型
    config=types.GenerateContentConfig(
        system_instruction=context # 系统指令设定角色
    ),
    contents=question # 用户的实际问题
)

# 5. 打印结果
print("【基线测试 - 原始模型回答】")
print(response.text)
print("-" * 50)

运行这段代码,你会得到类似项目描述中的回答:“关键在于让每次互动都个性化,并真正理解交易背后的个体……” 这证实了我们的起点:一个正确但无用的通用答案。

3.2 准备业务数据:模拟客户评价

为了进行演示,我们需要一个数据集。在真实场景中,这可能来自你的CRM系统、调研表单或在线评价平台。这里,我们模拟生成一个包含多条客户评价的列表,每条评价都包含一些具体的细节。

# 模拟的客户评价数据
customer_reviews = [
    {
        "review_id": 1,
        "text": "提车时发现右侧车门有一处细微划痕,销售经理王磊当场道歉,并立即安排了免费的喷漆修复,还赠送了一次保养。虽然有点小插曲,但处理态度和速度让我们很满意。",
        "sentiment": "positive",
        "aspect": "售后/交车"
    },
    {
        "review_id": 2,
        "text": "保养预约系统太难用了,电话永远占线,在线表单提交后也没确认。好不容易约上,到店又说零件没货,白跑一趟。时间成本太高。",
        "sentiment": "negative",
        "aspect": "服务预约/效率"
    },
    {
        "review_id": 3,
        "text": "技师李工在保养时主动检查了刹车片,发现磨损接近临界值并给出了详细解释和报价,没有强行推销。这种基于实际车况的诚实建议让人非常安心。",
        "sentiment": "positive",
        "aspect": "维修技术/诚信"
    },
    {
        "review_id": 4,
        "text": "购买的延保套餐条款模糊,出险时才发现很多情况不覆盖,和销售当初承诺的完全不一样。感觉被误导了。",
        "sentiment": "negative",
        "aspect": "销售/合同"
    },
    {
        "review_id": 5,
        "text": "24小时道路救援响应很快,半夜爆胎后30分钟就到达现场并完成了更换备胎,解决了大麻烦。这项服务是真正的价值所在。",
        "sentiment": "positive",
        "aspect": "增值服务/救援"
    },
    # ... 可以继续添加更多模拟数据
]

这些评价包含了具体的人物(王磊、李工)、事件(划痕处理、预约难、刹车片检查、延保纠纷、道路救援)和情感倾向,为我们后续的语义检索提供了丰富的素材。

4. 构建智能知识库:向量化与存储

现在,我们进入核心环节——将非结构化的文本评价,转换成向量数据库能够理解和快速检索的形式。

4.1 初始化ChromaDB与嵌入函数

首先,我们需要初始化ChromaDB客户端,并为其配置一个嵌入函数。这个函数告诉ChromaDB如何将文本转换成向量。

import chromadb
from chromadb.utils import embedding_functions

# 1. 初始化一个持久化的ChromaDB客户端(数据会保存在`./chroma_db`目录)
chroma_client = chromadb.PersistentClient(path="./chroma_db")

# 2. 创建或获取一个集合(Collection),类似于数据库中的表
# 我们指定使用Google的`text-embedding-004`模型来生成嵌入向量
google_ef = embedding_functions.GoogleGenerativeAiEmbeddingFunction(
    api_key=config_data.get("gemini-secret-key"),
    model_name="models/text-embedding-004"
)

# 如果集合已存在,则获取;否则创建。`embedding_function`参数是关键。
collection = chroma_client.get_or_create_collection(
    name="customer_reviews",
    embedding_function=google_ef # 绑定嵌入函数
)

这里有几个 实操要点 :

  • PersistentClient :将数据保存在本地磁盘,下次运行程序时数据依然存在。对于测试和生产部署,你也可以使用 HttpClient 连接远程的ChromaDB服务。
  • embedding_function :这是连接的核心。我们传入之前初始化的 google_ef 对象。这意味着,当我们向集合中添加文本或进行查询时,ChromaDB会自动调用这个函数去向Google的API发送请求,获取对应的向量。 你不需要手动调用嵌入模型 ,ChromaDB帮你封装了。
  • collection :是所有相似数据(这里就是客户评价)的容器。每个集合使用相同的嵌入函数,确保所有向量在同一个语义空间内,可比。

4.2 数据预处理与向量化入库

接下来,我们将模拟的评价数据插入到向量数据库中。这里涉及一个关键概念: 分块 。如果我们的文档很长(比如一篇长报告),直接将其作为一个整体嵌入会丢失细节,检索精度会下降。通常需要将其切割成大小适中的“块”。本例中,每条评价本身较短,可以直接作为一个块。

# 准备要入库的数据
documents = [] # 存储文本内容
metadatas = [] # 存储每条文本的元数据(如情感、方面、ID)
ids = [] # 为每条文本分配唯一ID

for review in customer_reviews:
    documents.append(review["text"])
    metadatas.append({
        "sentiment": review["sentiment"],
        "aspect": review["aspect"],
        "review_id": review["review_id"]
    })
    ids.append(f"review_{review['review_id']}")

# 3. 将数据添加到集合中
# 此操作会触发嵌入函数,为每个`document`生成向量并存储
collection.add(
    documents=documents,
    metadatas=metadatas,
    ids=ids
)

print(f"成功将 {len(documents)} 条客户评价向量化并存入数据库。")

执行这段代码后,你的本地 ./chroma_db 文件夹里就会保存所有向量数据。 metadatas 的用途非常强大,它允许我们在检索时进行 过滤 。例如,我们可以要求“只检索与‘售后’相关的正面评价”。这比单纯做文本匹配要灵活和精确得多。

心得 : ids 的设计要有规律且唯一。我习惯使用“类型_序号”的格式(如 review_1 , policy_42 ),这样在后期维护和排查问题时,能快速定位数据来源。避免使用随机字符串作为ID。

5. 语义检索:从问题到相关上下文

知识库建好了,现在当用户提出一个新问题时,我们需要从中找到最相关的信息。

5.1 执行相似性搜索

我们尝试问一个更具体的问题:“当客户对交车时的车辆瑕疵不满意时,我们应该如何应对?”

# 用户的查询问题
query_text = "当客户对交车时的车辆瑕疵不满意时,我们应该如何应对?"

# 4. 执行查询:在集合中寻找与查询最相似的文档
# `n_results` 控制返回的最相似结果数量
results = collection.query(
    query_texts=[query_text], # 可以一次性查询多个问题,这里我们查一个
    n_results=2 # 返回最相关的2条评价
)

print("【语义检索结果】")
print(f"查询问题:'{query_text}'")
print(f"检索到 {len(results['documents'][0])} 条相关评价:\n")

for i, (doc, meta) in enumerate(zip(results['documents'][0], results['metadatas'][0])):
    print(f"结果 {i+1} (相似度距离:{results['distances'][0][i]:.4f}):")
    print(f"  评价内容:{doc}")
    print(f"  元数据:{meta}")
    print()

运行代码,你可能会看到类似以下的输出:

【语义检索结果】
查询问题:'当客户对交车时的车辆瑕疵不满意时,我们应该如何应对?'
检索到 2 条相关评价:

结果 1 (相似度距离:0.1521):
  评价内容:提车时发现右侧车门有一处细微划痕,销售经理王磊当场道歉,并立即安排了免费的喷漆修复,还赠送了一次保养。虽然有点小插曲,但处理态度和速度让我们很满意。
  元数据:{'sentiment': 'positive', 'aspect': '售后/交车', 'review_id': 1}

结果 2 (相似度距离:0.2874):
  评价内容:购买的延保套餐条款模糊,出险时才发现很多情况不覆盖,和销售当初承诺的完全不一样。感觉被误导了。
  元数据:{'sentiment': 'negative', 'aspect': '销售/合同', 'review_id': 4}

太棒了! 向量搜索精准地找到了第一条评价,它直接描述了“交车时发现划痕”以及成功的处理方案(道歉、免费修复、赠送保养)。第二条虽然也关于“不满意”,但主题是“合同纠纷”,相关性较低(距离值0.28 > 0.15)。这正是语义搜索的魅力:它理解“车辆瑕疵”和“划痕”在含义上的接近,而不是简单的关键词匹配。

5.2 检索策略优化:距离、分数与元数据过滤

  • 距离(Distance) :ChromaDB默认使用余弦相似度,距离越小(越接近0),相似度越高。你需要关注这个值来评估检索质量。通常,距离小于0.2可以认为非常相关,0.2-0.35之间可能相关,大于0.35可能就不太相关了。
  • 元数据过滤 :这是提升检索精度的利器。假设我们只想参考“正面”评价的处理方式:
# 带过滤条件的查询:只检索情感为positive的评价
filtered_results = collection.query(
    query_texts=[query_text],
    n_results=2,
    where={"sentiment": "positive"} # 过滤条件
)
print("【只检索正面评价的结果】")
for doc in filtered_results['documents'][0]:
    print(f"- {doc}")

这样,第二条负面评价(关于延保)就会被过滤掉,确保我们只向LLM提供“成功案例”作为参考。

6. 生成增强回复:组装最终提示

最后一步,我们将检索到的相关上下文与原始问题结合,组装成一个强大的提示(Prompt),发送给LLM,让它生成最终答案。

6.1 构建提示模板

一个结构良好的提示模板是RAG成功的一半。它需要清晰地向LLM说明角色、上下文、任务和格式要求。

def build_rag_prompt(query, context_docs):
    """构建RAG提示模板"""
    context_str = "\n\n".join([f"- {doc}" for doc in context_docs])

    prompt = f"""
你是一名资深的汽车经销商客户成功专员。请严格根据以下提供的**客户评价上下文**来回答问题。上下文来自真实的客户反馈。

<上下文开始>
{context_str}
<上下文结束>

用户问题:{query}

请基于以上上下文信息,总结出可操作的建议。如果上下文中的信息不足以回答问题,请明确指出“根据现有信息无法完全回答”。
请确保回答专业、简洁,并直接引用上下文中的具体案例(如涉及,可提及“销售经理王磊的处理方式”)。
"""
    return prompt.strip()

# 使用检索到的文档构建提示
retrieved_docs = results['documents'][0]
rag_prompt = build_rag_prompt(query_text, retrieved_docs)

print("【发送给LLM的完整提示】")
print(rag_prompt)
print("-" * 50)

6.2 调用LLM生成最终答案

现在,我们将这个包含具体上下文的提示,而不是最初那个空洞的问题,发送给Gemini。

# 5. 使用增强后的提示调用LLM
enhanced_response = gemini.models.generate_content(
    model="gemini-2.5-flash",
    config=types.GenerateContentConfig(
        system_instruction="你是一名专业的汽车经销商客户成功经理,善于从客户反馈中提炼具体、可执行的改进方案。"
    ),
    contents=rag_prompt
)

print("【RAG增强后的模型回答】")
print(enhanced_response.text)

观察输出,你会得到一个截然不同的答案。它不再是泛泛而谈的“个性化服务”,而是会具体提到:“根据客户反馈,当交车时发现车辆存在划痕等瑕疵,应立即采取以下措施:1. 现场诚恳致歉 :如销售经理王磊所做,第一时间承认问题,安抚客户情绪。2. 提供即时解决方案 :立即安排免费的修复服务(如喷漆),避免客户多次往返。3. 给予适当补偿 :通过赠送一次保养等方式,表达诚意,将危机转化为提升客户忠诚度的机会。关键在于响应速度和解决问题的态度。”

这个回答 具体、可操作、有案例支撑 ,正是我们想要的效果。

7. 实战进阶:效果对比、调优与常见陷阱

一个基础的RAG管道已经搭建完成。但在实际生产中,我们需要系统地评估其效果,并知道如何调优。

7.1 效果对比:原始回答 vs. RAG增强回答

让我们并排对比,直观感受差异:

特性 原始LLM回答 (无上下文) RAG增强回答 (有上下文)
具体性 抽象原则(“个性化”、“理解个体”) 具体措施(“现场致歉”、“立即安排修复”、“赠送保养”)
可操作性 低,缺乏具体步骤 高,列出了明确的行动项
数据支撑 无,基于模型通用知识 有,引用了真实客户评价案例
相关性 与汽车行业关联弱 紧密围绕汽车销售售后场景
可信度 感觉像“正确的废话” 感觉像基于内部数据的专业分析

这种差异就是RAG的价值所在:它将生成式AI的创造力与你私有数据的精确性结合了起来。

7.2 核心调优维度

如果你的RAG效果不理想,可以从以下几个方向排查和优化:

  1. 检索质量优化 :

    • 分块策略 :对于长文档,分块大小和重叠度是关键。太小会失去上下文,太大会引入噪声。通常从512个token的块大小、128个token的重叠开始实验。
    • 嵌入模型 :尝试不同的嵌入模型。对于中文, BGE-M3 或 text-embedding-3-small 可能比默认模型效果更好。可以用一些检索评估数据集(如MTEB)的子集来测试。
    • 元数据与过滤 :像我们之前做的,利用元数据进行过滤,能极大提升检索精度。确保你的数据有丰富的、高质量的元数据标签。
    • 重排序 :初步检索出10个结果后,使用一个更精细的(但可能更慢的)交叉编码器模型对它们进行重排序,选出最相关的2-3个,可以显著提升效果。
  2. 提示工程优化 :

    • 指令清晰化 :明确告诉模型“严格基于上下文”、“引用具体案例”、“如果不知道就说不知道”。这能减少模型“幻觉”(编造信息)。
    • 上下文格式 :清晰地用XML标签(如 <context>...</context> )或标记符分隔上下文和问题,帮助模型理解结构。
    • 少样本示例 :在提示中提供一两个输入输出的例子,指导模型以你期望的格式和风格回答。
  3. 评估体系建立 :

    • 人工评估 :随机采样一批问题,对比RAG回答和原始回答,从“相关性”、“准确性”、“有用性”等维度打分。这是黄金标准,但成本高。
    • 自动评估 :设计一些启发式规则,例如检查生成答案中的关键实体(如“王磊”、“喷漆”)是否出现在检索到的上下文中。也可以利用LLM本身作为裁判,让它评价另一个答案的质量(需要设计严谨的提示)。

7.3 常见问题与排查实录

在我实施RAG项目的过程中,踩过不少坑,这里记录下最典型的几个:

  • 问题1:检索结果完全不相关。

    • 现象 :无论问什么,返回的总是那几条不沾边的文档。
    • 排查 :
      1. 首先检查 嵌入模型 是否正常工作。可以手动计算查询和某个文档的相似度,或者检查向量维度是否正确。
      2. 检查 数据入库流程 。确认 documents 列表中的文本是否正确,有没有混入大量无意义的字符或代码。
      3. 查看 距离分数 。如果所有距离都很大(比如>0.5),说明语义空间可能完全不对齐。
    • 解决 :更换嵌入模型是最直接的途径。确保你的嵌入模型与文本语言匹配(用中文模型处理中文)。
  • 问题2:LLM回答忽略上下文,依然胡编乱造。

    • 现象 :检索到了正确上下文,但LLM生成的答案完全没提这些内容,还是自己瞎编。
    • 排查 :
      1. 检查提示词 :你的提示词是否足够强硬地要求模型“基于上下文”?尝试使用更严厉的指令,如“你必须且只能使用以下上下文中的信息来回答问题。”
      2. 检查上下文长度 :如果检索到的上下文太长,超过了模型关注的重点,它可能会“视而不见”。尝试减少 n_results ,只提供最相关的1-2条。
      3. 检查上下文位置 :将上下文放在问题之前,并用明显的标记(如 ## 上下文 ## )框起来。
    • 解决 :强化提示指令,并考虑在提示中明确要求“在回答后,请用括号注明你的答案依据了哪几条上下文”。
  • 问题3:处理速度慢,尤其是数据量大时。

    • 现象 :查询响应时间很长。
    • 排查 :
      1. 网络延迟 :如果你的嵌入模型调用云端API,网络是主要瓶颈。考虑使用本地嵌入模型(如 all-MiniLM-L6-v2 )。
      2. 索引策略 :ChromaDB默认使用简单的扁平索引。对于超过几万条的数据,考虑使用 HNSW 等近似最近邻索引,在创建集合时指定 hnsw:space 参数。
      3. 批量操作 :插入数据时,尽量批量进行,而不是逐条插入,以减少网络和IO开销。
    • 解决 :对于生产环境,向量数据库最好与服务部署在同一内网;对于大数据集,务必使用高性能索引。

这套从原始数据到智能问答的完整流程,其核心思想在于将LLM的通用能力与你所在领域的私有知识进行了有效嫁接。它不需要你精通深度学习算法,更多的是对数据管道、工具API和提示设计的工程化把握。我个人的体会是,RAG项目的成功,30%在于模型和算法,70%在于对业务数据的理解和细致的数据处理工作。开始动手吧,从你手头的一份文档、一组用户反馈开始,构建出你的第一个智能知识助手,你会发现生成式AI的应用门槛远比想象中要低,而其带来的效率提升却立竿见影。

RAG & LLm大模型构建本地知识库 RAG与LLM的优势 如何构建垂域(向量)知识库 文本分块的技巧 构建一套完整 RAG 系统的步骤 阅读详情

相关推荐

3.3 LLM检索增强生成(RAG)技术入门:打造专属智能运维知识库

摘要:LLM检索增强生成(RAG)技术在智能运维中的应用 本文介绍了检索增强生成(RAG)技术在AIOps领域的应用,它通过将大语言模型(LLM)与企业内部知识库相结合,显著提升了运维场景中的知识处理能力。文章详细阐述了RAG的工作原理,包括查询编码、向量检索、上下文增强和回答生成四个关键步骤。同时提供了构建运维知识库的实践指导,涵盖知识来源、结构设计和抽取方法,并展示了如何使用向量数据库和嵌入模型实现高效检索。该技术能够有效解决LLM在企业专有知识处理上的局限性,为智能运维提供更准确、个性化的支持。

yonggeit的博客 3759

Orchard源码:EventBus&EventHandler

概述 看源码是一件吃力又很爽的事情,昨天还被搞的一头雾水,今天忽然守得云开见月明。明白它设计意图的同时,感觉自己又提升了一步:) Orchard刚开始看往往毫无头绪,建议可以从Orchard.Framework&UnitTest入手,先弄明白底层框架机制,抽丝剥茧,一步一步农村包围城市。不用着急,说不定哪天睡觉一下子就理解了。 今天看一下它的事件通知模块的设计,相关类 ...

aikuo9061的博客 161

80MHz~100MHz频谱分析仪设计

由理论分析可知,经过乘法器后输出的信号为频率为w1+w2的高频信号和w1-w2的低频信号,除了想要采样的直流信号外,最小的信号频率为100kHz。因此,经过一系列推导可以得到该滤波器的元件C1,C2,C3,R1,R2的近似值分别为:C1=2.36nF,C2=32.1nF,C3=1.07nF,R1=1.39k,R2=2.84k。AK,此时的频率w2即为被测信号的频率,待测信号源电压幅度为,因此为了能达到直流采样的设计,我们将本振源的频率输出范围做成80~110 MHz,提高了题目的频率要求。

qq_48771816的博客 5242

net.core 微信APP支付

前言:微信APP支付(两步操作1:唤醒。2:支付完成回调并返回) 微信支付申请: 1. 打开微信开发放平台 https://open.weixin.qq.com/ 2. 进入 管理中心 / 创建移动应用 页面(这里的应用包名和签名是一定要写对的,修改正确之后还是错误是因为微信统一下单接口有缓存延迟,第二天重试即可) 3. 填写基本信息 4. 填写平台信息 申请成功之后需要与微信支付商户关联 1:参数配置WeiXinPayConfig为微信支付参数 public static class Wei..

qq_36464108的博客 1037

Python验证码识别神器ddddocr:5分钟搞定网站登录自动化(附完整代码)

本文详细介绍了如何使用Python开源库ddddocr快速实现验证码识别,结合Selenium完成网站登录自动化。ddddocr作为轻量级OCR工具,支持多种验证码类型,识别速度快且准确率高,特别适合自动化测试和爬虫开发。文章包含完整代码示例,从环境配置到实战应用,帮助开发者5分钟内实现验证码破解。

sprite的博客 798

STM32F407编译下载全流程:从CubeMX到HEX烧录

嵌入式固件开发中,编译与下载是连接代码与硬件的关键闭环。其本质是将高级语言描述的逻辑,经交叉编译(ARM GCC)、链接(ELF生成)、格式转换(HEX/BIN)后,通过调试接口(SWD/UART)写入MCU Flash存储器的过程。该流程涉及工具链协同、二进制格式特性(如Intel HEX的地址映射与无元数据设计)、启动模式(System Memory Bootloader)、Flash选项字节(RDP/WRP)等底层机制,直接决定固件可运行性与安全性。典型应用场景包括STM32F407开发板调试、量产固

weixin_28840811的博客 259

android开发过程中遇到的问题

记录android开发过程中遇到的问题。 1.在一个xml中能否使用同一个include多次 http://www.apkbus.com/android-104152-1-1.html android中include标签的使用 http://blog.youkuaiyun.com/wangljgood/article/details/6556175 2. android bu

system_err的博客 8万+

《点云处理算法》——GROR配准

GROR点云配准

阁楼 1314

RAG实战篇:RAG与知识库搭建,手把手教你构建RAG系统_rag搭建

自从发现可以利用自有数据来增强大语言模型(LLM)的能力以来,如何将 LLM 的通用知识与个人数据有效结合一直是热门话题。关于使用微调(fine-tuning)还是检索增强生成(RAG)来实现这一目标的讨论持续不断。检索增强生成 (RAG) 是一种使用来自私有或专有数据源的信息来辅助文本生成的技术。它将检索模型(设计用于搜索大型数据集或知识库)和生成模型(例如大型语言模型 (LLM),此类模型会使用检索到的信息生成可供阅读的文本回复)结合在一起。

2501_92171937的博客 1856

栅格数据做相关性分析前的预处理(批量定义投影、栅格投影、重采样)

最近在做两个栅格数据的相关性分析,这个最主要的是两个栅格数的行列号是一致的(也就是说坐标系、分辨率一致),那么标准的栅格数据的分辨率是以米的形式存在的,但是有一些栅格数据是以度为单位存在的,所以在做分析前,一定要先把其转换为米,否则在重采样的时候就会出错。(相关文章——栅格数据以度为单位变为以米为单位的简单做法)当然,在变其分辨率的单位前,一定要将其坐标系转换为一致。所以就有以下的步骤(如何将两个栅格数据的坐标系、分辨率的单位和分辨率一致) 1.首先,要看两个栅格数据的坐标系是否一致,如果不一致,要先统一到

qq_41828818的博客 8350

企业智能知识库的构建:基于RAG的解决方案

检索增强生成(Retrieval-Augmented Generation,简称 RAG)是一种先进的技术,它赋予了大型语言模型(LLMs)访问知识库中相关文档的能力,从而生成更加准确和具体的响应。1.查询处理:首先,系统会搜索知识库,寻找与用户查询相关的信息。2.上下文整合:然后,将最相关的搜索结果作为上下文信息整合到提示中,同时附加一条指令,例如:“仅使用以下段落中的信息来回答以下问题”,又或者是“参考以下段落中的内容来回答以下问题”。3.指令适配。

weixin_58753619的博客 2216

机器人行业面试全攻略:从0到1拿下心仪Offer,看这一篇就够了

【摘要】2026年机器人行业迎来爆发期,全球市场规模超800亿美元,人才争夺激烈。本文针对机器人行业面试提供系统攻略:首先需明确岗位方向、打造差异化标签并了解目标公司;技术面试高频考点包括ROS框架、SLAM导航、运动控制、深度学习和嵌入式系统;项目介绍需采用STAR+R结构并量化成果;行为面试需注意协作能力与职业规划。文章还总结了简历堆砌、单向输出等五大常见误区,强调长期积累与精准准备的重要性,助力求职者把握行业窗口期机会。

郑伟强dev的专栏 187

RAG与知识库搭建,手把手教你构建RAG系统

自从发现可以利用自有数据来增强大语言模型(LLM)的能力以来,如何将 LLM 的通用知识与个人数据有效结合一直是热门话题。关于使用微调(fine-tuning)还是检索增强生成(RAG)来实现这一目标的讨论持续不断。检索增强生成 (RAG) 是一种使用来自私有或专有数据源的信息来辅助文本生成的技术。它将检索模型(设计用于搜索大型数据集或知识库)和生成模型(例如大型语言模型 (LLM),此类模型会使用检索到的信息生成可供阅读的文本回复)结合在一起。

qkh1234567的博客 5178

uniapp(全端兼容) - 超详细接入百度统计功能,给uniapp全平台各端项目引入添加百度统计的插件统计流量详细的步骤教程(提供最新的百度统计源代码,详细的示例代码复制粘贴即可快速搞定!)

uniapp h5 app 使用加入接入百度统计,uniapp百度统计,uniapp详细引入百度统计的教程,uniapp接入百度统计,uniapp如何实现加入百度的统计代码,uniapp怎么植入百度统计详细教程,uniapp如何对接百度统计,uniapp百度统计不生效怎么办,uniapp使用百度统计不生效常见问题,uniapp引入百度统计后没有生效,uniapp h5网页接入百度统计代码后没有统计无效,uniapp最新接入使用百度统计功能,uniapp增加百度统计代码,uniapp app如何接入百度统计,

✅ 精选推荐文章 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

构建专属知识库:RAG实操教程结合LangChain与Milvus向量数据库

本文主要是 Milvus 向量数据实战总结。LLM 痛点以及解决方案RAG 是什么,为什么选用RAG。langchain文档加载器,chat model文档拆分的注意点,chat model区别。chat 示例代码。

2401_84204207的博客 2054

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

构建本地RAG知识库(下):使用RAG构建知识库

在上一篇文章中,我们已经尝试在本地部署了大模型以及利用langchain框架来构建起基于大模型的应用程序。在本章中,我们将更近一步,在现有的应用程序上尝试利用RAG来继续强化应用。

AAI666666的博客 3810

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于开源 LLM 构建专属知识库问答系统实战(RAG)

本文介绍了如何利用开源大模型构建私有知识库问答系统(RAG架构)。系统通过本地部署开源大模型(如Mistral-7B)、构建向量数据库(FAISS/Chroma)和嵌入模型,结合LangChain框架实现文档检索增强问答。文章详细讲解了从环境准备、知识库处理、模型加载到问答链构建的全流程,并提供了Streamlit交互界面实现方案。该方案解决了商业大模型无法访问本地知识、数据泄露风险和高成本等问题,支持多格式文档处理、多轮对话和向量库优化扩展,适合企业构建安全、高效的私有问答系统。随着国产模型性能提升,该技

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1139

本地化知识库RAG系统的构建

大模型应用领域已经呈现出多样化的发展态势,技术和参数的更新速度也相当迅猛。开源社区在推动大模型应用方面发挥着重要作用,不仅如此,还涌现了诸多在线LLM对话问答和知识库检索应用。许多这类应用甚至只需注册即可免费使用,在日常工作中,笔者也经常依赖LLM,并已将其视为不可或缺的工具之一。

瓦罗兰特顶级C位的博客 2178

RAG技术深度解析与实践:让LLM拥有实时知识库

本文介绍了检索增强生成(RAG)技术如何弥补大语言模型的不足。RAG通过"先检索后生成"的方式,将外部知识库信息作为上下文输入模型,有效解决知识滞后和事实错误问题。文章详细解析了RAG的核心原理、工作流程和组件选型,并提供了从零搭建Python知识库RAG系统的完整代码示例。该系统包含数据准备、检索、生成等模块,使用HuggingFace嵌入模型和Chroma向量数据库。最后指出RAG在企业知识库、专业问答等场景的应用价值,并提出了文档分割优化、嵌入模型改进等未来发展方向。RAG技术显著

qq_56999332的博客 1523

RAG与知识库、向量数据库和知识图谱的联系与区别

RAG(检索增强生成) 技术的本质就是通过外部资料库来补充大模型的知识,帮助它解决这些问题。就像你在考试时,虽然已经背了很多知识,但如果碰到不会的题目,你会去翻一翻资料,确保自己能答对。

Y525698136的博客 3099

RAG知识库方案集锦

Rag技术原理介绍,Rag私有化部署方案

ly_cyz的专栏 1211
上一篇: 保姆级教程:在Ubuntu 22.04上为嘉楠K230芯片交叉编译CoreMark(大小核实战)
下一篇: YOLOv8魔改新思路:当目标检测遇上Mamba与CBAM,我的融合实验与代码分享
weixin_33674437
博客等级 码龄11年 4356粉丝 293原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值