如何使用Qwen3構建RAG系統和AI代理

如何使用Qwen3構建RAG系統和AI代理

Qwen 剛剛釋出了其最新系列 – Qwen3 的 8 個新模型,展示了令人期待的效能。旗艦模型 Qwen3-235B-A22B 在標準基準測試中的表現優於大多數其他模型,包括 DeepSeek-R1、OpenAI 的 o1、o3-mini、Grok 3 和 Gemini 2.5-Pro。同時,小型 Qwen3-30B-A3B 的效能超過了 QWQ-32B,後者的啟用引數大約是新模型的 10 倍。憑藉如此先進的功能,這些模型被證明是廣泛應用的最佳選擇。在本文中,我們將探討所有 Qwen3 模型的特點,並學習如何使用它們來構建 RAG 系統和人工智慧代理。

什麼是Qwen3?

Qwen3 是 Qwen 系列中最新的大型語言模型(LLM),由 8 個不同的模型組成。這些模型包括 Qwen3-235B-A22B、Qwen3-30B-A3B、Qwen3-32B、Qwen3-14B、Qwen3-8B、Qwen3-4B、Qwen3-1.7B 和 Qwen3-0.6B。所有這些模型都根據 Apache 2.0 許可證釋出,個人、開發人員和企業均可免費使用。

其中 6 個模型是密集型的,即在推理和訓練時主動使用所有引數,而 2 個模型是開放加權型的:

  • Qwen3-235B-A22B:一個擁有 2350 億個引數的大型模型,其中 220 億個為啟用引數。
  • Qwen3-30B-A3B:一個較小的 MoE,總引數為 300 億,啟用引數為 30 億。

以下是所有 8 個 Qwen3 模型的詳細比較:

模型 層數 Heads (Q/KV) Tie Embedding 上下文長度
Qwen3-0.6B 28 16/8 Yes 32K
Qwen3-1.7B 28 16/8 Yes 32K
Qwen3-4B 36 32/8 Yes 32K
Qwen3-8B 36 32/8 No 128K
Qwen3-14B 40 40/8 No 128K
Qwen3-32B 64 64/8 No 128K
Qwen3-30B-A3B 48 32/4 No 128K
Qwen3-235B-A22B 94 64/4 No 128K

下面是表格的內容:

  • 層數: 層數表示所用變壓器塊的數量。它包括多頭自注意機制、前饋網路、位置編碼、層歸一化和殘餘連線。因此,當我說 Qwen3-30B-A3B 有 48 層時,這意味著該模型使用了 48 個變壓器塊,按順序或並行堆疊。
  • Head:Transformers 使用多頭注意力,它將注意力機制分成多個頭,每個頭從資料中學習一個新的方面。這裡,Q/KV 表示
    • Q(查詢頭):用於生成查詢的注意力頭總數。
    • KV(鍵和值):每個注意塊的鍵/值注意頭數量。

注意:這些用於鍵、查詢和值的注意頭與自我注意生成的鍵、查詢和值向量完全不同。

推薦閱讀: Qwen3 模型:如何訪問、效能、功能和應用

Qwen3的主要特點

以下是 Qwen3 模型的一些主要特點:

預培訓:預訓練過程包括三個階段:

  • 在第一階段,對模型進行了超過 30 萬億個片語的預訓練,上下文長度為 4k 個片語。這讓模型掌握了基本的語言技能和常識。
  • 在第二階段,透過增加 STEM、編碼和推理任務等知識密集型資料的比例來提高資料質量。然後,在額外的 5 萬億個標記上對模型進行訓練。
  • 在最後階段,透過將上下文長度增加到 32K 位元組,使用了高質量的長上下文資料。這樣做是為了確保模型能夠有效處理更長的輸入。

後訓練:為了開發一個既能逐步推理又能快速反應的混合模型,我們實施了一個四階段訓練流水線。其中包括

  • 長思維鏈(CoT)
  • 基於推理的強化學習(RL)
  • 思維模式融合
  • 一般 RL

混合思維模式:Qwen3 模型採用混合方法解決問題,具有兩種新模式:

  • 思維模式:在這種模式下,模型將複雜的問題陳述分解成程式化的小步驟,從而節省時間。
  • 非思考模式:在這種模式下,模型能快速提供結果,主要適用於較簡單的問題。

多語言支援:Qwen3 模型支援 119 種語言和方言。這有助於世界各地的使用者從這些模型中受益。

改進的代理能力:Qwen 對 Qwen3 模型進行了最佳化,使其具有更好的編碼和代理能力,並支援模型上下文協議(MCP)。

如何透過API訪問Qwen3模型

為了使用 Qwen3 模型,我們將使用 Openrouter API 透過 API 進行訪問。具體操作如下

  1. Openrouter 上建立一個賬戶,然後進入模型搜尋欄查詢該模型的 API。

Openrouter

  1. 選擇所需的模型,然後點選登陸頁面上的 “Create API key”,生成新的 API。

生成新的 API

使用Qwen3為您的人工智慧解決方案提供動力

在本節中,我們將介紹使用 Qwen3 構建人工智慧應用程式的過程。我們將首先使用該模型建立一個人工智慧驅動的旅行計劃代理,然後使用 Langchain 建立一個 Q/A RAG 機器人。

前提條件

在使用 Qwen3 建立一些真實世界的人工智慧解決方案之前,我們需要先了解一些基本的先決條件,例如

使用Qwen3構建人工智慧代理

在本節中,我們將使用 Qwen3 建立一個由人工智慧驅動的旅行代理,它將為您提供所要訪問的城市或地方的主要旅遊景點。我們還將使該代理能夠在網際網路上搜尋最新資訊,並新增一個可以進行貨幣兌換的工具。

第 1 步:設定庫和工具

首先,我們將安裝和匯入建立代理所需的必要庫和工具。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
!pip install langchain langchain-community openai duckduckgo-search
from langchain.chat_models import ChatOpenAI
from langchain.agents import Tool
from langchain.tools import DuckDuckGoSearchRun
from langchain.agents import initialize_agent
llm = ChatOpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="your_api_key",
model="qwen/qwen3-235b-a22b:free"
)
# Web Search Tool
search = DuckDuckGoSearchRun()
# Tool for DestinationAgent
def get_destinations(destination):
return search.run(f"Top 3 tourist spots in {destination}")
DestinationTool = Tool(
name="Destination Recommender",
func=get_destinations,
description="Finds top places to visit in a city"
)
# Tool for CurrencyAgent
def convert_usd_to_inr(query):
amount = [float(s) for s in query.split() if s.replace('.', '', 1).isdigit()]
if amount:
return f"{amount[0]} USD = {amount[0] * 83.2:.2f} INR"
return "Couldn't parse amount."
CurrencyTool = Tool(
name="Currency Converter",
func=convert_usd_to_inr,
description="Converts USD to inr based on static rate"
)
!pip install langchain langchain-community openai duckduckgo-search from langchain.chat_models import ChatOpenAI from langchain.agents import Tool from langchain.tools import DuckDuckGoSearchRun from langchain.agents import initialize_agent llm = ChatOpenAI( base_url="https://openrouter.ai/api/v1", api_key="your_api_key", model="qwen/qwen3-235b-a22b:free" ) # Web Search Tool search = DuckDuckGoSearchRun() # Tool for DestinationAgent def get_destinations(destination): return search.run(f"Top 3 tourist spots in {destination}") DestinationTool = Tool( name="Destination Recommender", func=get_destinations, description="Finds top places to visit in a city" ) # Tool for CurrencyAgent def convert_usd_to_inr(query): amount = [float(s) for s in query.split() if s.replace('.', '', 1).isdigit()] if amount: return f"{amount[0]} USD = {amount[0] * 83.2:.2f} INR" return "Couldn't parse amount." CurrencyTool = Tool( name="Currency Converter", func=convert_usd_to_inr, description="Converts USD to inr based on static rate" )
!pip install langchain langchain-community openai duckduckgo-search
from langchain.chat_models import ChatOpenAI
from langchain.agents import Tool
from langchain.tools import DuckDuckGoSearchRun
from langchain.agents import initialize_agent
llm = ChatOpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="your_api_key",
model="qwen/qwen3-235b-a22b:free"
)
# Web Search Tool
search = DuckDuckGoSearchRun()
# Tool for DestinationAgent
def get_destinations(destination):
return search.run(f"Top 3 tourist spots in {destination}")
DestinationTool = Tool(
name="Destination Recommender",
func=get_destinations,
description="Finds top places to visit in a city"
)
# Tool for CurrencyAgent
def convert_usd_to_inr(query):
amount = [float(s) for s in query.split() if s.replace('.', '', 1).isdigit()]
if amount:
return f"{amount[0]} USD = {amount[0] * 83.2:.2f} INR"
return "Couldn't parse amount."
CurrencyTool = Tool(
name="Currency Converter",
func=convert_usd_to_inr,
description="Converts USD to inr based on static rate"
)
  • Search_tool:DuckDuckGoSearchRun() 可讓代理使用網路搜尋來獲取熱門旅遊景點的即時資訊。
  • DestinationTool:應用 get_destinations()函式,該函式使用搜尋工具獲取任何給定城市的前 3 個旅遊景點。
  • CurrencyTool:使用 convert_usd_too_inr() 函式將價格從美元轉換為印度盧比。您可以在函式中更改“inr”,將其轉換為您選擇的貨幣。

第 2 步:建立代理

現在,我們已經初始化了所有工具,接下來建立一個將使用這些工具併為我們提供旅行計劃的代理。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
tools = [DestinationTool, CurrencyTool]
agent = initialize_agent(
tools=tools,
llm=llm,
agent_type="zero-shot-react-description",
verbose=True
)
def trip_planner(city, usd_budget):
dest = get_destinations(city)
inr_budget = convert_usd_to_inr(f"{usd_budget} USD to INR")
return f"""Here is your travel plan:
*Top spots in {city}*:
{dest}
*Budget*:
{inr_budget}
Enjoy your day trip!"""
tools = [DestinationTool, CurrencyTool] agent = initialize_agent( tools=tools, llm=llm, agent_type="zero-shot-react-description", verbose=True ) def trip_planner(city, usd_budget): dest = get_destinations(city) inr_budget = convert_usd_to_inr(f"{usd_budget} USD to INR") return f"""Here is your travel plan: *Top spots in {city}*: {dest} *Budget*: {inr_budget} Enjoy your day trip!"""
tools = [DestinationTool, CurrencyTool]
agent = initialize_agent(
tools=tools,
llm=llm,
agent_type="zero-shot-react-description",
verbose=True
)
def trip_planner(city, usd_budget):
dest = get_destinations(city)
inr_budget = convert_usd_to_inr(f"{usd_budget} USD to INR")
return f"""Here is your travel plan:
*Top spots in {city}*:
{dest}
*Budget*:
{inr_budget}
Enjoy your day trip!"""
  • Initialize_agent:該函式使用零次反應方法建立具有 Langchain 的代理,使代理能夠理解工具說明。
  • Agent_type:“zero-shot-react-description”使代理 LLM 能夠透過工具描述和輸入,在不預先了解的情況下決定在特定情況下應使用哪種工具。
  • Verbose: Verbose 可記錄代理的思考過程,這樣我們就能監控代理做出的每個決定,包括所有互動和呼叫的工具。
  • trip_planner:這是一個 python 函式,用於手動呼叫工具,而不是依賴於代理。它允許使用者針對特定問題選擇最佳工具。

第 3 步:初始化代理

在本節中,我們將初始化代理並觀察其響應。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Initialize the Agent
city = "Delhi"
usd_budget = 8500
# Run the multi-agent planner
response = agent.run(f"Plan a day trip to {city} with a budget of {usd_budget} USD")
from IPython.display import Markdown, display
display(Markdown(response))
# Initialize the Agent city = "Delhi" usd_budget = 8500 # Run the multi-agent planner response = agent.run(f"Plan a day trip to {city} with a budget of {usd_budget} USD") from IPython.display import Markdown, display display(Markdown(response))
# Initialize the Agent
city = "Delhi"
usd_budget = 8500
# Run the multi-agent planner
response = agent.run(f"Plan a day trip to {city} with a budget of {usd_budget} USD")
from IPython.display import Markdown, display
display(Markdown(response))
  • 呼叫代理:agent.run() 透過提示使用使用者的意圖並計劃行程。

輸出

初始化代理

使用Qwen3構建RAG系統

在本節中,我們將建立一個 RAG 機器人,它可以回答知識庫中相關輸入文件中的任何查詢。該系統將使用 qwen/qwen3-235b-a22b,給出資訊豐富的回覆。該系統還將使用 Langchain,以生成準確且能感知上下文的回覆。

第 1 步:設定庫和工具

首先,我們將安裝和匯入構建 RAG 系統所需的必要庫和工具。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
!pip install langchain langchain-community langchain-core openai tiktoken chromadb sentence-transformers duckduckgo-search
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
# Load your document
loader = TextLoader("/content/my_docs.txt")
docs = loader.load()
!pip install langchain langchain-community langchain-core openai tiktoken chromadb sentence-transformers duckduckgo-search from langchain_community.document_loaders import TextLoader from langchain.text_splitter import CharacterTextSplitter from langchain_community.vectorstores import Chroma from langchain.embeddings import HuggingFaceEmbeddings from langchain.chains import RetrievalQA from langchain.chat_models import ChatOpenAI # Load your document loader = TextLoader("/content/my_docs.txt") docs = loader.load()
!pip install langchain langchain-community langchain-core openai tiktoken chromadb sentence-transformers duckduckgo-search
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
# Load your document
loader = TextLoader("/content/my_docs.txt")
docs = loader.load()
  • 載入文件: Langchain 的“TextLoader”類載入文件,如 pdf、txt 或 doc 檔案,這些檔案將用於 Q/A 檢索。這裡我上傳的是 my_docs.txt
  • 選擇向量設定:我使用 ChromaDB 從向量資料庫中儲存和搜尋嵌入資訊,用於 Q/A 過程。

第 2 步:建立嵌入結果

現在我們已經載入了文件,接下來就可以建立嵌入式了,這將有助於簡化檢索過程。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Split into chunks
splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=50)
chunks = splitter.split_documents(docs)
# Embed with HuggingFace model
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
db = Chroma.from_documents(chunks, embedding=embeddings)
# Setup Qwen LLM from OpenRouter
llm = ChatOpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="YOUR_API_KEY",
model="qwen/qwen3-235b-a22b:free"
)
# Create RAG chain
retriever = db.as_retriever(search_kwargs={"k": 2})
rag_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)
# Split into chunks splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=50) chunks = splitter.split_documents(docs) # Embed with HuggingFace model embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") db = Chroma.from_documents(chunks, embedding=embeddings) # Setup Qwen LLM from OpenRouter llm = ChatOpenAI( base_url="https://openrouter.ai/api/v1", api_key="YOUR_API_KEY", model="qwen/qwen3-235b-a22b:free" ) # Create RAG chain retriever = db.as_retriever(search_kwargs={"k": 2}) rag_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)
# Split into chunks
splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=50)
chunks = splitter.split_documents(docs)
# Embed with HuggingFace model
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
db = Chroma.from_documents(chunks, embedding=embeddings)
# Setup Qwen LLM from OpenRouter
llm = ChatOpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="YOUR_API_KEY",
model="qwen/qwen3-235b-a22b:free"
)
# Create RAG chain
retriever = db.as_retriever(search_kwargs={"k": 2})
rag_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)
  • 文件分割:CharacterTextSplitter() 會將文字分割成較小的塊,這主要有兩個作用。首先,它簡化了檢索過程,其次,它有助於透過 chunk_overlap 保留上一個分塊的上下文。
  • 嵌入文件:嵌入將文字轉換為每個標記的嵌入向量,每個向量的維度是固定的。在這裡,我們使用了 300 的 chunk_size,這意味著每個單詞/標記將被轉換成 300 維的向量。現在,該向量嵌入將包含該單詞相對於該語塊中其他單詞的所有上下文資訊。
  • RAG 鏈:RAG 鏈將 ChromaDB 與 LLM 結合起來,形成一個 RAG。這使我們能夠從文件和模型中獲得上下文感知答案。

第 3 步:初始化RAG系統

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Ask a question
response = rag_chain.invoke({"query": "How can i use Qwen with MCP. Please give me a stepwise guide along with the necessary code snippets"})
display(Markdown(response['result']))
# Ask a question response = rag_chain.invoke({"query": "How can i use Qwen with MCP. Please give me a stepwise guide along with the necessary code snippets"}) display(Markdown(response['result']))
# Ask a question
response = rag_chain.invoke({"query": "How can i use Qwen with MCP. Please give me a stepwise guide along with the necessary code snippets"})
display(Markdown(response['result']))
  • 查詢執行: rag_chain_invoke() 方法會將使用者的查詢傳送給 RAG 系統,然後 RAG 系統會從文件儲存(向量資料庫)中檢索相關的上下文感知塊,並生成上下文感知答案。

輸出

初始化RAG系統 初始化RAG系統 初始化RAG系統

您可以在這裡找到完整的程式碼

Qwen3的應用

以下是 Qwen3 在各行各業的更多應用:

  • 自動化編碼:Qwen3 可以生成、除錯程式碼並提供文件,幫助開發人員在無需人工的情況下解決錯誤。其22B引數模型在編碼方面表現出色,效能可與 DeepSeek-R1、Gemini 2.5 Pro和 OpenAI 的 o3-mini 等模型相媲美。
  • 教育與研究:Qwen3 在數學、物理和邏輯推理問題解決方面具有很高的準確性。它還可與 Gemini 2.5 Pro 相媲美,同時在 OpenAI 的 o1、o3-mini、DeepSeek-R1 和 Grok 3Beta 等模型中表現出色。
  • 基於代理的工具整合:Qwen3 在人工智慧代理任務方面也處於領先地位,它的工具呼叫模板允許使用外部工具、API 和 MCP 進行多步驟和多代理工作流,從而進一步簡化了代理互動。
  • 高階推理任務:Qwen3 具有廣泛的思維能力,可提供最佳和準確的響應。該模型對複雜任務採用思維鏈推理,對最佳化速度則採用非思維模式。

小結

在本文中,我們瞭解瞭如何構建由 Qwen3 驅動的代理人工智慧和 RAG 系統。Qwen3 的高效能、多語言支援和高階推理能力使其成為知識檢索和基於代理的任務的有力選擇。透過將 Qwen3 整合到 RAG 和代理管道中,我們可以獲得準確、上下文感知和流暢的響應,使其成為人工智慧驅動系統實際應用的有力競爭者。

評論留言