首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >DeepSeek 应用开发实战:从 API 调用到智能问答系统构建

DeepSeek 应用开发实战:从 API 调用到智能问答系统构建

原创
作者头像
用户12339161
发布2026-08-17 15:56:34
发布2026-08-17 15:56:34
150
举报

DeepSeek 凭借其卓越的性价比、超长上下文(1M tokens)和强大的函数调用能力,正成为开发者构建 AI 应用的首选模型之一。本文不重复官方文档,而是从实际工程视角出发,带领你完成一个具备流式对话、工具调用和本地知识库检索的智能问答系统,全程代码可复现。


1. 环境准备与 API 基础

DeepSeek 提供兼容 OpenAI 的 API 接口,因此可直接使用 openai Python 库。首先获取 API Key(从 DeepSeek 平台申请),并设置环境变量。

代码语言:javascript
复制
pip install openai requests langchain chromadb
export DEEPSEEK_API_KEY="sk-xxx"

基础调用代码:

代码语言:javascript
复制
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com/v1"  # DeepSeek 官方端点
)

response = client.chat.completions.create(
    model="deepseek-chat",  # 或 deepseek-reasoner(推理模型)
    messages=[{"role": "user", "content": "请用 Python 实现快速排序"}],
    temperature=0.3,
    max_tokens=2048
)
print(response.choices[0].message.content)

DeepSeek 的 deepseek-chat 模型已具备强大的指令遵循能力,且支持 JSON 模式(通过 response_format 参数)和 流式输出,为生产级应用打下基础。


2. 流式对话与上下文管理

在 Web 或移动端应用中,流式输出能显著提升用户体验。我们封装一个支持多轮对话的会话类,并实现流式生成。

代码语言:javascript
复制
class DeepSeekSession:
    def __init__(self, system_prompt=None):
        self.messages = []
        if system_prompt:
            self.messages.append({"role": "system", "content": system_prompt})
    
    def add_user(self, content):
        self.messages.append({"role": "user", "content": content})
    
    def add_assistant(self, content):
        self.messages.append({"role": "assistant", "content": content})
    
    def stream_chat(self, **kwargs):
        """流式生成,返回生成器"""
        stream = client.chat.completions.create(
            model="deepseek-chat",
            messages=self.messages,
            stream=True,
            **kwargs
        )
        for chunk in stream:
            if chunk.choices[0].delta.content:
                yield chunk.choices[0].delta.content

# 使用示例
session = DeepSeekSession("你是一名 Python 助手,回答需附带代码示例。")
session.add_user("如何读取 CSV 文件并统计缺失值?")
for token in session.stream_chat():
    print(token, end="", flush=True)

该会话类自动维护历史消息,支持流式逐字输出,适合集成到 FastAPI 的 SSE(Server-Sent Events)接口中。


3. 函数调用(Function Calling)实战

DeepSeek 支持 OpenAI 兼容的函数调用,可使模型主动触发外部 API。我们实现一个“实时天气查询”工具,模型根据用户问题决定是否调用。

首先定义工具 Schema:

代码语言:javascript
复制
tools = [{
    "type": "function",
    "function": {
        "name": "get_current_weather",
        "description": "获取指定城市的当前天气",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string", "description": "城市名称,如 Beijing"},
                "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
            },
            "required": ["city"]
        }
    }
}]

def get_current_weather(city, unit="celsius"):
    # 模拟真实 API 调用,实际可接入和风天气等
    return f"{city} 当前气温 22°C,晴间多云"

发起带工具调用的请求:

代码语言:javascript
复制
def chat_with_tools(user_query):
    messages = [{"role": "user", "content": user_query}]
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=messages,
        tools=tools,
        tool_choice="auto"  # 让模型自主决定
    )
    msg = response.choices[0].message
    if msg.tool_calls:
        # 执行工具调用
        for tc in msg.tool_calls:
            if tc.function.name == "get_current_weather":
                args = json.loads(tc.function.arguments)
                result = get_current_weather(args["city"], args.get("unit", "celsius"))
                # 将工具结果返回给模型
                messages.append(msg)  # 助手消息(含工具调用)
                messages.append({
                    "role": "tool",
                    "tool_call_id": tc.id,
                    "content": result
                })
        # 获取最终回答
        final = client.chat.completions.create(
            model="deepseek-chat",
            messages=messages
        )
        return final.choices[0].message.content
    else:
        return msg.content

print(chat_with_tools("北京今天天气怎么样?"))
# 输出:北京当前气温 22°C,晴间多云

该模式可扩展至数据库查询、邮件发送等任意业务 API,实现 Agent 雏形。


4. 构建本地知识库 RAG 系统

DeepSeek 超长上下文虽能容纳全书,但结合向量检索可精准定位相关信息,降低成本。我们使用 LangChain + Chroma 构建简易 RAG。

代码语言:javascript
复制
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma

# 1. 加载并切分文档
loader = TextLoader("product_manual.txt")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)

# 2. 生成向量库(使用开源嵌入模型)
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh")
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")

# 3. 检索 + 生成
def rag_query(query):
    retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
    docs = retriever.invoke(query)
    context = "\n\n".join([doc.page_content for doc in docs])
    prompt = f"""基于以下资料回答用户问题,若无法从资料中找到答案则说明。
    资料:{context}
    问题:{query}
    回答:"""
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.1
    )
    return response.choices[0].message.content

print(rag_query("产品的保修政策是什么?"))

此方案完全本地化嵌入,不依赖第三方 API,且 DeepSeek 的 1M 上下文可进一步将检索结果直接拼接,无需复杂压缩。


5. 生产环境优化建议

  • 缓存机制:对相同或相似查询使用 Redis 缓存结果,降低 API 调用成本。
  • 异步并发:使用 httpx.AsyncClient 配合 asyncio 实现高并发请求,避免阻塞。
  • 错误重试:封装指数退避重试,应对网络抖动或限流。
  • Token 计数:使用 tiktoken 预估请求量,合理设置 max_tokens 防止浪费。

6. 总结

本文从零开始,逐步展示了 DeepSeek 应用开发的核心环节:基础调用、流式会话、函数调用和 RAG 系统构建。DeepSeek 的高性能与开放接口使得开发者能以极低成本构建生产级 AI 应用。未来,结合 DeepSeek 的推理模型(deepseek-reasoner)还可实现复杂逻辑的逐步求解,进一步拓展应用边界。所有代码均经过本地测试,可直接裁剪复用。期待你在此基础上创造出更具价值的智能应用。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • DeepSeek 凭借其卓越的性价比、超长上下文(1M tokens)和强大的函数调用能力,正成为开发者构建 AI 应用的首选模型之一。本文不重复官方文档,而是从实际工程视角出发,带领你完成一个具备流式对话、工具调用和本地知识库检索的智能问答系统,全程代码可复现。
    • 1. 环境准备与 API 基础
    • 2. 流式对话与上下文管理
    • 3. 函数调用(Function Calling)实战
    • 4. 构建本地知识库 RAG 系统
    • 5. 生产环境优化建议
    • 6. 总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档