用DeepSeek-R1构建GenAI应用

在这篇文章中,我们将使用DeepSeek开源模型构建一个生成式AI应用程序,该模型能够根据我们的需求生成代码和其他内容。

用DeepSeek-R1构建GenAI应用

在这篇文章中,我们将使用DeepSeek开源模型构建一个生成式AI应用程序,该模型能够根据我们的需求生成代码和其他内容。在构建此应用程序时,我们将使用Langchain(AI工作流框架)、Ollama和DeepSeek-R1等开源工具。

为什么我们使用DeepSeek-R1、Langchain和Ollama?
  1. DeepSeek-R1: 一种高度强大的开源LLM,在推理、编码和创意任务方面表现出色。
  2. Langchain: 简化了将AI组件(模型、提示、数据库)组合成连贯的工作流程。
  3. Ollama: 它允许你在本地机器上运行DeepSeek-R1、Llama3.3和Phi-4等LLM,即使没有GPU。

0、环境搭建

首先从官方链接下载Ollama。

然后使用Ollama下载DeepSeek-R1模型

ollama run deepseek-r1:1.5b

接下来,安装以下库以运行模型

pip install streamlit  
pip install langchain_core  
pip install langchain_community  
pip install langchain_ollama

现在让我们逐步编写代码。

1、LLM初始化

llm_engine = ChatOllama(  
    model=selected_model,  
    base_url="http://localhost:11434",  
    temperature=0.3,  
    streaming=True  
)
  • ChatOllama: 用于与托管在localhost:11434上的本地LLM交互的客户端。
  • selected_model: 您选择的LLM(例如,DeepSeek)。
  • temperature=0.3: 控制随机性(0 = 确定性,1 = 创造性)。
  • streaming=True: 启用实时响应流。

2、系统提示配置

system_prompt = SystemMessagePromptTemplate.from_template(  
    "You are an expert AI coding assistant..."  
)
  • 定义AI的初始行为(简洁、正确且带有调试技巧)。
  • 在对话开始之前为模型提供上下文。

3、会话状态管理

if "message_log" not in st.session_state:  
    st.session_state.message_log = [{"role": "ai", "content": "Hi! I'm DeepSeek..."}]
  • st.session_state: 维护跨交互的聊天历史记录。
  • 如果没有先前的聊天,则发送AI的问候消息。

4、显示聊天历史记录

def display_chat_history():  
    for message in st.session_state.message_log:  
        with st.chat_message(message["role"]):  
            st.markdown(message["content"])
  • 迭代所有过去的聊天记录(用户和AI)。
  • 使用st.chat_message()按适当的角色(用户或AI)显示它们。

5、构建提示链

def build_prompt_chain():  
    prompt_sequence = [system_prompt]  
    for msg in st.session_state.message_log:  
        if msg["role"] == "user":  
            prompt_sequence.append(HumanMessagePromptTemplate.from_template(msg["content"]))  
        elif msg["role"] == "ai":  
            prompt_sequence.append(AIMessagePromptTemplate.from_template(msg["content"]))  
    return ChatPromptTemplate.from_messages(prompt_sequence)
  • 初始化: 函数首先添加系统_prompt到提示序列中以设置AI的行为。
  • 会话历史处理: 它循环遍历st.session_state.message_log,添加用户消息使用HumanMessagePromptTemplate和AI响应使用AIMessagePromptTemplate。
  • 提示链创建: 最后,它返回包含系统提示和完整对话历史的ChatPromptTemplate,以便上下文感知的AI响应。

6、使用流式传输生成AI响应

def generate_response():  
    prompt_chain = build_prompt_chain()  
    processing_pipeline = prompt_chain | llm_engine | StrOutputParser()  
    return processing_pipeline.stream({})
  • 链接在一起: 提示、LLM和输出解析器。
  • stream(): 分块流式传输响应,启用实时打字效果。

以下是结合后的代码。我添加了Streamlit和HTML&CSS代码,以便在UI上查看应用程序。

import streamlit as st  
from langchain_ollama import ChatOllama  
from langchain_core.output_parsers import StrOutputParser  
from langchain_core.prompts import (  
    SystemMessagePromptTemplate,  
    HumanMessagePromptTemplate,  
    AIMessagePromptTemplate,  
    ChatPromptTemplate  
)  
import warnings  
import sys  
# 自定义应用程序的CSS样式  
st.markdown("""  
<style>  
    /* 现有样式 */  
    .main {  
        background-color: #1a1a1a;  
        color: #ffffff;  
    }  
    .sidebar .sidebar-content {  
        background-color: #2d2d2d;  
    }  
    .stTextInput textarea {  
        color: #ffffff !important;  
    }  
    /* 为下拉框添加这些新样式 */  
    .stSelectbox div[data-baseweb="select"] {  
        color: white !important;  
        background-color: #3d3d3d !important;  
    }  
    .stSelectbox svg {  
        fill: white !important;  
    }  
    .stSelectbox option {  
        background-color: #2d2d2d !important;  
        color: white !important;  
    }  
    /* 对于下拉菜单项 */  
    div[role="listbox"] div {  
        background-color: #2d2d2d !important;  
        color: white !important;  
    }  
</style>  
""", unsafe_allow_html=True)  
st.title("🧠 DeepSeek代码伴侣由Lokendra构建")  
st.caption("🚀 具有调试超能力的AI配对程序员")  
# 侧边栏配置  
with st.sidebar:  
    st.header("⚙️ 配置")  
    selected_model = st.selectbox(  
        "选择模型",  
        ["deepseek-r1:1.5b", "deepseek-r1:3b", "deepseek-r1:7b", "deepseek-r1:8b"],  
        index=0  
    )  
    st.divider()  
    st.markdown("### 模型功能")  
    st.markdown("""  
    - 🐍 代码生成  
    - 🐞 调试助手  
    - 📝 文档  
    """)  
    st.divider()  
    st.markdown("### 🔗 资源")  
    st.markdown("""  
    - [Ollama文档](https://ollama.ai/)  
    - [LangChain指南](https://python.langchain.com/)  
    - [DeepSeek GitHub](https://github.com/deepseek-ai)  
    """)  
# 主代码逻辑从这里开始  
# 使用选定的模型(Deepseek)初始化聊天引擎  
llm_engine = ChatOllama(  
    model=selected_model,  
    base_url="http://localhost:11434",  
    temperature=0.3,  
    streaming=True  
)  
  
system_prompt = SystemMessagePromptTemplate.from_template(  
    "You are an expert AI coding assistant. Provide concise, correct solutions "  
    "with strategic print statements for debugging. Always respond in English."  
)  
# 会话状态管理  
if "message_log" not in st.session_state:  
    st.session_state.message_log = [{  
        "role": "ai",   
        "content": "Hi! I'm DeepSeek. How can I help you code today? 💻"  
    }]  
# 显示聊天消息  
def display_chat_history():  
    for message in st.session_state.message_log:  
        with st.chat_message(message["role"]):  
            st.markdown(message["content"])  
# 构建提示链  
def build_prompt_chain():  
    prompt_sequence = [system_prompt]  
    for msg in st.session_state.message_log:  
        if msg["role"] == "user":  
            prompt_sequence.append(HumanMessagePromptTemplate.from_template(msg["content"]))  
        elif msg["role"] == "ai":  
            prompt_sequence.append(AIMessagePromptTemplate.from_template(msg["content"]))  
    return ChatPromptTemplate.from_messages(prompt_sequence)  
  
def generate_response():  
    prompt_chain = build_prompt_chain()  
    processing_pipeline = prompt_chain | llm_engine | StrOutputParser()  
    return processing_pipeline.stream({})  
  
display_chat_history()  
  
user_query = st.chat_input("在此输入您的编程问题...")  
if user_query:  
     
    st.session_state.message_log.append({"role": "user", "content": user_query})  
     
    with st.chat_message("user"):  
        st.markdown(user_query)  
     
    with st.chat_message("ai"):  
        response_placeholder = st.empty()  
        response_placeholder.markdown('<div class="typing-indicator">生成中<span class="dot"></span><span class="dot"></span><span class="dot"></span></div>', unsafe_allow_html=True)  
   
    full_response = ""  
    for chunk in generate_response():  
        full_response += chunk  
        response_placeholder.markdown(full_response + "▌")  
    # 更新最终响应  
    response_placeholder.markdown(full_response)  
    # 将助手响应添加到历史记录  
    st.session_state.message_log.append({"role": "ai", "content": full_response})

要运行上述代码,请使用以下命令:

streamlit run app.py

现在你可以准备在不使用互联网的情况下向您的生成式AI应用程序提出任何类型的问题。

7、结束语

通过使用DeepSeek-R1、Langchain和Ollama,我们构建了一个功能强大的生成式AI应用程序,能够生成智能响应。这种架构可以扩展以支持复杂的工作流程、实时数据处理和高级NLP任务。

对于本文的代码,你可以在我的GitHub上查看。


原文链接:Build a Gen AI App with the DeepSeek-R1 Model Using LangChain and Ollama

汇智网翻译整理,转载请标明出处