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

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

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

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

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

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

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


📦 一、整体架构

```mermaid

graph LR

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

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

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

D --> E[Prompt注入 + 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 (建议自行创建)

相关推荐
m0_603888712 小时前
Structured Over Scale Learning Spatial Reasoning from Educational Video
人工智能·深度学习·机器学习·ai·论文速览
Bruk.Liu2 小时前
(LangChain实战4):LangChain消息模版PromptTemplate
人工智能·python·langchain
HyperAI超神经2 小时前
【TVM教程】设备/目标交互
人工智能·深度学习·神经网络·microsoft·机器学习·交互·gpu算力
应用市场2 小时前
#AI对话与AI绘画的底层原理:从概率预测到创意生成的完整解析
人工智能·ai作画
肾透侧视攻城狮2 小时前
《解锁 PyTorch 张量:多维数据操作与 GPU 性能优化全解析》
人工智能·numpy·张量的索引和切片·张量形状变换·张量数学运算操作·张量的gpu加速·张量与 numpy 的互操作
Tadas-Gao2 小时前
大模型幻觉治理新范式:SCA与[PAUSE]注入技术的深度解析与创新设计
人工智能·深度学习·机器学习·架构·大模型·llm
查无此人byebye2 小时前
从零解读CLIP核心源码:PyTorch实现版逐行解析
人工智能·pytorch·python·深度学习·机器学习·自然语言处理·音视频
PKUMOD2 小时前
论文导读 | 在长上下文及复杂任务中的递归式语言模型架构
人工智能·语言模型·架构
海绵宝宝de派小星2 小时前
文本表示方法演进(词袋模型→Word2Vec→BERT)
人工智能·ai·bert·word2vec