灵珠AI可构建本地化智能知识库,支持毫秒级语义检索与问答。需配置Python环境、安装指定版本依赖、设置API密钥、文档切片入库ChromaDB,并通过embedding+LLM实现闭环问答服务。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要把企业内部几百份技术文档、产品手册和会议纪要变成能直接问答的智能知识库,而不是每次提问都要手动翻找PDF或Word文件。灵珠AI提供中文语义理解能力,配合向量数据库实现毫秒级相关片段召回,整个过程不依赖公网大模型API,数据完全本地可控。
准备运行环境与核心组件
在Linux或macOS终端中新建项目目录并激活Python虚拟环境:mkdir lingzhu-kb && cd lingzhu-kb && python -m venv venv && source venv/bin/activate。
安装灵珠AI SDK和向量数据库驱动:pip install lingzhu-ai chromadb sentence-transformers python-docx pdfplumber。注意必须使用sentence-transformers==2.2.2版本,高版本会与灵珠AI嵌入接口不兼容。
从灵珠AI官网控制台获取APP_ID和SECRET_KEY,保存到.env文件中,格式为LINGZHU_APP_ID=xxx和LINGZHU_SECRET_KEY=yyy。
将文档切片并转为向量存入ChromaDB
创建ingest.py脚本,先加载所有PDF/Word文档:from langchain_community.document_loaders import PyPDFLoader, Docx2txtLoader,遍历./docs/目录下文件,对每个PDF调用PyPDFLoader(file_path).load(),对每个Word调用Docx2txtLoader(file_path).load()。
使用RecursiveCharacterTextSplitter进行语义分块:设置chunk_size=384、chunk_overlap=64,避免切断技术参数表格或代码段落;特别注意合同类文档必须保留页码和条款编号,否则后续溯源失效。
初始化灵珠AI嵌入模型:from lingzhu_ai.embeddings import LingzhuEmbeddings; embedding = LingzhuEmbeddings(app_id=os.getenv("LINGZHU_APP_ID"), secret_key=os.getenv("LINGZHU_SECRET_KEY"))。
连接ChromaDB并插入向量:import chromadb; client = chromadb.PersistentClient(path="./chroma_db"); collection = client.create_collection(name="kb", embedding_function=embedding); collection.add(documents=[d.page_content for d in docs], metadatas=[d.metadata for d in docs], ids=[f"doc_{i}" for i in range(len(docs))])。
构建问答查询服务
编写query_service.py,定义函数ask_question(question: str) -> str。
第一步:用灵珠AI将用户问题转为向量,调用embedding.embed_query(question)获得1536维向量。
第二步:在ChromaDB中执行相似度检索:results = collection.query(query_embeddings=[vector], n_results=3),强制指定n_results=3而非默认5,避免低相关性噪声干扰生成质量。
第三步:提取检索到的最相关文档片段,拼接成上下文,格式为"【来源】{source} 第{page}页\n{content}",其中source取自results["metadatas"][0][0]["source"],page取自results["metadatas"][0][0].get("page", 1)。
第四步:调用灵珠AI的大语言模型接口生成答案:from lingzhu_ai.chat_models import LingzhuChat; llm = LingzhuChat(app_id=os.getenv("LINGZHU_APP_ID"), secret_key=os.getenv("LINGZHU_SECRET_KEY")); response = llm.invoke(f"根据以下资料回答问题:{context}\n问题:{question}")。
【必须关闭流式响应】调用invoke时传入stream=False参数,否则返回Generator对象无法直接提取字符串。











