0

0代码0基础,小白搭建智能体&知识库DeepSeek|Coze|Dify|RAG

1egferghrt
5天前 11

获课地址:666it.top/16572/

从零搭建DeepSeek+智能体&知识库:你的专属AI助手实战指南

引言:为什么你需要自己的AI智能体?

想象一下这样的场景:你有一个专属AI助手,它了解你的业务文档、熟悉你的工作流程、掌握你的知识库,能够24小时待命回答客户问题、整理会议纪要、生成工作报告。这不是科幻电影,而是今天就能实现的现实。

DeepSeek作为国产大模型的佼佼者,不仅性能出色,更重要的是对开发者友好、API价格亲民。结合智能体和知识库技术,我们可以构建真正懂业务、能行动的AI系统。本文将带你从零开始,一步步搭建属于自己的DeepSeek智能体与知识库。

一、技术全景:智能体与知识库的工作原理

智能体:不只是对话,更是行动

传统的AI对话模型只能“说”不能“做”,而智能体的核心突破在于自主行动能力。一个完整的智能体包含三个关键组件:

大脑(大语言模型):DeepSeek等模型负责理解用户意图、规划行动步骤、生成回复内容。这是智能体的决策中心。

感知(记忆与上下文):智能体需要记住对话历史、理解当前场景、调用相关知识。短期记忆维持对话连贯性,长期记忆存储用户偏好和历史交互。

行动(工具调用):这是智能体与传统对话的本质区别。通过调用外部工具,智能体可以查询数据库、发送邮件、操作API、控制设备,真正“动手”解决问题。

知识库:让AI拥有专业知识

通用大模型虽然知识广博,但对你的私有数据一无所知。RAG技术的出现解决了这个问题:

知识向量化:将文档、表格、手册等私有资料分割成片段,通过嵌入模型转换为向量,存入向量数据库。这个过程相当于为知识库建立“语义索引”。

实时检索增强:用户提问时,系统先将问题向量化,在知识库中检索最相关的片段,连同问题一起提交给DeepSeek。模型基于检索到的上下文生成精准答案。

动态更新机制:知识库可以随时增删改查,无需重新训练模型。当业务文档更新时,只需重新索引相关文件,AI就能立即掌握新知识。

DeepSeek的优势

选择DeepSeek作为智能体核心的理由:

性能卓越:在数学推理、代码生成、长文本理解等任务上达到国际一流水平

性价比高:API价格远低于GPT系列,适合高频调用和商业应用

上下文窗口大:支持万字级长文本,适合处理复杂文档和多轮对话

国产自主:数据安全更有保障,合规性更强

二、环境准备:搭建基础框架

注册与API获取

首先需要获取DeepSeek的API密钥:

bash
# 访问DeepSeek官网注册账号# 进入控制台创建API Key# 保存好你的API密钥,后续配置需要

开发环境搭建

我们使用Python作为主要开发语言,创建独立的虚拟环境:

bash
# 创建项目目录mkdir deepseek-agentcd deepseek-agent# 创建虚拟环境python -m venv venv# Windows系统执行: venv\Scripts\activatesource venv/bin/activate  # Mac/Linux# 安装核心依赖pip install openai  # DeepSeek兼容OpenAI接口格式pip install chromadb  # 向量数据库pip install langchain  # 智能体框架pip install gradio  # 快速构建界面pip install pypdf docx2txt  # 文档解析

配置DeepSeek客户端

DeepSeek提供了与OpenAI兼容的接口,可以直接使用OpenAI SDK调用:

python
# config.pyimport os# 设置API密钥os.environ["DEEPSEEK_API_KEY"] = "your-api-key-here"# DeepSeek API配置DEEPSEEK_API_BASE = "https://api.deepseek.com/v1"DEEPSEEK_MODEL = "deepseek-chat"  # 对话模型DEEPSEEK_EMBEDDING_MODEL = "deepseek-embedding"  # 嵌入模型# 向量数据库配置CHROMA_PERSIST_DIR = "./chroma_db"COLLECTION_NAME = "knowledge_base"

三、构建知识库:让AI读懂你的文档

文档加载与解析

首先需要将各类文档导入系统:

python
# knowledge_base/loader.pyimport osfrom typing import Listfrom langchain.document_loaders import (
    PyPDFLoader,
    TextLoader,
    Docx2txtLoader,
    DirectoryLoader)class DocumentLoader:
    """文档加载器,支持多种格式"""
    
    def __init__(self, docs_path: str):
        self.docs_path = docs_path        
    def load_all_documents(self):
        """加载目录下的所有文档"""
        documents = []
        
        # PDF加载器
        pdf_loader = DirectoryLoader(
            self.docs_path,
            glob="**/*.pdf",
            loader_cls=PyPDFLoader        )
        documents.extend(pdf_loader.load())
        
        # TXT加载器
        txt_loader = DirectoryLoader(
            self.docs_path,
            glob="**/*.txt",
            loader_cls=TextLoader        )
        documents.extend(txt_loader.load())
        
        # Word文档加载器
        docx_loader = DirectoryLoader(
            self.docs_path,
            glob="**/*.docx",
            loader_cls=Docx2txtLoader        )
        documents.extend(docx_loader.load())
        
        print(f"成功加载 {len(documents)} 个文档")
        return documents

智能分块策略

文档分割直接影响检索效果,需要根据不同文档类型采用不同策略:

python
# knowledge_base/splitter.pyfrom langchain.text_splitter import RecursiveCharacterTextSplitterclass DocumentSplitter:
    """智能文档分割器"""
    
    def __init__(self, chunk_size=500, chunk_overlap=50):
        self.chunk_size = chunk_size
        self.chunk_overlap = chunk_overlap
        
        self.text_splitter = RecursiveCharacterTextSplitter(
            chunk_size=chunk_size,
            chunk_overlap=chunk_overlap,
            length_function=len,
            separators=["\n\n", "\n", "。", "!", "?", ";", ",", " ", ""]
        )
    
    def split_documents(self, documents):
        """分割文档"""
        chunks = self.text_splitter.split_documents(documents)
        print(f"文档分割为 {len(chunks)} 个文本块")
        
        # 为每个块添加元数据
        for i, chunk in enumerate(chunks):
            if not hasattr(chunk, 'metadata'):
                chunk.metadata = {}
            chunk.metadata['chunk_id'] = i
            chunk.metadata['source_file'] = chunk.metadata.get('source', 'unknown')
            
        return chunks

向量化存储

使用Chroma向量数据库存储文档块:

python
# knowledge_base/vector_store.pyimport chromadbfrom chromadb.config import Settingsfrom langchain.embeddings import OpenAIEmbeddings  # DeepSeek嵌入兼容from langchain.vectorstores import Chromaclass VectorStore:
    """向量数据库管理"""
    
    def __init__(self, persist_directory, collection_name):
        self.persist_directory = persist_directory
        self.collection_name = collection_name        
        # 初始化DeepSeek嵌入模型
        self.embeddings = OpenAIEmbeddings(
            model="deepseek-embedding",
            openai_api_key=os.getenv("DEEPSEEK_API_KEY"),
            openai_api_base="https://api.deepseek.com/v1"
        )
        
        # 初始化Chroma客户端
        self.client = chromadb.PersistentClient(
            path=persist_directory,
            settings=Settings(anonymized_telemetry=False)
        )
    
    def create_vector_store(self, chunks):
        """从文档块创建向量库"""
        vector_store = Chroma.from_documents(
            documents=chunks,
            embedding=self.embeddings,
            persist_directory=self.persist_directory,
            collection_name=self.collection_name        )
        vector_store.persist()
        print(f"向量库创建完成,保存在 {self.persist_directory}")
        return vector_store    
    def load_vector_store(self):
        """加载已有向量库"""
        vector_store = Chroma(
            persist_directory=self.persist_directory,
            embedding_function=self.embeddings,
            collection_name=self.collection_name        )
        return vector_store

一键构建知识库

将上述模块整合为完整的构建流程:

python
# build_knowledge_base.pyimport osfrom knowledge_base.loader import DocumentLoaderfrom knowledge_base.splitter import DocumentSplitterfrom knowledge_base.vector_store import VectorStoredef build_knowledge_base(docs_path="./docs"):
    """一键构建知识库"""
    
    print("开始构建知识库...")
    
    # 1. 加载文档
    loader = DocumentLoader(docs_path)
    documents = loader.load_all_documents()
    
    if not documents:
        print("未找到文档,请检查路径")
        return
    
    # 2. 分割文档
    splitter = DocumentSplitter(chunk_size=500, chunk_overlap=50)
    chunks = splitter.split_documents(documents)
    
    # 3. 向量化存储
    vector_store = VectorStore(
        persist_directory="./chroma_db",
        collection_name="knowledge_base"
    )
    vector_store.create_vector_store(chunks)
    
    print("知识库构建完成!")if __name__ == "__main__":
    build_knowledge_base()

四、打造智能体:赋予AI行动能力

智能体核心框架

基于LangChain构建具备工具调用能力的智能体:

python
# agent/agent_core.pyfrom langchain.agents import AgentExecutor, create_openai_tools_agentfrom langchain.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain_openai import ChatOpenAIfrom langchain.memory import ConversationBufferMemoryclass DeepSeekAgent:
    """DeepSeek智能体核心"""
    
    def __init__(self, tools=None, system_prompt=None):
        # 初始化DeepSeek模型
        self.llm = ChatOpenAI(
            model="deepseek-chat",
            openai_api_key=os.getenv("DEEPSEEK_API_KEY"),
            openai_api_base="https://api.deepseek.com/v1",
            temperature=0.7,
            max_tokens=2000
        )
        
        # 默认系统提示词
        self.system_prompt = system_prompt or """你是一个智能助手,可以回答问题并调用工具完成任务。
        如果遇到知识库相关问题,请使用知识库检索工具获取信息。
        你的回答应当准确、简洁、有帮助。"""        
        # 初始化工具列表
        self.tools = tools or []
        
        # 创建提示模板
        self.prompt = ChatPromptTemplate.from_messages([
            ("system", self.system_prompt),
            MessagesPlaceholder(variable_name="chat_history"),
            ("human", "{input}"),
            MessagesPlaceholder(variable_name="agent_scratchpad")
        ])
        
        # 创建记忆组件
        self.memory = ConversationBufferMemory(
            memory_key="chat_history",
            return_messages=True
        )
        
        # 创建智能体
        self.agent = create_openai_tools_agent(
            llm=self.llm,
            tools=self.tools,
            prompt=self.prompt        )
        
        # 创建执行器
        self.agent_executor = AgentExecutor(
            agent=self.agent,
            tools=self.tools,
            memory=self.memory,
            verbose=True,
            handle_parsing_errors=True
        )
    
    def chat(self, message):
        """与智能体对话"""
        response = self.agent_executor.invoke({"input": message})
        return response["output"]

知识库检索工具

为智能体添加从知识库检索信息的能力:

python
# tools/retrieval_tool.pyfrom langchain.tools import BaseToolfrom typing import Optional, Typefrom pydantic import BaseModel, Fieldclass KnowledgeBaseInput(BaseModel):
    """知识库检索工具的输入"""
    query: str = Field(description="要检索的问题或关键词")class KnowledgeBaseTool(BaseTool):
    """知识库检索工具"""
    
    name = "knowledge_base_search"
    description = "从知识库中检索相关信息,当用户问题涉及文档内容时使用"
    args_schema: Type[BaseModel] = KnowledgeBaseInput    
    def __init__(self, vector_store):
        super().__init__()
        self.vector_store = vector_store
        self.retriever = vector_store.as_retriever(
            search_type="similarity",
            search_kwargs={"k": 5}
        )
    
    def _run(self, query: str) -> str:
        """执行检索"""
        try:
            docs = self.retriever.get_relevant_documents(query)
            if not docs:
                return "知识库中未找到相关信息"
            
            # 格式化检索结果
            results = []
            for i, doc in enumerate(docs):
                source = doc.metadata.get('source_file', '未知来源')
                content = doc.page_content
                results.append(f"[{i+1}] 来源:{source}\n内容:{content}\n")
            
            return "\n".join(results)
        except Exception as e:
            return f"检索过程中出现错误:{str(e)}"
    
    async def _arun(self, query: str) -> str:
        """异步执行(可选实现)"""
        return self._run(query)

实用工具集锦

为智能体添加更多实用工具:

python
# tools/utility_tools.pyfrom langchain.tools import BaseToolimport requestsimport datetimeimport jsonclass CurrentTimeTool(BaseTool):
    """获取当前时间"""
    name = "get_current_time"
    description = "获取当前日期和时间,当用户询问时间相关问题时使用"
    
    def _run(self, _: str) -> str:
        now = datetime.datetime.now()
        return f"当前时间是:{now.strftime('%Y年%m月%d日 %H:%M:%S')}"class CalculatorTool(BaseTool):
    """简单计算器"""
    name = "calculator"
    description = "执行数学计算,输入应为数学表达式,如 '2+3*4'"
    
    def _run(self, expression: str) -> str:
        try:
            # 安全评估数学表达式
            result = eval(expression, {"__builtins__": {}}, {})
            return f"计算结果:{result}"
        except Exception as e:
            return f"计算错误:{str(e)}"class WebSearchTool(BaseTool):
    """网络搜索(需要配置搜索引擎API)"""
    name = "web_search"
    description = "搜索网络信息,当问题需要实时或最新信息时使用"
    
    def _run(self, query: str) -> str:
        # 这里需要集成搜索引擎API,如必应搜索、百度搜索等
        # 示例返回,实际使用时需要调用真实API
        return f"正在搜索:{query},请配置搜索引擎API"

完整智能体组装

将所有组件整合成一个完整的智能体:

python
# create_agent.pyfrom agent.agent_core import DeepSeekAgentfrom tools.retrieval_tool import KnowledgeBaseToolfrom tools.utility_tools import CurrentTimeTool, CalculatorToolfrom knowledge_base.vector_store import VectorStoredef create_agent_with_knowledge():
    """创建带知识库的智能体"""
    
    # 1. 加载知识库
    vector_store = VectorStore(
        persist_directory="./chroma_db",
        collection_name="knowledge_base"
    ).load_vector_store()
    
    # 2. 创建工具
    tools = [
        KnowledgeBaseTool(vector_store),
        CurrentTimeTool(),
        CalculatorTool()
    ]
    
    # 3. 自定义系统提示词
    system_prompt = """你是一个智能助手,拥有知识库检索能力。
    使用规则:
- 优先使用知识库检索工具回答专业问题
- 对于简单常识问题可以直接回答
- 如果需要计算或查询时间,调用相应工具
- 回答要简洁准确,引用信息来源
- 不确定的信息要明确说明"""    
    # 4. 创建智能体
    agent = DeepSeekAgent(
        tools=tools,
        system_prompt=system_prompt    )
    
    return agentif __name__ == "__main__":
    agent = create_agent_with_knowledge()
    
    # 测试对话
    while True:
        user_input = input("\n请输入问题(输入exit退出):")
        if user_input.lower() == 'exit':
            break
        
        response = agent.chat(user_input)
        print(f"\n智能体:{response}")

五、部署应用:让智能体触手可及

构建Web界面

使用Gradio快速创建友好的交互界面:

python
# app.pyimport gradio as grfrom create_agent import create_agent_with_knowledge# 初始化智能体(启动时加载)print("正在初始化智能体...")agent = create_agent_with_knowledge()print("智能体初始化完成!")def chat_with_agent(message, history):
    """处理对话"""
    try:
        response = agent.chat(message)
        return response    except Exception as e:
        return f"抱歉,处理时出现错误:{str(e)}"# 创建Gradio界面with gr.Blocks(title="DeepSeek智能体知识库", theme=gr.themes.Soft()) as demo:
    gr.Markdown("""
    # 					

										
本站不存储任何实质资源,该帖为网盘用户发布的网盘链接介绍帖,本文内所有链接指向的云盘网盘资源,其版权归版权方所有!其实际管理权为帖子发布者所有,本站无法操作相关资源。如您认为本站任何介绍帖侵犯了您的合法版权,请发送邮件 [email protected] 进行投诉,我们将在确认本文链接指向的资源存在侵权后,立即删除相关介绍帖子!
最新回复 (0)

    暂无评论

请先登录后发表评论!

返回
请先登录后发表评论!