DeepSeek应用开发实战

48 阅读7分钟

在政务与法律领域引入大模型,我们面临的核心挑战并非技术可行性,而是如何在确保绝对合规高性能之间找到最佳平衡点。DeepSeek模型凭借其出色的推理能力和对中文的深度理解,为这两个高度敏感的领域提供了强大的技术基础。然而,一个成功的应用方案,关键在于精巧的架构设计和严谨的开发实践。

本文将结合实战经验,分享一套在政务和法律场景下,基于DeepSeek开发应用的核心方案,并提供关键代码示例。

一、核心挑战:信任的“两条生命线”

在政务和法律场景,任何技术方案都必须守护两条生命线:

  1. 合规性:  答案的准确性、可追溯性、无偏见性是底线。模型不能“胡说八道”,其生成内容必须基于可靠来源,且决策过程透明。
  2. 性能:  政务服务追求响应效率,法律文书处理需要高吞吐量。系统必须快速、稳定,能承受并发访问压力。

单纯调用API无法满足这些要求。我们的实战方案,正是围绕这两点构建的。

二、实战方案架构:RAG + 严格校验双引擎

为了解决上述挑战,我们设计的核心架构是“检索增强生成(RAG)+ 严格校验引擎”。这个架构能有效将DeepSeek的强大推理能力与领域内的私有知识库相结合,同时确保输出的合规性。

工作流程:

  1. 用户提问:  用户(如公务员、律师)提出问题。
  2. 意图识别与检索:  系统首先识别问题意图,然后从构建好的“政务/法律知识库”(如政策文件、法律法规、判例库)中检索最相关的文本片段。
  3. 增强生成:  将用户的问题和检索到的相关片段一同作为上下文,提交给DeepSeek模型,并附上精心设计的指令,要求其仅基于提供的上下文进行回答。
  4. 合规性校验:  对DeepSeek生成的答案进行多道“安检”,包括事实一致性检查、敏感词过滤、来源溯源等。
  5. 结果呈现:  将通过校验的答案,连同引用来源,一并呈现给用户。

三、核心代码实战

接下来,我们用Python代码实现这个方案的核心部分。

1. 环境准备

首先,安装必要的库:

bash

复制

pip install openai faiss-cpu sentence-transformers

我们使用faiss作为高效的向量数据库,sentence-transformers用于文本向量化,openai库来兼容调用DeepSeek的API。

2. 构建知识库与检索器

这是RAG的基础。我们将私有文档向量化并存入向量数据库。

python

复制

import faiss
import numpy as np
from sentence_transformers import SentenceTransformer

class KnowledgeBase:
    def __init__(self, model_name='BAAI/bge-small-zh-v1.5'):
        self.encoder = SentenceTransformer(model_name)
        self.index = faiss.IndexFlatL2(768)  # bge-small-zh-v1.5 的维度是768
        self.texts = []

    def add_texts(self, texts):
        """将文本列表添加到知识库"""
        self.texts.extend(texts)
        embeddings = self.encoder.encode(texts, convert_to_numpy=True)
        self.index.add(embeddings)
        print(f"已添加 {len(texts)} 条文本到知识库。")

    def search(self, query, k=3):
        """根据查询检索最相关的k个文本片段"""
        q_embedding = self.encoder.encode([query], convert_to_numpy=True)
        distances, indices = self.index.search(q_embedding, k)
        return [self.texts[i] for i in indices[0]]

# --- 示例用法 ---
# 假设我们有一些政务文档
kb_texts = [
    "根据《XX市高层次人才引进办法》,第四类人才可享受80万元安家补贴,分五年发放。",
    "办理营业执照变更,需在做出变更决定之日起30日内向登记机关申请。",
    "小微企业增值税起征点为月销售额10万元。"
]

# 初始化并构建知识库
kb = KnowledgeBase()
kb.add_texts(kb_texts)

3. DeepSeek调用与合规性封装

这是方案的核心。我们封装一个函数,严格执行“基于上下文回答”的原则,并返回引用来源。

python

复制

from openai import OpenAI

# 初始化DeepSeek客户端
# 请确保已设置环境变量 DEEPSEEK_API_KEY
client = OpenAI(
    api_key="YOUR_DEEPSEEK_API_KEY", 
    base_url="https://api.deepseek.com"
)

def ask_deepseek_with_context(query, context_snippets):
    """
    结合上下文向DeepSeek提问,确保回答的合规性
    
    Args:
        query (str): 用户原始问题
        context_snippets (list): 从知识库检索到的相关文本片段
    
    Returns:
        dict: 包含答案和来源的字典
    """
    # 这是关键的“避坑”技巧:设计一个严格的Prompt
    system_prompt = """你是一个专业的政务和法律助手。你的任务是**仅**根据下面提供的【参考资料】回答用户的问题。
    - 如果参考资料中没有相关信息,你必须明确回答“根据现有资料无法回答该问题”。
    - 回答时请保持客观、严谨。
    - 在回答的末尾,请用【来源】标明你参考的具体信息。"""

    user_prompt = f"""
    【用户问题】:
    {query}

    【参考资料】:
    {' '.join([f"资料{i+1}: {snippet}" for i, snippet in enumerate(context_snippets)])}
    """

    try:
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=[
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_prompt},
            ],
            temperature=0.1, # 降低温度,确保回答更稳定、确定性更高
        )
        
        answer = response.choices[0].message.content
        
        return {
            "answer": answer,
            "sources": context_snippets
        }

    except Exception as e:
        return {
            "answer": f"模型调用出错: {e}",
            "sources": []
        }

4. 整合流程:一个完整的问答示例

现在,我们将检索和生成串联起来,模拟一个完整的政务问答场景。

python

复制

def run_assistant(query):
    """运行完整的问答助手流程"""
    print(f"用户提问: {query}")
    
    # 步骤1: 从知识库检索
    relevant_docs = kb.search(query, k=2)
    print(f"\n[系统日志] 检索到 {len(relevant_docs)} 条相关资料。")
    
    # 步骤2: 调用DeepSeek生成答案
    result = ask_deepseek_with_context(query, relevant_docs)
    
    # 步骤3: 展示结果
    print("\n--- 助手回答 ---")
    print(result['answer'])
    print("\n--- 参考来源 ---")
    for i, source in enumerate(result['sources']):
        print(f"来源{i+1}: {source}")
    print("-" * 20)


# --- 实战测试 ---
# 测试一个知识库内的问题
run_assistant("第四类人才的安家补贴是多少?")

# 测试一个知识库外的问题,验证模型的“诚实”
run_assistant("如何申请专利?")

预期输出:

复制

用户提问: 第四类人才的安家补贴是多少?

[系统日志] 检索到 2 条相关资料。

--- 助手回答 ---
根据《XX市高层次人才引进办法》,第四类人才可享受80万元安家补贴,分五年发放。
【来源】资料1: 根据《XX市高层次人才引进办法》,第四类人才可享受80万元安家补贴,分五年发放。

--- 参考来源 ---
来源1: 根据《XX市高层次人才引进办法》,第四类人才可享受80万元安家补贴,分五年发放。
来源2: 办理营业执照变更,需在做出变更决定之日起30日内登记机关申请。
--------------------
用户提问: 如何申请专利?

[系统日志] 检索到 2 条相关资料。

--- 助手回答 ---
根据现有资料无法回答该问题。

--- 参考来源 ---
来源1: 小微企业增值税起征点为月销售额10万元。
来源2: 办理营业执照变更,需在做出变更决定之日起30日内登记机关申请。
--------------------

引用

四、性能优化与扩展

  • 性能:  对于海量文档,可使用faiss.IndexIVFFlat等更高级的索引类型提升检索速度。对DeepSeek API的调用可使用异步请求或连接池来处理高并发。

  • 合规性进阶:  可以在“严格校验引擎”中加入更多规则,例如:

    • 事实校验:  用正则表达式或小模型抽取答案中的关键实体,并与上下文比对,确保无捏造。
    • 溯源展示:  在前端高亮显示答案对应的原文片段,实现“句句有出处”。
    • 权限管理:  根据用户角色,限制其可访问的知识库范围。

结语

在政务和法律这类高要求的领域,技术方案的成败往往在细节之中。通过“RAG + 严格校验”的架构,我们不仅发挥了DeepSeek大模型的强大能力,更重要的是,通过工程化的手段为其套上了“合规”的缰绳和“性能”的引擎。这套方案的核心思想,与我们之前总结的“避坑指南”一脉相承:永远不要盲目相信模型的输出,要用系统性的设计去引导、约束和验证它。只有这样,大模型才能真正成为政务和法律工作中可靠、高效的智能助手。