尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

知识系统成为GTM技术栈核心:AI Engineer视角的RAG落地指南

知识系统成为GTM技术栈核心:AI Engineer视角的RAG落地指南 知识系统新的市场推广技术栈从 AI Engineer 视角拆解一套可落地的 GTM Stack做市场推广的同学每天最耗时间的事情是什么不是写文案不是投广告而是“找资料”。产品文档散落在 Notion、飞书、Wiki 里竞品分析报告躺在钉钉群文件里历史活动数据埋在 Excel 里每当要准备一场新的 campaign光是全公司到处问“那个文档在哪”就能耗掉半天。过去很长一段时间市场推广团队解决这个问题的方式是“买一套 C360 或者营销自动化平台”把客户数据管理起来但内容侧的知识管理始终是割裂的。直到大模型出现一个很有意思的趋势开始出现知识系统正在成为市场推广团队新的 GTM StackGo-To-Market 技术栈核心。这背后的推手不是传统内容管理系统厂商而是 AI Engineer。本文我就以 AI Engineer 的视角完整拆解一套面向市场推广团队的知识系统应该怎么设计、怎么搭、怎么落地。1. 背景与核心概念为什么知识系统成了 GTM 技术栈的核心1.1 什么是 GTM StackGTM 是 Go-To-Market 的缩写是指企业把产品推向市场并获取客户的整套流程。GTM Stack 则是支撑这套流程的软件工具组合传统上包括 CRM客户关系管理、营销自动化、广告投放、SEO 工具、邮件营销、数据分析等系统。过去 GTM Stack 的核心是“客户数据”。CRM 里记录线索、商机、客户联系人营销自动化平台负责发邮件、做评分分析工具追踪转化漏斗。这套体系非常成熟但有一个致命短板它对内容的理解能力几乎为零。1.2 知识系统补上了 GTM 链条上最缺的一环市场推广团队的内容资产——产品介绍、行业解决方案、白皮书、竞品分析、FAQ、定价说明、活动复盘——全部散落在不同的系统里。当你需要回答“我们和竞品 A 在数据安全方面有哪些差异”“去年 Q3 的 Webinar 转化率是多少”“我们的产品支持哪些国际合规认证”这些问题时传统 GTM Stack 帮不了你。知识系统的价值就在这里。它把这些分散的、非结构化的内容统一接入、解析、向量化、建立索引然后通过大模型提供智能问答、内容生成、知识推荐能力。换句话说传统 GTM Stack 管理的是“谁是我们的客户”知识系统管理的是“我们知道什么”。1.3 AI Engineer 在这里的角色知识系统不是一个“装一个软件就完事”的东西它需要 AI Engineer 根据团队的具体业务场景完成技术选型、数据管道搭建、向量化策略、Prompt 工程设计、评测与迭代。这也是“AI Engineer”这个岗位和传统后端工程师、算法工程师不太一样的地方后者偏向系统能力和模型能力AI Engineer 更像是一个“全栈的 AI 应用构建者”既要懂 Python 工程也要懂大模型 API 的调用方式还要懂业务场景的抽象。2. 环境准备与版本说明在开始搭建之前先把环境准备好。知识系统涉及的技术组件比较多我们尽量保持轻量但核心链路要完整。2.1 技术选型对照组件推荐方案备选方案说明大模型接入OpenAI API / 国内大模型 API本地私有化部署开源模型优先使用 API成本低、迭代快向量数据库Chroma本地开发Milvus / Qdrant / pgvector起步阶段 Chroma 够用生产推荐 Milvus文档解析LangChain 文档加载器 / PyMuPDFUnstructuredPDF、Word、HTML 解析编排框架LangChainLlamaIndex / 自研 PipelineLangChain 生态最全但抽象层多需要理解原理API 服务FastAPIFlask异步支持好自带文档前端Streamlit内部使用React Vite内部工具用 Streamlit 足够2.2 本地环境说明本文示例以以下环境作为参考实际版本请根据你的项目情况调整核心是演示配置思路不是死记版本号操作系统macOS / Ubuntu 20.04 均可Python 版本3.10 及以上包管理工具pipNode.js如果使用前端方式18.x2.3 基础依赖安装创建一个 Python 虚拟环境python -m venv knowledge-gtm-env source knowledge-gtm-env/bin/activate # Windows 下执行 knowledge-gtm-env\Scripts\activate安装核心依赖pip install langchain langchain-openai chromadb fastapi uvicorn streamlit pypdf unstructured python-dotenv为了把文档切成适合向量化的块还需要tiktokenpip install tiktoken这里简单解释一下这些库的作用langchain编排整个 RAG 流程把文档加载、切分、向量化、检索、生成串起来。langchain-openaiLangChain 对接 OpenAI 接口的适配器方便调用 Embedding 与 Chat 模型。chromadb本地向量数据库存储文档向量并支持相似度检索。fastapiuvicorn提供 API 服务让市场团队可以通过网页或接口访问知识系统。streamlit快速搭建一个内部使用的 Web 界面不需要写前端代码。pypdf和unstructured解析 PDF、Word 等文档格式。如果你使用的是其他大模型服务商比如国内模型可以把langchain-openai替换成对应的适配器核心流程不变。3. 核心架构与知识点拆解在写代码之前一定要先理解知识系统的整体架构。很多项目跑不起来不是因为代码写错而是因为对整个数据流的理解不够。3.1 知识系统的整体链路一个面向 GTM 场景的知识系统核心是 RAGRetrieval-Augmented Generation检索增强生成。整个流程可以拆成两个阶段阶段一知识入库离线阶段原始文档 - 解析 - 切块 - Embedding 向量化 - 存入向量数据库阶段二知识问答在线阶段用户提问 - Embedding 向量化 - 相似度检索 - 拼接 Prompt - 调用大模型 - 输出回答这两个阶段的关键区别在于入库阶段是预先处理好的一次处理多次使用问答阶段是实时的每来一个用户问题都要走一遍检索和生成。3.2 Embedding 是什么Embedding 就是把一段文本转换成一串数字向量让语义相近的文本在向量空间里距离更近。例如“我们的产品支持哪些安全认证”和“我们有 ISO 27001 吗”这两句话虽然在字面上很不一样但 Embedding 向量是接近的。所以知识系统的检索环节本质上不是在“搜关键词”而是在“找语义相近的内容块”。这也是传统搜索引擎和知识系统的核心区别。3.3 切块策略为什么重要文档切分Chunking是 RAG 系统里对最终效果影响最大的环节之一。如果切得太粗一块包含太多内容检索结果会不精准如果切得太细每块内容丢失上下文模型无法理解。常见切块策略策略适用场景示例固定长度切分通用场景实现简单每 500 个 token 切一块重叠 50按标题结构切分文档层级清晰如产品说明按 Markdown 标题切片按段落切分日常运营文档按换行符切片按语义切分内容关联性强但实现复杂基于 LLM 判断语义边界在 GTM 知识系统里我建议先按照“二级标题 段落”的方式切分这样既能保留上下文边界又能让每块内容聚焦一个主题。3.4 Prompt 工程在知识系统里的作用检索回来的内容块不能直接丢给大模型而是需要构建一个结构化的 Prompt。一个好的 Prompt 需要做到三件事设定角色。告诉模型它是公司市场推广团队的专属知识助手。限定依据。要求模型只能基于提供的知识内容回答不能乱编。明确格式。如果问题有明确答案简洁回答如果不确定如实说不知道。3.5 对话记忆怎么处理市场推广团队在使用知识系统时经常会有连续追问的场景。比如先问“我们产品的价格方案有几个版本”再问“第二个版本包含哪些功能”。第二个问题里的“第二个版本”指代的是第一个问题里的内容。需要把聊天历史一并传给大模型让它结合上下文理解。4. 实战案例搭建一个市场推广团队产品知识助手下面我们完整搭建一个面向市场推广团队的知识系统。场景设定公司是做跨境电商 SaaS 的市场团队需要快速查询产品功能、定价、竞品对比、合规信息用于制作宣传材料和回答客户预销售问题。4.1 创建项目结构knowledge-gtm/ ├── data/ # 放置原始文档 │ ├── product_overview.pdf │ ├── pricing_2024.md │ ├── compliance.md │ └── competitor_brief.md ├── scripts/ │ ├── ingest.py # 知识入库脚本 │ ├── query.py # 知识检索与生成脚本 │ └── api_server.py # FastAPI 服务 ├── frontend/ │ └── app.py # Streamlit 前端 └── requirements.txt4.2 准备示例数据为了演示我创建两个纯文本格式的文档。先创建data/pricing_2024.md# 2024 年产品定价方案 ## 基础版Basic - 价格$99/月 - 适用对象初创团队月订单量不超过 500 单 - 核心功能商品管理、订单管理、基础数据分析、邮件通知 - 支持 1 个管理员账号 ## 专业版Professional - 价格$199/月 - 适用对象成长期企业月订单量不超过 5000 单 - 核心功能包含基础版全部功能额外支持客户细分、自动化营销、A/B 测试 - 支持 5 个管理员账号 - 提供 API 接口 ## 企业版Enterprise - 价格定制 - 适用对象大型企业月订单量无限制 - 核心功能包含专业版全部功能额外支持自定义数据看板、专属客户成功经理、SLA 保障 - 支持无限管理员账号 - 支持私有化部署再创建data/compliance.md# 合规与安全认证 ## 数据安全 - 平台通过 ISO 27001 信息安全管理体系认证 - 所有数据传输全程 TLS 加密 - 数据库支持 AWS 和阿里云双区域部署 ## 隐私保护 - 符合 GDPR 通用数据保护条例 - 支持数据导出与删除功能满足用户被遗忘权要求 - 隐私政策明确列出第三方数据处理方 ## 跨境数据传输 - 支持数据存储区域选择美东、美西、法兰克福、新加坡、香港 - 中国版与全球版数据物理隔离4.3 编写知识入库脚本创建scripts/ingest.pyimport os from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import TextLoader, PyPDFLoader, UnstructuredMarkdownLoader from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma from dotenv import load_dotenv load_dotenv() # 1. 加载文档 def load_documents(data_dir: str): docs [] for filename in os.listdir(data_dir): filepath os.path.join(data_dir, filename) if filename.endswith(.md) or filename.endswith(.txt): loader TextLoader(filepath, encodingutf-8) docs.extend(loader.load()) elif filename.endswith(.pdf): loader PyPDFLoader(filepath) docs.extend(loader.load()) return docs # 2. 切分文档 def split_documents(docs): text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50, separators[\n## , \n### , \n\n, \n, 。 ], ) return text_splitter.split_documents(docs) # 3. 构建向量库 def build_vector_store(docs, persist_dir: str): embeddings OpenAIEmbeddings(modeltext-embedding-3-small) vectorstore Chroma.from_documents( documentsdocs, embeddingembeddings, persist_directorypersist_dir ) return vectorstore if __name__ __main__: data_dir ../data persist_dir ../storage/chroma_db print(开始加载文档...) docs load_documents(data_dir) print(f加载完成共 {len(docs)} 个文档。) print(开始切分文档...) chunks split_documents(docs) print(f切分完成共 {len(chunks)} 个文本块。) print(开始构建向量库...) vectorstore build_vector_store(chunks, persist_dir) print(f向量库构建完成已存储到 {persist_dir})分步解释load_documents()遍历data目录根据文件后缀选择不同的加载器。.md和.txt直接用TextLoader.pdf用PyPDFLoader。split_documents()使用RecursiveCharacterTextSplitter优先按 Markdown 标题切分其次按换行符和句号切分。每块 500 字符重叠 50 字符目的是让相邻块之间有上下文衔接。build_vector_store()将文本块输入 OpenAI Embedding 模型得到向量后存入 Chroma。运行入库脚本cd scripts python ingest.py预期输出开始加载文档... 加载完成共 2 个文档。 开始切分文档... 切分完成共 12 个文本块。 开始构建向量库... 向量库构建完成已存储到 ../storage/chroma_db4.4 编写知识检索与问答脚本创建scripts/query.pyfrom langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.vectorstores import Chroma from langchain.chains import create_retrieval_chain from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_core.prompts import ChatPromptTemplate from dotenv import load_dotenv load_dotenv() # 1. 加载已有向量库 def load_vector_store(persist_dir: str): embeddings OpenAIEmbeddings(modeltext-embedding-3-small) vectorstore Chroma( persist_directorypersist_dir, embedding_functionembeddings ) return vectorstore # 2. 构造 Prompt SYSTEM_PROMPT 你是一个智能的市场推广知识助手专门帮助市场推广团队解答产品信息、定价、合规、竞品相关问题。 回答时必须满足以下要求 1. 只能基于提供的知识库内容回答不要编造事实。 2. 如果知识库中没有相关信息明确回答“知识库中没有找到相关信息”。 3. 涉及价格、认证、功能列表等问题要直接引用原文内容。 4. 回答使用中文语言简洁、专业适合直接用于内部工作。 上下文内容 {context} def create_chain(vectorstore): llm ChatOpenAI(modelgpt-4o-mini, temperature0.2) prompt ChatPromptTemplate.from_messages([ (system, SYSTEM_PROMPT), (human, {input}), ]) retriever vectorstore.as_retriever(search_kwargs{k: 4}) combine_docs_chain create_stuff_documents_chain(llm, prompt) retrieval_chain create_retrieval_chain(retriever, combine_docs_chain) return retrieval_chain if __name__ __main__: persist_dir ../storage/chroma_db vectorstore load_vector_store(persist_dir) chain create_chain(vectorstore) questions [ 我们公司的产品有哪几个定价版本, 专业版包含哪些核心功能, 公司通过了哪些安全认证, 产品支持私有化部署吗, ] for q in questions: print(f用户提问{q}) result chain.invoke({input: q}) print(f系统回答{result[answer]}) print(- * 60)运行问答脚本cd scripts python query.py预期输出用户提问我们公司的产品有哪几个定价版本 系统回答根据知识库中的信息产品定价分为三个版本 1. 基础版Basic$99/月 2. 专业版Professional$199/月 3. 企业版Enterprise定制价格 ------------------------------------------------------------ 用户提问专业版包含哪些核心功能 系统回答专业版包含基础版全部功能额外支持客户细分、自动化营销、A/B 测试支持 5 个管理员账号并且提供 API 接口。 ------------------------------------------------------------ 用户提问公司通过了哪些安全认证 系统回答平台通过 ISO 27001 信息安全管理体系认证所有数据传输全程 TLS 加密数据库支持 AWS 和阿里云双区域部署。在隐私保护方面符合 GDPR 通用数据保护条例。 ------------------------------------------------------------ 用户提问产品支持私有化部署吗 系统回答根据知识库中的信息企业版Enterprise支持私有化部署。 ------------------------------------------------------------这个结果说明 RAG 链路已经走通了。4.5 加入多轮对话能力实际使用场景中用户往往会连续追问。比如先问“企业版支持私有化部署吗”再问“那它的价格是多少”第二个问题的“它”指代的是企业版。如果直接把这个原始问题拿去检索很难匹配到准确内容。改造query.py加入对话记忆from langchain.memory import ConversationSummaryBufferMemory from langchain.chains import ConversationalRetrievalChain from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.vectorstores import Chroma from dotenv import load_dotenv load_dotenv() def create_conversational_chain(vectorstore): llm ChatOpenAI(modelgpt-4o-mini, temperature0.2) retriever vectorstore.as_retriever(search_kwargs{k: 4}) memory ConversationSummaryBufferMemory( llmllm, max_token_limit2000, memory_keychat_history, return_messagesTrue ) chain ConversationalRetrievalChain.from_llm( llmllm, retrieverretriever, memorymemory, condense_question_promptChatPromptTemplate.from_messages([ (system, 把用户的追问改写成一个独立的问题保持原意不要添加知识库中没有的信息。), (human, 对话历史{chat_history}\n\n最新问题{question}), ]), verboseFalse ) return chain if __name__ __main__: persist_dir ../storage/chroma_db embeddings OpenAIEmbeddings(modeltext-embedding-3-small) vectorstore Chroma(persist_directorypersist_dir, embedding_functionembeddings) chain create_conversational_chain(vectorstore) print( 问题1企业版支持私有化部署吗) r chain.invoke({question: 企业版支持私有化部署吗}) print(r[answer]) print( 问题2那它的价格是多少) r chain.invoke({question: 那它的价格是多少}) print(r[answer])ConversationSummaryBufferMemory会先把对话历史压缩成摘要当超过max_token_limit时更早的历史会被摘要代替。这样既保留长对话场景中的上下文又不会让 Prompt 无限膨胀。4.6 使用 FastAPI 封装成服务脚本运行的体验不够好而且市场团队的同学不太可能直接在命令行里用。需要把功能封装成 HTTP 接口。创建scripts/api_server.pyfrom fastapi import FastAPI from pydantic import BaseModel from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.vectorstores import Chroma from langchain.chains import create_retrieval_chain from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_core.prompts import ChatPromptTemplate from dotenv import load_dotenv load_dotenv() app FastAPI(titleKnowledge GTM API) # 全局初始化向量库和检索链 persist_dir ../storage/chroma_db embeddings OpenAIEmbeddings(modeltext-embedding-3-small) vectorstore Chroma(persist_directorypersist_dir, embedding_functionembeddings) SYSTEM_PROMPT 你是一个智能的市场推广知识助手帮助市场推广团队解答产品、定价、合规、竞品问题。 只基于上下文回答不要编造。如果上下文中没有答案明确说“知识库中没有找到相关信息”。 上下文内容 {context} llm ChatOpenAI(modelgpt-4o-mini, temperature0.2) prompt ChatPromptTemplate.from_messages([ (system, SYSTEM_PROMPT), (human, {input}), ]) retriever vectorstore.as_retriever(search_kwargs{k: 4}) combine_docs_chain create_stuff_documents_chain(llm, prompt) retrieval_chain create_retrieval_chain(retriever, combine_docs_chain) class QueryRequest(BaseModel): question: str class QueryResponse(BaseModel): answer: str source_documents: list[str] app.post(/query, response_modelQueryResponse) def query_knowledge(request: QueryRequest): result retrieval_chain.invoke({input: request.question}) source_docs [doc.page_content for doc in result.get(context, [])] return QueryResponse( answerresult[answer], source_documentssource_docs ) app.get(/health) def health_check(): return {status: ok}启动服务cd scripts uvicorn api_server:app --host 0.0.0.0 --port 8000 --reload测试接口curl -X POST http://localhost:8000/query \ -H Content-Type: application/json \ -d {question: 专业版包含哪些功能}预期返回{ answer: 专业版包含基础版全部功能额外支持客户细分、自动化营销、A/B 测试支持 5 个管理员账号并且提供 API 接口。, source_documents: [ 专业版Professional\n- 价格$199/月\n- 适用对象成长期企业月订单量不超过 5000 单... ] }source_documents字段非常重要。它把模型引用的知识原文返回给前端市场团队的同学可以点开看原文确认答案的来源避免大模型“胡说八道”却不自知。4.7 使用 Streamlit 搭建内部使用界面最后给市场团队搭一个最简单的 Web 界面。创建frontend/app.pyimport streamlit as st import requests from urllib.parse import urljoin API_BASE http://localhost:8000 st.set_page_config(page_title市场知识助手, page_icon, layoutwide) st.title( 市场推广知识系统) st.markdown( 输入你关心的产品、定价、合规问题系统会从市场部知识库中检索相关内容并生成回答。 ) # 初始化 session 状态 if messages not in st.session_state: st.session_state.messages [] # 展示历史消息 for message in st.session_state.messages: with st.chat_message(message[role]): st.markdown(message[content]) # 输入框 if prompt : st.chat_input(请输入你的问题例如我们产品有几个版本): st.session_state.messages.append({role: user, content: prompt}) with st.chat_message(user): st.markdown(prompt) with st.chat_message(assistant): with st.spinner(正在查询知识库...): try: resp requests.post( urljoin(API_BASE, /query), json{question: prompt}, timeout60 ) resp.raise_for_status() data resp.json() answer data[answer] sources data.get(source_documents, []) st.markdown(answer) if sources: with st.expander( 查看知识来源): for i, src in enumerate(sources): st.text(f[来源 {i1}]) st.write(src) st.divider() st.session_state.messages.append({role: assistant, content: answer}) except Exception as e: st.error(f查询失败{e}) # 侧边栏说明 with st.sidebar: st.header(使用说明) st.markdown( - 本系统仅限内部推广团队使用 - 知识库内容来源于产品、定价、合规资料 - 涉及最终对外输出的内容请务必核对原文 ) if st.button(清空对话): st.session_state.messages [] st.rerun()启动前端cd frontend streamlit run app.py浏览器打开http://localhost:8501即可看到对话界面。到这里一个最小可用的市场推广知识系统就搭建完成了。虽然功能比较简单但“文档入库 - 向量化 - 检索 - 生成 - Web 交互”的完整闭环已经跑通。5. 常见问题与排查思路实际搭建过程中最常见的问题主要集中在以下几个环节。5.1 文档加载失败或解析乱码问题现象常见原因解决思路PDF 加载后出现大量空字符PDF 是扫描件没有 OCR 解析使用 OCR 工具预处理或要求团队提供源文件Markdown 标题被拆散切分分隔符配置不对检查separators中是否包含\n##中文文本乱码编码格式不是 UTF-8打开源文件另存为 UTF-8 编码5.2 检索结果不准确问题现象常见原因解决思路提问和内容语义相关但检索不到Embedding 模型效果有限换成更大维度模型 eg.text-embedding-3-large检索到很多相似但无关的内容切块过大或太小调整chunk_size和chunk_overlap同一个问题每次回答不一样检索到的上下文块不同检查向量库是否有重复文档清理后重建5.3 大模型回答幻觉这个问题在知识系统里最需要警惕。市场推广团队如果把幻觉内容直接用于对外宣传可能带来合规风险。要从两个维度来防御第一个维度Prompt 约束。在系统提示词里明确写“只能基于上下文回答不得编造”如果上下文没有相关信息要明确说不知道。第二个维度工程兜底。检索时设置更高的相关度阈值太低相关度的内容不要拼进 Prompt。例如retriever vectorstore.as_retriever( search_typesimilarity_score_threshold, search_kwargs{score_threshold: 0.3, k: 4} )此外在 API 返回中展示source_documents让使用者能点开原文核对这是最直接有效的防幻觉手段。5.4 API 调用费用超预期问题现象常见原因解决思路每次问答费用过高检索到的上下文块太多Prompt 过长调低k从 4 降到 2-3多轮对话越聊越贵聊天历史不断累积使用 summary memory 压缩历史重复建设向量库每次运行 ingest.py 都重新调用 Embedding检查 Chroma 持久化目录增量入库6. 最佳实践与工程建议跑通 Demo 和上生产是两回事。从内部工具走向正式的 GTM 团队基础设施至少需要考虑下面几点。6.1 知识入库的规范化知识系统的质量上限取决于输入文档的质量。如果源文档本身内容过时、互相矛盾再好的 RAG 流程也救不回来。建议所有文档在入库前加上元数据metadata至少包括文档来源部门最后更新时间负责人文档版本适用范围比如“仅限内部”“可对外”LangChain 的 Document 对象天然支持 metadata 字段from langchain_core.documents import Document doc Document( page_content产品定价文档内容..., metadata{ source: pricing_2024.md, department: product_marketing, last_updated: 2024-06-01, owner: zhangsan, scope: internal } )有了这些信息后续可以做基于部门的访问控制、基于时间的文档过期提醒甚至在检索时加 metadata 过滤。6.2 检索与生成的版本管理知识系统涉及两个模型Embedding 模型和生成模型。当模型版本更换时检索结果和回答质量都可能发生变化。建议在上线时固定模型版本embeddings OpenAIEmbeddings(modeltext-embedding-3-small) llm ChatOpenAI(modelgpt-4o-mini, temperature0.2)如果切换到新模型要重新跑一遍评测集对比回答质量而不是默认“新模型一定更好”。6.3 处理敏感信息与权限边界市场推广内容涉及定价、合规、客户信息权限控制不能靠口头约束。至少要区分“公开知识”产品介绍、功能说明所有人可访问。“内部知识”定价策略、竞品分析、销售话术仅限市场部与销售部。“机密知识”未发布产品信息、管理层战略资料仅限特定成员。落地方式入库时在 metadata 中加入access_level检索时传入用户身份检索结果中过滤掉无权访问的文档。以 Chroma 为例可以通过filter实现from langchain_community.vectorstores import Chroma vectorstore Chroma( persist_directory../storage/chroma_db, embedding_functionembeddings ) retriever vectorstore.as_retriever( search_kwargs{ k: 4, filter: {access_level: internal} } )6.4 建立评测集知识系统上线后每次修改都要有客观的验证标准。建议在项目初期就建立一个评测集包含三类问题事实类问题答案在知识库中明确存在例如“企业版价格是多少”。归纳类问题答案分散在多个文档中需要模型归纳例如“对比每个版本的功能差异”。无答案问题知识库中不存在的信息例如“我们公司有没有 SOC 2 认证”如果库里没有。每次修改代码、切换模型、调整切分策略后跑一遍评测集人工检查回答质量。这套评测集是整个知识系统的“回归测试”。6.5 知识库的更新机制市场团队的文档更新很频繁。定价变动、新功能上线、竞品信息刷新都需要及时同步到知识库。不要每次都全量重建而是新增文档增量加载到向量库。修改文档删除该文档的所有旧块重新导入新版本。删除文档按 metadata 中的source字段批量删除对应向量。Chroma 基于 metadata 过滤删除的示例# 删除某个来源文档的所有向量 collection vectorstore._collection existing collection.get(where{source: pricing_2024_old.md}) if existing[ids]: collection.delete(idsexisting[ids])6.6 日志与审计知识系统作为 GTM 技术栈的一部分需要记录每一次问答的输入、输出和引用的知识来源。这样做的目的有三个发现回答质量差的案例持续优化。追踪敏感信息的访问情况防止权限滥用。如果有人对外发布了不准确的信息可以回溯是系统回答错了还是使用者没有核对原文。最小日志格式{ timestamp: 2024-06-01 10:00:00, user: zhangsancompany.com, question: 企业版价格是多少, answer: 企业版价格需要联系销售定制。, sources: [pricing_2024.md, enterprise_contact.md], retrieval_scores: [0.87, 0.65, 0.42] }6.7 多团队知识隔离如果公司有多个产品线或者多个市场团队他们的知识库内容不能混在一起。在设计上建议先按产品线或团队拆分类似下面的结构storage/ ├── product_a/ │ └── chroma_db ├── product_b/ │ └── chroma_db └── shared/ └── chroma_db每个团队启动自己的工作区或者在同一个向量库中用namespace区分。7. 总结与学习路线本文从一个非常贴近市场推广团队的痛点出发——资料散、查找难、内容不一致——结合大模型时代的 RAG 技术完整搭建了一个面向 GTM 场景的知识系统。回顾一下关键成果理解了 GTM Stack 与知识系统的关系。掌握了“文档加载 - 切分 - Embedding - 向量存储 - 检索 - Prompt - 大模型生成”的完整链路。用 LangChain Chroma FastAPI Streamlit 搭建了一个可以实际使用的内部知识助手。梳理了多轮对话、来源引用、权限过滤、评测集等生产级问题的解决思路。这套系统不是一次性的项目它的生命力在于持续迭代。上线后可以继续关注这几个方向第一接入更多数据源。现在的示例只处理了本地 Markdown 和 PDF实际工作中还有 Confluence、飞书文档、Notion、Excel 表格。LangChain 对这些数据源大多有现成的 Loader可以按需接入。第二增加内容生成能力。知识系统不只是被动回答问题还可以主动帮市场团队写内容。例如基于产品简介生成一篇微信推文初稿基于竞品对比表生成一页竞品分析简报。这一步可以基于已有知识库配合 Agent 工作流让模型调用多个检索工具来完成更复杂的任务。第三从单点到共享。先让市场部用起来收集反馈优化 Prompt 和切块策略再把系统推广给销售、客户成功等部门。不同团队关注的知识侧重不同正好也可以用这套架构按需拆分。最后留一个值得思考的问题知识系统的回答质量直接决定团队对它的信任度。一次错误回答可能让使用者对系统失去信心。所以从第一天起就要把“来源可溯、答案可验”作为最高优先级而不是盲目追求回答的流畅度。如果这篇文章对你有帮助欢迎收藏备用。也欢迎在评论区聊聊你们团队是怎么处理市场/销售知识管理的一起交流落地经验。
返回列表