成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

DeepSeek R1與Qwen大模型,構(gòu)建Agentic RAG全攻略

發(fā)布于 2025-2-17 07:56
瀏覽
0收藏

最近,AI社區(qū)被 DeepSeek-R1 “刷屏” 了!作為一款極具變革意義的開源推理大語言模型(LLM),大家討論最多的是它的基礎(chǔ)能力,卻鮮有人關(guān)注其在智能體工作流程中的巨大潛力,也就是多個模型動態(tài)協(xié)作的應(yīng)用場景。

今天,就帶大家實操搭建一個智能體檢索增強生成(RAG,Retrieval-Augmented Generation)系統(tǒng)。這個系統(tǒng)整合了:

  • DeepSeek-R1(70億參數(shù)蒸餾版):用于復(fù)雜推理,系統(tǒng)的 “智慧大腦”。。
  • 阿里云Qwen2.5(70億參數(shù)):主打快速對話交互,讓用戶交流體驗更流暢。
  • 輕量級智能體框架:協(xié)調(diào)前兩者,保障系統(tǒng)高效運轉(zhuǎn)。

完成搭建后,Qwen 會處理常規(guī)交互,復(fù)雜查詢則交給R1。接下來動手試試!

1 設(shè)置環(huán)境

1.1 設(shè)置虛擬環(huán)境并安裝依賴項

python3 -m venv .envs/agentic-ai
source .envs/agentic-ai/bin/activate
mkdir agentic-ai 
cd agentic-ai

pip install langchain langchain-huggingface langchain-community pypdf langchain_chroma
pip install chromadb smolagents python-dotenv gradio sentence-transformers
pip 'install smolagents[openai]'

1.2 配置Ollama

DeepSeek的第一代推理模型性能可與OpenAI-o1媲美,其中包括基于Llama和Qwen從DeepSeek-R1蒸餾得到的6個密集模型。

Qwen 2.5模型在阿里巴巴最新的大規(guī)模數(shù)據(jù)集上進(jìn)行預(yù)訓(xùn)練,該數(shù)據(jù)集包含多達(dá)18萬億個標(biāo)記。該模型支持多達(dá)12.8萬個標(biāo)記,并具備多語言能力。

下載模型:

ollama pull deepseek-r1:7b  
ollama pull qwen2.5:7b-instruct

增加上下文窗口:

Ollama默認(rèn)的2048個標(biāo)記不夠用。創(chuàng)建自定義模型文件??deepseek-r1-7b-8k.Modelfile???和??qwen2.5-7b-instruct-8k.Modelfile??:

$ cat deepseek-r1-7b-8k.Modelfile 
FROM deepseek-r1:7b 
PARAMETER num_ctx 8192

$ cat qwen2.5-7b-instruct-8k.Modelfile
FROM qwen2.5:7b-instruct  
PARAMETER num_ctx 8192

ollama create deepseek-r1-7b-8k -f ./deepseek-r1-7b-8k.Modelfile
ollama create qwen2.5:7b-instruct-8k -f ./qwen2.5-7b-instruct-8k.Modelfile

2 創(chuàng)建知識庫

2.1 添加文檔

將PDF文件放在??data/???目錄下,這些文件將構(gòu)成知識庫的基礎(chǔ)。使用LangChain的??DirectoryLoader???加載PDF文件,并使用??RecursiveCharacterTextSplitter??將其拆分為較小的塊,以便進(jìn)行高效的索引和檢索。這樣能確保內(nèi)容以結(jié)構(gòu)化方式處理,更便于查詢和管理。

from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
import os
import shutil

def load_and_process_pdfs(data_dir: str):
    """從目錄加載PDF并拆分為塊。"""
    loader = DirectoryLoader(
        data_dir,
        glob="**/*.pdf",
        loader_cls=PyPDFLoader
    )
    documents = loader.load()

    # 將文檔拆分為塊
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=1000,
        chunk_overlap=200,
        length_function=len,
    )
    chunks = text_splitter.split_documents(documents)
    return chunks

2.2 將塊存儲在向量存儲(Chroma)中

將PDF處理并拆分為塊后,存儲在Chroma向量存儲中,以便基于語義相似性進(jìn)行高效的搜索和檢索。初始化并配置ChromaDB,然后使用Hugging Face Embeddings將每個塊轉(zhuǎn)換為向量表示,從而實現(xiàn)相關(guān)信息的準(zhǔn)確快速檢索。

def create_vector_store(chunks, persist_dir: str):
    """創(chuàng)建并持久化Chroma向量存儲。"""
    # 如果存在現(xiàn)有向量存儲,則刪除
    if os.path.exists(persist_dir):
        print(f"正在從 {persist_dir} 刪除現(xiàn)有向量存儲")
        shutil.rmtree(persist_dir)

    # 初始化HuggingFace嵌入
    embedding_model = HuggingFaceEmbeddings(
        model_name="sentence-transformers/all-mpnet-base-v2",
        model_kwargs={'device': 'cpu'}
    )

    # 構(gòu)建并持久化新的Chroma向量存儲
    print("正在構(gòu)建并保存新的向量存儲...")
    vector_db = Chroma.from_documents(
        documents=chunks,
        embedding=embedding_model,
        persist_directory=persist_dir
    )
    return vector_db

2.3 完成知識庫創(chuàng)建

塊已在ChromaDB中建立索引并存儲后,知識庫就可以進(jìn)行查詢了。運行最后一個代碼塊,加載并處理PDF文件,創(chuàng)建向量存儲,并基于語義相似性實現(xiàn)相關(guān)上下文的高效檢索。

def main():
    # 定義輸入數(shù)據(jù)和向量數(shù)據(jù)庫的路徑
    input_data_dir = os.path.join(os.path.dirname(__file__), "data")
    vector_db_dir = os.path.join(os.path.dirname(__file__), "chroma_db")

    # 加載PDF并拆分為較小的塊
    print("開始處理PDF...")
    document_chunks = load_and_process_pdfs(input_data_dir)
    print(f"從PDF生成了 {len(document_chunks)} 個文檔塊")

    # 構(gòu)建并存儲向量數(shù)據(jù)庫
    print("正在構(gòu)建向量存儲...")
    vector_db = create_vector_store(document_chunks, vector_db_dir)
    print(f"向量存儲已成功創(chuàng)建并保存到 {vector_db_dir}")

if __name__ == "__main__":
    main()

運行:

$ python ingest_pdfs.py  
開始處理PDF...
從PDF生成了312個文檔塊
正在構(gòu)建向量存儲...
向量存儲已成功創(chuàng)建并保存到./agentic-ai/chroma_db
$ ls chroma_db 
chroma.sqlite3                       d4c48cab-0467-4ca8-ad42-bafa5eb83040
$

3 構(gòu)建智能體系統(tǒng)

3.1 定義推理模型(DeepSeek-R1)

在智能體系統(tǒng)里,推理模型是 “心臟”。DeepSeek-R1 作為強大的推理模型,能夠處理復(fù)雜查詢。它可解析自然語言,結(jié)合知識庫給出連貫且切題的回答,還能理解文檔并提取關(guān)鍵知識。將 DeepSeek-R1 和知識庫融合,系統(tǒng)便能依據(jù)向量數(shù)據(jù)庫內(nèi)容解決問題、回應(yīng)查詢以及推理。

推理時,DeepSeek-R1 支持多步迭代,不斷優(yōu)化回復(fù),直至得到滿意答案,或達(dá)到預(yù)設(shè)的??max_steps??限制,以此確保推理準(zhǔn)確又高效,推動智能體系統(tǒng)穩(wěn)定運行。

# reasoning_model.py
from smolagents import OpenAIServerModel, CodeAgent
import os

# 定義本地模型名稱
reasoning_model_id = "deepseek-r1-7b-8k"# 使用DeepSeek進(jìn)行推理

def get_model(model_id):
    """返回一個Ollama模型。"""
    return OpenAIServerModel(
        model_id=model_id,
        api_base="http://localhost:11434/v1",  # Ollama API端點
        api_key="ollama"
    )

# 使用DeepSeek創(chuàng)建推理模型
reasoning_model = get_model(reasoning_model_id)

# 創(chuàng)建推理智能體
reasoner = CodeAgent(tools=[], model=reasoning_model, add_base_tools=False, max_steps=2)

3.2 創(chuàng)建RAG工具

這一步創(chuàng)建RAG(檢索增強生成)工具,該工具結(jié)合信息檢索和推理來回答用戶查詢。該工具利用向量數(shù)據(jù)庫(Chroma)通過嵌入存儲和檢索相關(guān)文檔。當(dāng)用戶提出問題時,該工具會從數(shù)據(jù)庫中搜索最相關(guān)的3個文檔。然后,這些文檔將作為上下文,促使推理模型(DeepSeek-R1)生成相關(guān)且簡潔的答案。

這種方法通過將文檔檢索與推理相結(jié)合,提高了系統(tǒng)提供準(zhǔn)確、有上下文感知答案的能力,適用于復(fù)雜或定義不明確的查詢。

# rag_tool.py
from langchain_chroma import Chroma
from langchain_huggingface import HuggingFaceEmbeddings
from reasoning_model import reasoner  # 從reasoning_model.py導(dǎo)入reasoner
import os

# 初始化向量存儲和嵌入
embeddings = HuggingFaceEmbeddings(
    model_name="sentence-transformers/all-mpnet-base-v2",
    model_kwargs={'device': 'cpu'}
)

# 向量數(shù)據(jù)庫目錄
db_dir = os.path.join(os.path.dirname(__file__), "chroma_db")

# 初始化向量存儲
vectordb = Chroma(persist_directory=db_dir, embedding_function=embeddings)


def rag_with_reasoner(user_query: str) -> str:
    """
    在向量數(shù)據(jù)庫中搜索相關(guān)上下文,并使用推理模型生成回復(fù)。

    參數(shù):
        user_query:用戶的問題。
    """
    # 檢索相關(guān)文檔
    docs = vectordb.similarity_search(user_query, k=3)
    context = "\n\n".join(doc.page_content for doc in docs)

    # 為推理模型創(chuàng)建提示
    prompt = f"""根據(jù)以下上下文,簡潔地回答用戶的問題。
    如果信息不足,請為RAG提出更好的查詢建議。

上下文:
{context}

問題:{user_query}

答案:"""

    # 使用reasoner(DeepSeek-R1)生成回復(fù)
    response = reasoner.run(prompt, reset=False)
    return response

3.3 配置主智能體(Qwen)

主智能體(Qwen)是系統(tǒng)與用戶交互和處理查詢的主要接口。主智能體使用Qwen模型(Qwen-2.5:7b)來解釋用戶輸入,并調(diào)用適當(dāng)?shù)墓ぞ呱苫貜?fù)。

# primary_agent.py
from smolagents import OpenAIServerModel, ToolCallingAgent
from rag_tool import rag_with_reasoner  # 從rag_tool.py導(dǎo)入工具函數(shù)
import os

def get_model(model_id):
    """返回一個Ollama模型。"""
    return OpenAIServerModel(
        model_id=model_id,
        api_base="http://localhost:11434/v1",  # Ollama API端點
        api_key="ollama"
    )

# 加載工具模型(Qwen-2.5:7b)
primary_model = get_model("qwen2.5:7b-instruct-8k")

# 使用Qwen創(chuàng)建主智能體以生成工具回復(fù)
primary_agent = ToolCallingAgent(tools=[rag_with_reasoner], model=primary_model, add_base_tools=False, max_steps=3)

# 導(dǎo)出智能體以供應(yīng)用程序使用
def get_primary_agent():
    return primary_agent

主智能體使用??ToolCallingAgent???類構(gòu)建,該類使模型能夠利用特定工具,在本案例中即??rag_with_reasoner??工具。該工具從向量數(shù)據(jù)庫中檢索相關(guān)文檔,并將其傳遞給推理模型(DeepSeek-R1)以生成回復(fù)。智能體配置為最多進(jìn)行3步推理,確保它根據(jù)提供的上下文迭代并完善答案。

這種設(shè)置確保主智能體能夠利用RAG過程,為用戶查詢提供智能且上下文相關(guān)的回復(fù),同時控制推理循環(huán)的次數(shù)。它使系統(tǒng)能夠精確高效地處理各種問題。

4 啟動Gradio用戶界面

啟動Gradio用戶界面,使用戶能夠與智能體系統(tǒng)進(jìn)行交互。Gradio為主智能體創(chuàng)建了一個簡單易用的界面。該界面允許用戶輸入查詢,并接收由推理和RAG工具生成的回復(fù)。這一步將后端功能與可視化界面連接起來,使系統(tǒng)對用戶來說可訪問且具有交互性。

# app.py
from primary_agent import get_primary_agent
from smolagents import GradioUI

# 從primary_agent.py獲取主智能體
primary_agent = get_primary_agent()

# 啟動界面的主函數(shù)
def main():
    GradioUI(primary_agent).launch()

if __name__ == "__main__":
    main()

運行:

$ python app.py                                                                                                  
* 正在本地URL運行:http://127.0.0.1:7860

5  工作原理

  1. 用戶輸入:用戶在Gradio界面提交問題,開啟交互流程。
  2. Qwen決策:作為主智能體的Qwen迅速判斷,簡單問題直接作答;復(fù)雜問題則調(diào)用RAG工具。
  3. RAG工具運作:RAG工具從ChromaDB檢索相關(guān)上下文,將分析任務(wù)委托給DeepSeek-R1。
  4. 生成回復(fù):DeepSeek-R1生成見解,Qwen將其整合,給出最終回復(fù)。

6 改進(jìn)方向

  • 回退邏輯:當(dāng)DeepSeek-R1置信度低時,自動觸發(fā)網(wǎng)絡(luò)搜索,補充信息。
  • 多跳查詢:智能體可迭代優(yōu)化查詢,提升復(fù)雜問題處理能力。
  • LangGraph集成:構(gòu)建復(fù)雜工作流程,實現(xiàn)高效狀態(tài)管理。

7 架構(gòu)優(yōu)勢與展望

本系統(tǒng)由Qwen和DeepSeek-R1協(xié)同工作,Qwen保障速度,DeepSeek-R1提供深度。這種架構(gòu)帶來了明顯優(yōu)勢:

  • 效率:DeepSeek-R1僅處理復(fù)雜查詢,資源利用高效。
  • 靈活性:可輕松更換模型,如采用Llama-3作為主模型。
  • 可擴展性:便于添加網(wǎng)絡(luò)搜索、計算器等工具。

智能體時代已經(jīng)來臨,快基于此架構(gòu),構(gòu)建更多創(chuàng)新應(yīng)用吧!

本文轉(zhuǎn)載自 ??AI科技論談??,作者: AI科技論談

收藏
回復(fù)
舉報
回復(fù)
相關(guān)推薦
主站蜘蛛池模板: 久久久视频在线 | 日本午夜精品 | 国精产品一品二品国精在线观看 | 欧美一区二区三区视频在线 | www视频在线观看 | 亚洲高清视频一区二区 | 真人女人一级毛片免费播放 | 日日碰狠狠躁久久躁96avv | 五月综合激情婷婷 | 精品av | 欧美日韩在线一区二区三区 | 国产免费一级片 | 最近最新中文字幕 | 亚洲成人免费观看 | 中国免费黄色片 | 色视频www在线播放国产人成 | 午夜精品一区二区三区在线观看 | 九九伦理电影 | 国产精品久久久久久久免费观看 | www.99re5.com| 国产成人99久久亚洲综合精品 | 人人操日日干 | 免费在线观看黄视频 | 少妇一级淫片免费播放 | 成人精品一区二区三区中文字幕 | 一区二区三区视频在线免费观看 | 国产视频久 | 欧美日韩亚洲一区 | 精品福利一区 | 99tv| 国产小视频自拍 | 欧洲精品码一区二区三区免费看 | 久久久久亚洲 | 国产电影一区二区在线观看 | 一区二区三区中文 | 日韩精品一区二区久久 | 欧美日韩在线电影 | 国产精久久久久久久 | 国产精品久久久久aaaa九色 | 一区二区视频在线 | 欧美国产亚洲一区二区 |