AI法律咨询配置实战:从零搭建本地知识库问答系统

想自己搭一套能回答法律问题的 AI 咨询系统,核心配置并不复杂:用 Ollama 跑本地大模型,用向量数据库存法律条文,再通过一个简单的检索增强生成(RAG)流程把两者串起来。
下面按零基础也能照做的顺序,讲清楚从环境准备到效果验证的完整配置过程。

先确认你的机器能不能跑起来

这套方案对硬件有基本要求。
建议 CPU 4 核以上、内存 16GB 以上;
如果要用 7B 参数左右的模型,最好有独立显卡(显存 8GB 以上)或者接受纯 CPU 推理时较慢的响应速度。
操作系统以 Ubuntu 22.04 为例,其他 Linux 发行版命令基本通用。

需要提前装好 Docker 和 Docker Compose。
用下面命令检查:

docker --version
docker compose version

如果提示命令不存在,先按 Docker 官方文档安装。
另外准备一个存放法律文档的目录,比如 /data/legal_docs,里面放 .txt 或 .md 格式的法条、案例摘要。

部署模型服务和向量数据库

这里用 Ollama 提供对话模型和嵌入模型,用 Qdrant 做向量存储。
创建一个 docker-compose.yml 文件:

services:
  ollama:
    image: ollama/ollama:latest
    ports:
      - "11434:11434"
    volumes:
      - ./ollama_data:/root/.ollama

  qdrant:
    image: qdrant/qdrant:latest
    ports:
      - "6333:6333"
    volumes:
      - ./qdrant_data:/qdrant/storage

在文件所在目录执行 docker compose up -d,然后用 docker compose ps 确认两个容器状态是 running。
接着拉取模型:

docker exec -it  ollama pull qwen2:7b
docker exec -it  ollama pull nomic-embed-text

qwen2:7b 负责生成回答,nomic-embed-text 负责把文本转成向量。
拉取完成后用 curl http://localhost:11434/api/tags 能看到模型列表即表示服务正常。

把法律文档灌入知识库

这一步的目标是把 /data/legal_docs 下的文本切块、向量化并写入 Qdrant。
可以用 Python 写一个简单脚本,依赖 qdrant-client 和 requests:

import os, requests
from qdrant_client import QdrantClient
from qdrant_client.models import PointStruct, VectorParams, Distance

client = QdrantClient(host="localhost", port=6333)
client.recreate_collection(
    collection_name="legal_docs",
    vectors_config=VectorParams(size=768, distance=Distance.COSINE)
)

def embed(text):
    r = requests.post("http://localhost:11434/api/embeddings",
                      json={"model": "nomic-embed-text", "prompt": text})
    return r.json()["embedding"]

points = []
for i, fname in enumerate(os.listdir("/data/legal_docs")):
    with open(os.path.join("/data/legal_docs", fname), encoding="utf-8") as f:
        for j, chunk in enumerate(f.read().split("\n\n")):
            if chunk.strip():
                points.append(PointStruct(id=len(points), vector=embed(chunk), payload={"text": chunk}))

client.upsert(collection_name="legal_docs", points=points)
print(f"已写入 {len(points)} 个文本块")

运行后如果输出写入数量,说明向量化成功。
注意 nomic-embed-text 默认输出 768 维向量,脚本里的 size=768 必须和它一致,否则写入会报维度不匹配。

配置问答流程并测试回答

问答时先检索最相关的几个文本块,再拼成提示词交给对话模型。
下面是一个最小可用的查询示例:

import requests
from qdrant_client import QdrantClient

client = QdrantClient(host="localhost", port=6333)
question = "劳动合同到期不续签需要支付经济补偿吗?"

emb = requests.post("http://localhost:11434/api/embeddings",
                    json={"model": "nomic-embed-text", "prompt": question}).json()["embedding"]
hits = client.search(collection_name="legal_docs", query_vector=emb, limit=3)
context = "\n".join(h.payload["text"] for h in hits)

prompt = f"根据以下法律资料回答问题,不要编造条文:\n{context}\n\n问题:{question}"
resp = requests.post("http://localhost:11434/api/generate",
                     json={"model": "qwen2:7b", "prompt": prompt, "stream": False})
print(resp.json()["response"])

如果回答明显引用了你放入的法条内容,并且没有胡乱编造,说明配置基本可用。
建议多换几个问题测试,尤其是知识库里没有覆盖的问题,观察模型是否会承认“资料不足”。

容易踩的坑和检查方法

模型拉取慢或失败:先检查磁盘空间,Ollama 模型文件较大。
用 docker logs 查看拉取日志,网络不稳定时可配置镜像加速。

Qdrant 连接被拒绝:确认容器端口映射正确,在宿主机执行 curl http://localhost:6333 应返回 Qdrant 的版本信息。

回答内容脱离法条:检查检索到的文本块是否真的相关,可以打印 hits 的 payload 文本。
如果检索不准,尝试调整文本切块大小,或在提示词里明确要求“只依据提供的资料回答”。

法律合规提醒:这套系统只适合做内部知识检索和辅助参考,不能替代执业律师的正式法律意见。
涉及真实法律事务时,务必由专业人员复核。

完成以上步骤后,你就有了一个可本地运行、能基于自有法律文档回答问题的 AI 咨询配置基础。
后续可以根据实际效果调整模型大小、检索条数和文档切分策略。

分享到:
上一篇
AI合同审查系统搭建:零基础服务器部署与配置指南
下一篇
AI案例检索配置:从零搭建可验证的本地检索环境
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意