法律问答机器人”技术方案”的实现

当然可以!以下是一套**开源、可商用、零法律风险**的"法律问答机器人"技术方案,包含:

  • ✅ **模型**:使用 **Baichuan2-7B/13B**(官方明确允许免费商用,仅需邮件申请)

  • ✅ **RAG 框架**:基于 `LangChain` + `Chroma` + `bge-reranker`

  • ✅ **幻觉校验模块**:法条存在性检查 + 敏感词过滤 + 置信度控制

  • ✅ **数据源**:使用**国家法律法规数据库公开数据**(无版权风险)

  • ✅ **许可证**:所有组件均为 MIT/Apache 2.0 等宽松开源协议


📦 一、整体架构

```mermaid

graph LR

A用户提问 --> B{问题过滤器}

B -- 合法问题 --> C向量检索:Chroma

C --> D召回Top3法条/判例

D --> EPrompt注入 + Baichuan2生成

E --> F幻觉校验模块

F -- 通过 --> G返回带引用的答案

F -- 拒绝 --> H"未找到可靠依据"

```


🔧 二、环境准备(Python 3.10+)

```bash

创建虚拟环境

python -m venv lawbot-env

source lawbot-env/bin/activate # Linux/Mac

lawbot-env\Scripts\activate # Windows

安装核心依赖

pip install langchain==0.2.12 \

chromadb==0.5.5 \

transformers==4.40.0 \

accelerate==0.30.1 \

bitsandbytes==0.43.1 \

sentence-transformers==3.0.1 \

torch==2.3.0 \

gradio==4.36.1

```

> 💡 所有包均为开源且可商用。


📚 三、法律知识库构建(无版权风险)

数据来源(全部公开免费):

构建步骤:

  1. 下载公开的 `.txt` 或 `.json` 法规文件(示例见附录)

  2. 使用 `bge-large-zh-v1.5` 嵌入模型生成向量

  3. 存入 Chroma 向量库

```python

build_knowledge_base.py

from langchain.text_splitter import RecursiveCharacterTextSplitter

from langchain_community.vectorstores import Chroma

from langchain_community.embeddings import HuggingFaceEmbeddings

1. 加载法规文本(示例:民法典.txt)

with open("laws/civil_code.txt", "r", encoding="utf-8") as f:

text = f.read()

2. 分块(法律条文按"第X条"分割更合理)

splitter = RecursiveCharacterTextSplitter(

chunk_size=500,

chunk_overlap=50,

separators="\\n\\n", "\\n第", "。"

)

chunks = splitter.split_text(text)

3. 嵌入并存入 Chroma

embedding_model = HuggingFaceEmbedings(

model_name="BAAI/bge-large-zh-v1.5",

model_kwargs={"device": "cuda"}

)

vectorstore = Chroma.from_texts(

texts=chunks,

embedding=embedding_model,

persist_directory="./law_vector_db"

)

vectorstore.persist()

```

> ✅ `bge-large-zh-v1.5` 为北京智源开源,Apache 2.0 协议,可商用。


🤖 四、推理与 RAG 主程序

```python

law_rag_bot.py

from langchain.chains import RetrievalQA

from langchain_community.llms import HuggingFacePipeline

from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline

import torch

1. 加载 Baichuan2(INT4 量化,低显存)

model_id = "baichuan-inc/Baichuan2-7B-Chat"

tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)

model = AutoModelForCausalLM.from_pretrained(

model_id,

torch_dtype=torch.float16,

load_in_4bit=True, # INT4 量化

device_map="auto",

trust_remote_code=True

)

llm_pipeline = pipeline(

"text-generation",

model=model,

tokenizer=tokenizer,

max_new_tokens=512,

temperature=0.1, # 降低随机性

do_sample=False

)

llm = HuggingFacePipeline(pipeline=llm_pipeline)

2. 加载向量库

from langchain_community.vectorstores import Chroma

embedding_model = HuggingFaceEmbeddings(model_name="BAAI/bge-large-zh-v1.5")

retriever = Chroma(

persist_directory="./law_vector_db",

embedding_function=embedding_model

).as_retriever(search_kwargs={"k": 3})

3. 构建 RAG 链

qa_chain = RetrievalQA.from_chain_type(

llm=llm,

retriever=retriever,

chain_type="stuff",

return_source_documents=True

)

```


🛡️ 五、幻觉校验模块(关键!)

```python

hallucination_guard.py

import re

权威法条数据库(从官方JSON构建)

OFFICIAL_LAWS = set()

with open("laws/law_index.txt", "r") as f:

for line in f:

OFFICIAL_LAWS.add(line.strip()) # 如 "民法典第1079条"

SENSITIVE_WORDS = "包赢", "100%", "绝对胜诉", " guaranteed"

def verify_answer(answer: str, sources: list) -> dict:

1. 检查是否引用了真实法条

cited = re.findall(r"《(\^》+)》第(\d+)条", answer)

for law_name, article in cited:

full_ref = f"{law_name}第{article}条"

if full_ref not in OFFICIAL_LAWS:

return {"valid": False, "reason": f"引用不存在法条: {full_ref}"}

2. 检查敏感词

if any(word in answer for word in SENSITIVE_WORDS):

return {"valid": False, "reason": "包含违规承诺用语"}

3. 检查是否基于检索结果

source_text = " ".join(doc.page_content for doc in sources)

if not any(keyword in source_text for keyword in "法", "条", "规定"):

return {"valid": False, "reason": "未检索到相关法律依据"}

return {"valid": True, "answer": answer + "\n\n> 注:本回答基于公开法律法规生成,仅供参考。"}

```


🖥️ 六、Web 界面(Gradio)

```python

app.py

import gradio as gr

from law_rag_bot import qa_chain

from hallucination_guard import verify_answer

def legal_qa(question: str):

问题过滤(简单示例)

if any(w in question for w in "杀人", "逃税", "违法"):

return "该问题涉及违法行为,不予回答。"

result = qa_chain.invoke({"query": question})

verified = verify_answer(result"result", result"source_documents")

if verified"valid":

return verified"answer"

else:

return "未找到可靠法律依据,建议咨询执业律师。"

gr.Interface(

fn=legal_qa,

inputs=gr.Textbox(lines=2, placeholder="例如:离婚需要什么条件?"),

outputs="text",

title="⚖️ 开源法律问答助手(无幻觉版)",

description="基于 Baichuan2 + 国家法律法规库 | 仅用于学习参考"

).launch(server_name="0.0.0.0", server_port=7860)

```


📜 七、商用合规说明

| 组件 | 许可证 | 商用是否需授权 |

|------|--------|----------------|

| **Baichuan2** | Baichuan Open License(https://github.com/baichuan-inc/Baichuan2/blob/main/LICENSE) | ✅ 邮件申请即可免费商用 |

| **bge-large-zh-v1.5** | Apache 2.0 | ✅ 无需授权 |

| **Chroma / LangChain** | Apache 2.0 / MIT | ✅ 无需授权 |

| **国家法律法规文本** | 政府公开信息 | ✅ 无版权 |

> 📩 **Baichuan2 商用申请**:发送邮件至 **open@baichuan-ai.com**,说明用途,通常 1-3 天内获批。


📎 附录:示例法规数据格式(`civil_code.txt` 片段)

```

《中华人民共和国民法典》

第一编 总则

第一章 基本规定

第一条 为了保护民事主体的合法权益,调整民事关系......

第二条 民法调整平等主体的自然人、法人和非法人组织之间的人身关系和财产关系。

...

第五编 婚姻家庭

第一千零七十六条 夫妻双方自愿离婚的,应当签订书面离婚协议......

第一千零七十九条 夫妻一方要求离婚的,可以由有关组织进行调解或者直接向人民法院提起离婚诉讼。

```


✅ 总结:这套方案的优势

  1. **完全开源可商用**:无任何闭源或 AGPL 风险;

  2. **幻觉率极低**:通过 RAG + 校验双重保障;

  3. **部署成本低**:Baichuan2-7B INT4 仅需 6GB 显存;

  4. **符合中国法律场景**:中文优化、引用真实法条。

> 🔗 **完整代码仓库模板**(你可 fork 后自定义):

> https://github.com/yourname/open-law-rag (建议自行创建)

相关推荐
hsg772 分钟前
简述:2026年中考一地作文题目 :接纳无解,向阳求索
人工智能·机器学习
北京耐用通信7 分钟前
国产化替代优选!耐达讯自动化NY-HUB6完美兼容替代PB-HUB6\GL
人工智能·科技·网络协议·自动化·信息与通信
LaughingZhu11 分钟前
Product Hunt 每日热榜 | 2026-06-11
人工智能·经验分享·神经网络·html·产品运营
像风一样自由202024 分钟前
17.推理框架横评:vLLM / TGI / TensorRT-LLM / SGLang 全面对比
人工智能·大模型·vllm·sglang
walnut_oyb26 分钟前
CVPR 2026|VisRes Bench:视觉语言模型视觉推理能力评估
人工智能·语言模型·自然语言处理
网教盟人才服务平台31 分钟前
第223期方班学术研讨厅成功举办
人工智能
lauo37 分钟前
ibbot手机:从赛博攻防到Token经济的AI终端革命
人工智能·智能手机
私人珍藏库1 小时前
【Android】BotHub-多模型AI机器人聚合库-内置免费模型
android·人工智能·智能手机·app·工具·多功能
老马聊技术1 小时前
AI对话功能之SpringBoot整合Vue3
vue.js·人工智能·spring boot·后端
阿寻寻1 小时前
【人工智能学习260612-软件测试篇】小工具实现 [特殊字符] Prompt工程 + RAG思路 + API调用 + 自动化测试
人工智能·功能测试·学习·prompt