Langchain-Chatchat 与 Confluence/Wiki 系统集成方案
在企业知识管理的日常实践中,一个常见的场景是:新员工入职后,面对堆积如山的制度文档、项目手册和操作指南,只能靠“关键词搜索 + 手动翻页”来寻找答案。而即便如此,仍可能因为术语不一致或信息分散而一无所获。“年假怎么申请?”这个问题,在系统里搜“休假流程”却毫无结果——这正是传统知识库面临的典型困境。
与此同时,大模型技术正以前所未有的速度重塑人机交互方式。我们不再满足于检索出一堆链接,而是希望直接获得精准的答案。于是,一种新的可能性浮现出来:能否让企业的 Confluence 或 Wiki 变成一个会说话的助手?
答案是肯定的。借助开源本地知识库问答系统Langchain-Chatchat,结合成熟的 RAG(检索增强生成)架构,企业可以在不迁移现有知识资产的前提下,快速构建一个基于私有数据的智能问答引擎。更重要的是,整个过程完全可在本地完成,确保敏感信息不出内网。
这套系统的本质,并非简单地给文档加个聊天界面,而是将非结构化文本转化为可被 AI 理解的语义网络。当用户提问时,系统首先理解其意图,从海量文档中召回最相关的上下文片段,再由本地部署的大语言模型综合这些内容生成自然语言回答。这种“先查后答”的机制,有效缓解了纯 LLM 易产生幻觉的问题,同时保留了其强大的归纳与表达能力。
以一家使用 Confluence 管理技术文档的企业为例,工程师可以通过对话方式询问:“当前服务的部署流程是什么?”、“上次故障是怎么处理的?”系统不仅能自动定位到相关页面,还能跨多个文档提取关键步骤并整合成清晰的操作指引。这种体验上的跃迁,正是智能化知识访问的核心价值所在。
实现这一目标的关键,在于打通两个世界:一个是运行多年、沉淀丰富但交互僵化的传统知识平台;另一个是新兴的、灵活但依赖高质量输入的本地 AI 推理系统。Langchain-Chatchat 正好扮演了中间桥梁的角色。
它支持多种文档格式(PDF、Word、Markdown 等),能够对中文进行深度优化处理,并通过模块化设计允许企业根据自身资源选择合适的嵌入模型、向量数据库和底层 LLM。比如,在 GPU 资源有限的情况下,可以选用轻量级的 BGE-Small-ZH 模型配合 FAISS 向量库,甚至在普通服务器上也能稳定运行。
更进一步,要让这个系统真正“活”起来,就必须让它持续感知知识源的变化。Confluence 和 Wiki 并非静态仓库,它们每天都在更新。因此,集成的重点不仅是首次导入,更是建立一套可靠的增量同步机制。
我们通常采用 ETL(抽取-转换-加载)模式来完成这项任务。利用 Confluence 提供的 REST API,脚本定时拉取指定空间下的所有页面元数据与正文内容。由于返回的是 HTML 格式,需要用BeautifulSoup或trafilatura这类工具清洗掉导航栏、宏标签等无关元素,仅保留纯净文本。每一页都附带来源 URL 和最后修改时间,便于后续比对变更。
import requests from bs4 import BeautifulSoup import json import os from datetime import datetime from base64 import b64encode CONFLUENCE_URL = "https://your-company.atlassian.net/wiki" API_TOKEN = "xxx" EMAIL = "user@example.com" HEADERS = { "Authorization": f"Basic {b64encode(f'{EMAIL}:{API_TOKEN}'.encode()).decode()}", "Content-Type": "application/json" } def fetch_confluence_pages(space_key: str): url = f"{CONFLUENCE_URL}/rest/api/content" params = { "spaceKey": space_key, "type": "page", "limit": 100, "expand": "version,body.view" } response = requests.get(url, headers=HEADERS, params=params) data = response.json() pages = [] for item in data.get("results", []): page_id = item["id"] title = item["title"] last_mod = item["version"]["when"] content_html = item["body"]["view"]["value"] soup = BeautifulSoup(content_html, 'html.parser') text = soup.get_text(separator='\n', strip=True) pages.append({ "id": page_id, "title": title, "url": f"{CONFLUENCE_URL}/pages/viewpage.action?pageId={page_id}", "content": text, "last_modified": last_mod, "source": "confluence" }) return pages def save_if_updated(page): cache_file = f"cache/confluence_{page['id']}.json" if os.path.exists(cache_file): with open(cache_file, 'r', encoding='utf-8') as f: cached = json.load(f) if cached["last_modified"] == page["last_modified"]: return False with open(f"docs/confluence/{page['id']}.txt", "w", encoding="utf-8") as f: f.write(f"标题:{page['title']}\n") f.write(f"来源:{page['url']}\n") f.write(f"更新时间:{page['last_modified']}\n\n") f.write(page["content"]) with open(cache_file, 'w', encoding='utf-8') as f: json.dump(page, f, ensure_ascii=False, indent=2) return True if __name__ == "__main__": pages = fetch_confluence_pages("KB") updated_count = 0 for page in pages: if save_if_updated(page): updated_count += 1 print(f"[INFO] 同步完成,共更新 {updated_count} 个页面")上述脚本实现了自动化的内容抓取与增量保存。通过本地缓存记录每个页面的最后修改时间,避免重复处理未更改的内容。输出的.txt文件不仅包含正文,还保留了标题、URL 和时间戳,为后续溯源提供了依据。该脚本可作为 cron job 每日执行,确保本地知识库始终与 Confluence 保持同步。
一旦文档就绪,Langchain-Chatchat 就能开始工作。整个流程遵循标准的 RAG 架构:
文档加载与切分:使用
PyPDFLoader、TextLoader等组件读取文件,再通过RecursiveCharacterTextSplitter按固定长度分割文本块。对于中文,建议 chunk_size 设置为 500~800 字符,overlap 为 100 左右,既能维持语义完整性,又不至于因过长影响检索精度。向量化与索引构建:采用专为中文优化的嵌入模型(如 BGE-Small-ZH 或 M3E),将每个文本块编码为高维向量,并存入本地向量数据库(如 FAISS)。FAISS 因其轻量高效,特别适合中小规模知识库(<10万片段)的单机部署。
语义检索与回答生成:用户提问时,问题同样被转换为向量,在向量库中进行近似最近邻搜索(ANN),找出 Top-K 最相似的上下文片段。然后,这些内容与原始问题一起拼接成 prompt,送入本地 LLM(如 ChatGLM3、Qwen 或 Llama3 的 GGUF 版本)生成最终回答。
from langchain_community.document_loaders import PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import FAISS from langchain.prompts import PromptTemplate from langchain_community.llms import ChatGLM loader = PyPDFLoader("company_policy.pdf") pages = loader.load_and_split() text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) docs = text_splitter.split_documents(pages) embeddings = HuggingFaceEmbeddings(model_name="local_models/bge-small-zh-v1.5") db = FAISS.from_documents(docs, embeddings) db.save_local("vectorstore/faiss_company_policy") llm = ChatGLM( endpoint_url="http://127.0.0.1:8000", max_tokens=8192, temperature=0.1 ) template = """根据以下上下文回答问题: {context} 问题:{question} 请用简洁的语言作答。 """ prompt = PromptTemplate.from_template(template) def rag_query(question: str): retriever = db.as_retriever(search_kwargs={"k": 3}) context_docs = retriever.invoke(question) context = "\n".join([doc.page_content for doc in context_docs]) input_text = prompt.format(context=context, question=question) response = llm.invoke(input_text) return response answer = rag_query("年假如何申请?") print(answer)这段代码展示了完整的 RAG 流程。值得注意的是,HuggingFaceEmbeddings支持指定本地模型路径,无需联网调用;而ChatGLM则通过本地 API 接口连接运行在内网的服务,真正实现私有化推理。Prompt 模板的设计也至关重要——明确指示模型“基于上下文作答”,有助于抑制幻觉行为。
在整个系统架构中,各组件协同运作:
+------------------+ +---------------------+ | | | | | Confluence/Wiki |<----->| 内容同步服务 (ETL) | | (知识源) | | (定时拉取+清洗) | | | | | +------------------+ +----------+----------+ | v +----------------------------+ | | | Langchain-Chatchat 系统 | | - 文档加载 | | - 向量嵌入 (BGE) | | - 向量数据库 (FAISS) | | - LLM 推理 (ChatGLM/Qwen) | | | +-------------+--------------+ | v +------------------------------+ | | | 终端用户访问界面 | | - Web聊天窗口 | | - API接口(集成至OA/IM) | | | +------------------------------+前端可以是一个简单的 Web 聊天窗口,也可以通过 API 集成到企业微信、钉钉或 OA 系统中,成为员工日常工作流的一部分。高频问题和未命中查询还可被记录下来,用于反哺知识体系建设——哪些内容缺失?哪些表述不够清晰?这些反馈本身就是推动组织知识进化的重要动力。
在实际落地过程中,有几个关键考量点不容忽视:
嵌入模型的选择直接影响语义匹配质量。虽然通用英文模型(如 Sentence-BERT)也能处理中文,但效果远不如专为中文训练的 BGE 或 M3E。特别是在处理同义词、缩略语时,后者更能捕捉深层语义关联。
向量数据库的选型需权衡性能与扩展性。FAISS 适合资源有限的场景;若未来需要支持多条件过滤(如按部门、文档类型筛选),Chroma 是更好的选择;而对于超大规模知识库,则应考虑 Milvus 或 Weaviate 这类分布式方案。
安全控制必须前置。即使系统部署在内网,也应通过 JWT 或 OAuth 实现身份认证,并结合元数据过滤机制,确保不同角色只能访问授权范围内的信息。例如,财务制度不应对研发人员开放。
LLM 的部署方式决定了成本与延迟的平衡。高端 GPU 可运行全精度模型,响应更快;而在 CPU 上运行量化后的 GGUF 模型(如 via llama.cpp),虽速度稍慢,但极大降低了硬件门槛,使笔记本电脑也能胜任推理任务。
这套“旧瓶装新酒”的解决方案,本质上是一种极聪明的技术融合策略。它没有要求企业推倒重来,也不强制迁移已有数据,而是通过轻量级集成,让沉睡的知识焕发新生。员工不再需要记忆文档位置或精确关键词,只需像问同事一样提问,就能获得专业答复。
从更长远的视角看,这样的系统不仅是问答工具,更是企业迈向认知智能的第一步。它为企业构建了一个可复用、可持续演进的 AI 基座——今天用来解答制度问题,明天就可以接入工单系统做自动归类,后天甚至驱动流程自动化决策。
在一个数据主权日益重要的时代,谁能掌握对自身知识资产的控制权,谁就能在智能化竞争中占据先机。而 Langchain-Chatchat 与 Confluence/Wiki 的结合,正是这样一条务实、高效且安全可行的路径。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考