最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Agent Skills工作流從入門到實戰(zhàn)

  發(fā)布時間:2026-05-11 10:15:08   作者:雨中飄蕩的記憶   我要評論
本文介紹了AgentSkills工作流的設(shè)計與實現(xiàn),涵蓋基礎(chǔ)概念、核心組件、技能實現(xiàn)、交互機制、多Agent協(xié)作、實戰(zhàn)案例及生產(chǎn)環(huán)境部署等內(nèi)容,感興趣的可以了解一下

前言

在人工智能快速發(fā)展的今天,Agent智能體技術(shù)正在改變我們構(gòu)建應(yīng)用的方式。Agent Skills工作流作為連接智能體與具體能力的橋梁,為開發(fā)者提供了一種靈活、可擴(kuò)展的架構(gòu)模式。本文將從基礎(chǔ)概念出發(fā),結(jié)合實際案例,帶你深入了解Agent Skills的設(shè)計與實現(xiàn)。

一、什么是Agent Skills

1.1 核心概念

Agent(智能體):具有自主決策能力的實體,能夠理解任務(wù)、規(guī)劃行動并執(zhí)行操作。

Skill(技能):Agent可以調(diào)用的具體能力單元,如文件讀取、數(shù)據(jù)查詢、文本分析等。

Agent Skills工作流:Agent通過識別任務(wù)需求,動態(tài)選擇并調(diào)用合適的Skill,最終完成用戶目標(biāo)的過程。

1.2 架構(gòu)設(shè)計

Agent Skills架構(gòu)包含四個核心層次:

  • Agent Core:智能體核心,負(fù)責(zé)決策和協(xié)調(diào)
  • Skill Registry:技能注冊中心,管理所有可用技能
  • Execution Engine:執(zhí)行引擎,處理技能調(diào)用和錯誤重試
  • Skill Implementations:具體技能實現(xiàn)層

這種分層設(shè)計確保了系統(tǒng)的可擴(kuò)展性和可維護(hù)性。

二、核心組件實現(xiàn)

2.1 Agent接口設(shè)計

package com.example.agent;
import com.example.skills.Skill;
import com.example.skills.SkillResult;
import java.util.Map;
/**
 * Agent智能體接口
 * 定義Agent的基本行為和能力
 * @version 1.0.0
 */
public interface Agent {
    /**
     * 獲取Agent名稱
     */
    String getName();
    /**
     * 獲取Agent描述
     */
    String getDescription();
    /**
     * 執(zhí)行任務(wù)
     *
     * @param task 任務(wù)內(nèi)容
     * @param context 執(zhí)行上下文
     * @return 執(zhí)行結(jié)果
     */
    AgentResult execute(String task, AgentContext context);
    /**
     * 注冊技能
     *
     * @param skill 技能實例
     */
    void registerSkill(Skill skill);
    /**
     * 獲取已注冊的所有技能
     */
    java.util.Collection<Skill> getSkills();
    /**
     * Agent執(zhí)行結(jié)果
     */
    class AgentResult {
        private final boolean success;
        private final String message;
        private final Object data;
        private final long executionTime;
        public AgentResult(boolean success, String message, Object data, long executionTime) {
            this.success = success;
            this.message = message;
            this.data = data;
            this.executionTime = executionTime;
        }
        public static AgentResult success(String message, Object data) {
            return new AgentResult(true, message, data, 0);
        }
        public static AgentResult success(String message, Object data, long executionTime) {
            return new AgentResult(true, message, data, executionTime);
        }
        public static AgentResult failure(String message) {
            return new AgentResult(false, message, null, 0);
        }
        public boolean isSuccess() {
            return success;
        }
        public String getMessage() {
            return message;
        }
        public Object getData() {
            return data;
        }
        public long getExecutionTime() {
            return executionTime;
        }
        @Override
        public String toString() {
            return "AgentResult{" +
                    "success=" + success +
                    ", message='" + message + '\'' +
                    ", data=" + data +
                    ", executionTime=" + executionTime + "ms" +
                    '}';
        }
    }
}

Agent接口定義了智能體的基本行為,其中最關(guān)鍵的是execute方法,它接收任務(wù)和上下文,返回執(zhí)行結(jié)果。

2.2 Skill接口設(shè)計

package com.example.skills;

import java.util.Map;

/**
 * Skill技能接口
 * 定義Agent可以執(zhí)行的具體技能
 * @version 1.0.0
 */
public interface Skill {

    /**
     * 獲取技能名稱
     */
    String getName();

    /**
     * 獲取技能描述
     */
    String getDescription();

    /**
     * 獲取技能版本
     */
    default String getVersion() {
        return "1.0.0";
    }

    /**
     * 判斷技能是否可以執(zhí)行該任務(wù)
     *
     * @param task 任務(wù)內(nèi)容
     * @return 是否可以執(zhí)行
     */
    boolean canExecute(String task);

    /**
     * 執(zhí)行技能
     *
     * @param task 任務(wù)內(nèi)容
     * @param parameters 參數(shù)
     * @return 執(zhí)行結(jié)果
     */
    SkillResult execute(String task, Map<String, Object> parameters);

    /**
     * 獲取技能的超時時間(毫秒)
     * 默認(rèn)30秒
     */
    default long getTimeout() {
        return 30000;
    }

    /**
     * 技能執(zhí)行前的驗證
     *
     * @param task 任務(wù)內(nèi)容
     * @param parameters 參數(shù)
     * @return 驗證是否通過
     */
    default boolean validate(String task, Map<String, Object> parameters) {
        return task != null && !task.trim().isEmpty();
    }

    /**
     * 技能執(zhí)行后的清理
     */
    default void cleanup() {
        // 默認(rèn)不需要清理
    }
}

Skill接口采用策略模式,每個技能實現(xiàn)獨立的功能,并通過canExecute方法聲明自己能處理哪些任務(wù)。

2.3 技能調(diào)用流程

完整的技能調(diào)用流程包括10個步驟:

  1. 接收用戶請求
  2. 解析任務(wù)意圖
  3. 匹配可用技能
  4. 驗證執(zhí)行權(quán)限
  5. 準(zhǔn)備執(zhí)行參數(shù)
  6. 調(diào)用技能接口
  7. 監(jiān)控執(zhí)行狀態(tài)
  8. 處理執(zhí)行結(jié)果
  9. 返回響應(yīng)數(shù)據(jù)
  10. 更新執(zhí)行歷史

每個步驟都有其特定的職責(zé),確保任務(wù)能夠安全、高效地執(zhí)行。

三、基礎(chǔ)技能實現(xiàn)

3.1 文件讀取技能

package com.example.skills.impl;

import com.example.skills.Skill;
import com.example.skills.SkillResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 文件讀取技能
 * 用于讀取本地文件內(nèi)容
 * @version 1.0.0
 */
public class FileReadSkill implements Skill {

    private static final Logger logger = LoggerFactory.getLogger(FileReadSkill.class);

    @Override
    public String getName() {
        return "FileReadSkill";
    }

    @Override
    public String getDescription() {
        return "讀取本地文件內(nèi)容,支持文本文件、配置文件等";
    }

    @Override
    public boolean canExecute(String task) {
        if (task == null) {
            return false;
        }
        String lowerTask = task.toLowerCase();
        return lowerTask.contains("文件") &&
               (lowerTask.contains("讀取") || lowerTask.contains("打開") || lowerTask.contains("查看"));
    }

    @Override
    public boolean validate(String task, Map<String, Object> parameters) {
        if (!Skill.super.validate(task, parameters)) {
            return false;
        }

        // 檢查文件路徑參數(shù)
        Object filePath = parameters.get("filePath");
        if (filePath == null) {
            logger.warn("filePath parameter is missing");
            return false;
        }

        Path path = Paths.get(filePath.toString());
        if (!Files.exists(path)) {
            logger.warn("File does not exist: {}", filePath);
            return false;
        }

        if (!Files.isReadable(path)) {
            logger.warn("File is not readable: {}", filePath);
            return false;
        }

        return true;
    }

    @Override
    public SkillResult execute(String task, Map<String, Object> parameters) {
        long startTime = System.currentTimeMillis();

        try {
            String filePath = parameters.get("filePath").toString();

            logger.info("Reading file: {}", filePath);

            Path path = Paths.get(filePath);

            // 讀取文件內(nèi)容
            String content = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);

            // 獲取文件信息
            long fileSize = Files.size(path);
            String fileName = path.getFileName().toString();

            // 構(gòu)建元數(shù)據(jù)
            Map<String, Object> metadata = new java.util.HashMap<>();
            metadata.put("filePath", filePath);
            metadata.put("fileName", fileName);
            metadata.put("fileSize", fileSize);
            metadata.put("lines", content.split("\n").length);

            long executionTime = System.currentTimeMillis() - startTime;

            logger.info("File read successfully: {} ({} bytes)", fileName, fileSize);

            return SkillResult.success(
                    "文件讀取成功: " + fileName,
                    content,
                    executionTime,
                    metadata
            );

        } catch (IOException e) {
            logger.error("Error reading file", e);
            return SkillResult.failure("文件讀取失敗: " + e.getMessage(), e.getMessage());
        }
    }

    @Override
    public long getTimeout() {
        return 10000; // 10秒超時
    }

    /**
     * 讀取文件行
     */
    public List<String> readLines(String filePath) throws IOException {
        Path path = Paths.get(filePath);
        return Files.readAllLines(path, StandardCharsets.UTF_8);
    }

    /**
     * 檢查文件是否存在
     */
    public boolean exists(String filePath) {
        return Files.exists(Paths.get(filePath));
    }

    /**
     * 獲取文件大小
     */
    public long getFileSize(String filePath) throws IOException {
        return Files.size(Paths.get(filePath));
    }
}

3.2 數(shù)據(jù)查詢技能

public class DataQuerySkill implements Skill {
    private final Map<String, List<Map<String, Object>>> database;

    public DataQuerySkill() {
        this.database = new ConcurrentHashMap<>();
        initializeSampleData();
    }

    @Override
    public boolean canExecute(String task) {
        String lowerTask = task.toLowerCase();
        return lowerTask.contains("查詢") ||
               lowerTask.contains("數(shù)據(jù)");
    }

    @Override
    public SkillResult execute(String task, Map<String, Object> parameters) {
        String tableName = parameters.get("tableName").toString();
        String condition = parameters.get("condition").toString();

        List<Map<String, Object>> results = performQuery(
            tableName, condition, 100
        );

        return SkillResult.success(
            "查詢成功,找到" + results.size() + "條記錄",
            results
        );
    }
}

3.3 文本分析技能

public class TextAnalysisSkill implements Skill {
    @Override
    public SkillResult execute(String task, Map<String, Object> parameters) {
        String text = parameters.get("text").toString();
        String operation = parameters.get("operation").toString();

        switch (operation) {
            case "stats":
                return analyzeStats(text);
            case "keywords":
                return extractKeywords(text);
            case "sentiment":
                return analyzeSentiment(text);
            default:
                return fullAnalysis(text);
        }
    }
}

四、Agent交互機制

4.1 時序交互

Agent與Skills之間的交互遵循明確的時序關(guān)系:

  1. 用戶向Agent發(fā)送任務(wù)請求
  2. Agent查詢Skill Registry獲取可用技能
  3. Registry返回匹配的技能列表
  4. Agent調(diào)用具體技能執(zhí)行任務(wù)
  5. 技能返回執(zhí)行結(jié)果
  6. Agent整合結(jié)果并返回給用戶

4.2 上下文管理

AgentContext在執(zhí)行過程中傳遞和存儲數(shù)據(jù):

package com.example.agent;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Agent執(zhí)行上下文
 * 用于在Agent執(zhí)行過程中傳遞和存儲數(shù)據(jù)
 * @version 1.0.0
 */
public class AgentContext {

    private final String requestId;
    private final Map<String, Object> attributes;
    private final Map<String, Object> sessionData;
    private final long createdAt;

    public AgentContext(String requestId) {
        this.requestId = requestId;
        this.attributes = new ConcurrentHashMap<>();
        this.sessionData = new ConcurrentHashMap<>();
        this.createdAt = System.currentTimeMillis();
    }

    /**
     * 獲取請求ID
     */
    public String getRequestId() {
        return requestId;
    }

    /**
     * 設(shè)置屬性
     */
    public void setAttribute(String key, Object value) {
        attributes.put(key, value);
    }

    /**
     * 批量設(shè)置屬性
     */
    public void setAttributes(Map<String, Object> attributes) {
        if (attributes != null) {
            this.attributes.putAll(attributes);
        }
    }

    /**
     * 獲取屬性
     */
    public Object getAttribute(String key) {
        return attributes.get(key);
    }

    /**
     * 獲取屬性(帶類型轉(zhuǎn)換)
     */
    @SuppressWarnings("unchecked")
    public <T> T getAttribute(String key, Class<T> type) {
        Object value = attributes.get(key);
        if (value != null && type.isInstance(value)) {
            return (T) value;
        }
        return null;
    }

    /**
     * 移除屬性
     */
    public Object removeAttribute(String key) {
        return attributes.remove(key);
    }

    /**
     * 設(shè)置會話數(shù)據(jù)
     */
    public void setSessionData(String key, Object value) {
        sessionData.put(key, value);
    }

    /**
     * 獲取會話數(shù)據(jù)
     */
    public Object getSessionData(String key) {
        return sessionData.get(key);
    }

    /**
     * 獲取所有屬性
     */
    public Map<String, Object> getAllAttributes() {
        return new HashMap<>(attributes);
    }

    /**
     * 清空屬性
     */
    public void clear() {
        attributes.clear();
    }

    /**
     * 獲取上下文創(chuàng)建時間
     */
    public long getCreatedAt() {
        return createdAt;
    }

    /**
     * 獲取上下文存活時間(毫秒)
     */
    public long getAge() {
        return System.currentTimeMillis() - createdAt;
    }

    /**
     * 創(chuàng)建新的上下文
     */
    public static AgentContext create() {
        return create(generateRequestId());
    }

    /**
     * 創(chuàng)建帶請求ID的上下文
     */
    public static AgentContext create(String requestId) {
        return new AgentContext(requestId);
    }

    /**
     * 生成請求ID
     */
    private static String generateRequestId() {
        return "req-" + System.currentTimeMillis() + "-" + Thread.currentThread().getId();
    }

    @Override
    public String toString() {
        return "AgentContext{" +
                "requestId='" + requestId + '\'' +
                ", attributes=" + attributes.size() +
                ", sessionData=" + sessionData.size() +
                ", age=" + getAge() + "ms" +
                '}';
    }
}

上下文分為臨時屬性和會話數(shù)據(jù),臨時屬性在單次請求中有效,會話數(shù)據(jù)可以跨請求共享。

五、多Agent協(xié)作

5.1 協(xié)作架構(gòu)

在復(fù)雜系統(tǒng)中,多個Agent協(xié)同工作可以完成更復(fù)雜的任務(wù):

  • Agent Orchestrator:協(xié)調(diào)整個系統(tǒng)的運行
  • Message Bus:實現(xiàn)Agent間的異步通信
  • Specialized Agents:專門處理特定領(lǐng)域的Agent

5.2 消息傳遞

public class MessageBus {
    private final Map<String, List<Agent>> subscribers;

    public void publish(String topic, Message message) {
        List<Agent> agents = subscribers.get(topic);
        for (Agent agent : agents) {
            executor.submit(() ->
                agent.execute(message.getContent(), message.getContext())
            );
        }
    }
}

六、實戰(zhàn)案例:智能數(shù)據(jù)分析系統(tǒng)

6.1 系統(tǒng)設(shè)計

我們以一個智能數(shù)據(jù)分析系統(tǒng)為例,展示Agent Skills的實際應(yīng)用:

系統(tǒng)包含以下關(guān)鍵組件:

  • 前端應(yīng)用:Web界面和移動端
  • API Gateway:統(tǒng)一入口,處理認(rèn)證和限流
  • Agent Layer:多個專門的數(shù)據(jù)處理Agent
  • Skills Layer:8種核心技能
  • Data Sources:多種數(shù)據(jù)源支持

6.2 數(shù)據(jù)分析Agent實現(xiàn)

package com.example.demo;

import com.example.agent.Agent;
import com.example.agent.AgentContext;
import com.example.agent.BaseAgent;
import com.example.skills.SkillResult;
import com.example.skills.impl.DataQuerySkill;
import com.example.skills.impl.FileReadSkill;
import com.example.skills.impl.TextAnalysisSkill;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;

/**
 * 數(shù)據(jù)分析Agent
 * 專門處理數(shù)據(jù)分析相關(guān)任務(wù)
 * @version 1.0.0
 */
public class DataAnalysisAgent extends BaseAgent {

    private static final Logger logger = LoggerFactory.getLogger(DataAnalysisAgent.class);

    public DataAnalysisAgent() {
        super("DataAnalysisAgent", "數(shù)據(jù)分析智能體,提供數(shù)據(jù)查詢、分析和可視化能力");

        // 注冊技能
        registerSkill(new DataQuerySkill());
        registerSkill(new TextAnalysisSkill());
        registerSkill(new FileReadSkill());
    }

    /**
     * 執(zhí)行數(shù)據(jù)分析任務(wù)
     */
    public Agent.AgentResult analyzeData(String query, AgentContext context) {
        logger.info("[DataAnalysisAgent] Starting data analysis: {}", query);

        // 設(shè)置分析參數(shù)
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("tableName", "users");
        parameters.put("condition", query);
        parameters.put("limit", 100);

        context.setAttributes(parameters);

        return execute("查詢用戶數(shù)據(jù): " + query, context);
    }

    /**
     * 生成數(shù)據(jù)分析報告
     */
    public Agent.AgentResult generateReport(String filePath, AgentContext context) {
        logger.info("[DataAnalysisAgent] Generating report from file: {}", filePath);

        Map<String, Object> parameters = new HashMap<>();
        parameters.put("filePath", filePath);

        context.setAttributes(parameters);

        AgentResult fileResult = execute("讀取數(shù)據(jù)文件", context);

        if (fileResult.isSuccess()) {
            String content = fileResult.getData().toString();

            // 分析文本內(nèi)容
            Map<String, Object> analysisParams = new HashMap<>();
            analysisParams.put("text", content);
            analysisParams.put("operation", "analyze");

            context.setAttributes(analysisParams);

            return execute("分析文本內(nèi)容", context);
        }

        return fileResult;
    }

    @Override
    protected void preprocess(String task, AgentContext context) {
        super.preprocess(task, context);
        context.setAttribute("agentType", "data-analysis");
        context.setAttribute("timestamp", System.currentTimeMillis());
    }

    @Override
    protected void postprocess(String task, SkillResult result, AgentContext context) {
        super.postprocess(task, result, context);

        // 記錄分析結(jié)果
        if (result.isSuccess()) {
            context.setSessionData("lastAnalysis", result.getData());
            context.setSessionData("lastAnalysisTime", System.currentTimeMillis());
        }
    }
}

6.3 使用示例

public class Demo {
    public static void main(String[] args) {
        // 創(chuàng)建Agent
        DataAnalysisAgent agent = new DataAnalysisAgent();

        // 執(zhí)行查詢
        AgentContext context = AgentContext.create();
        AgentResult result = agent.analyzeData("技術(shù)部", context);

        if (result.isSuccess()) {
            System.out.println("查詢結(jié)果: " + result.getData());
        }
    }
}

七、生產(chǎn)環(huán)境部署

7.1 部署架構(gòu)

生產(chǎn)環(huán)境需要考慮高可用、可擴(kuò)展和監(jiān)控:

關(guān)鍵設(shè)計要點:

  • 負(fù)載均衡:使用Nginx或云負(fù)載均衡
  • 多副本部署:每個Agent部署多個實例
  • 監(jiān)控體系:Prometheus + Grafana
  • 日志收集:ELK Stack統(tǒng)一管理日志

7.2 性能優(yōu)化

  1. 連接池管理:復(fù)用數(shù)據(jù)庫和HTTP連接
  2. 異步執(zhí)行:使用線程池并行處理任務(wù)
  3. 緩存策略:緩存常用查詢結(jié)果
  4. 超時控制:防止技能執(zhí)行時間過長
public class BaseAgent {
    protected ExecutorService executorService;

    protected SkillResult executeSkill(Skill skill, String task,
                                       Map<String, Object> parameters) {
        Future<SkillResult> future = executorService.submit(
            () -> skill.execute(task, parameters)
        );
        return future.get(skill.getTimeout(), TimeUnit.MILLISECONDS);
    }
}

7.3 錯誤處理

完善的錯誤處理機制:

try {
    SkillResult result = executeSkill(skill, task, parameters);
    if (result.isSuccess()) {
        return AgentResult.success(result.getMessage(), result.getData());
    } else {
        // 記錄錯誤日志
        logger.error("Skill execution failed: {}", result.getError());
        // 嘗試備用技能
        return executeFallbackSkill(task, context);
    }
} catch (TimeoutException e) {
    return AgentResult.failure("執(zhí)行超時");
} catch (Exception e) {
    return AgentResult.failure("執(zhí)行異常: " + e.getMessage());
}

八、測試策略

8.1 單元測試

@DisplayName("TextAnalysisSkill測試")
class TextAnalysisSkillTest {
    @Test
    @DisplayName("測試情感分析")
    void testSentimentAnalysis() {
        TextAnalysisSkill skill = new TextAnalysisSkill();

        Map<String, Object> parameters = new HashMap<>();
        parameters.put("text", "今天心情非常好!");
        parameters.put("operation", "sentiment");

        SkillResult result = skill.execute("情感分析", parameters);

        assertTrue(result.isSuccess());
        assertNotNull(result.getData());
    }
}

8.2 集成測試

測試Agent與Skills的協(xié)作:

@Test
@DisplayName("測試Agent完整流程")
void testAgentWorkflow() {
    DataAnalysisAgent agent = new DataAnalysisAgent();
    AgentContext context = AgentContext.create();

    AgentResult result = agent.analyzeData("技術(shù)部", context);

    assertTrue(result.isSuccess());
    assertNotNull(result.getData());
}

九、最佳實踐

9.1 技能設(shè)計原則

  1. 單一職責(zé):每個技能只做一件事
  2. 冪等性:相同輸入產(chǎn)生相同輸出
  3. 超時控制:設(shè)置合理的執(zhí)行超時
  4. 資源清理:執(zhí)行完成后釋放資源

9.2 Agent設(shè)計原則

  1. 專注領(lǐng)域:每個Agent專注特定領(lǐng)域
  2. 可觀測性:記錄完整的執(zhí)行日志
  3. 容錯性:優(yōu)雅處理各種異常情況
  4. 可測試性:便于編寫單元測試

十、總結(jié)

Agent Skills工作流為我們提供了一種優(yōu)雅的架構(gòu)模式,將AI智能體與傳統(tǒng)軟件開發(fā)有機結(jié)合。

未來,隨著AI技術(shù)的發(fā)展,Agent Skills將在更多領(lǐng)域發(fā)揮重要作用。

到此這篇關(guān)于Agent Skills工作流從入門到實戰(zhàn)的文章就介紹到這了,更多相關(guān)Agent Skills工作流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文全解Hermes Agent 的 Skills、Plugins、Gateway

    本文給大家深度解析Hermes Agent 的 Skills、Plugins、Gateway的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2026-05-09

最新評論

韩城市| 祁门县| 五台县| 县级市| 广汉市| 同德县| 利津县| 华容县| 定结县| 安平县| 桓台县| 广灵县| 肇东市| 卢湾区| 宝应县| 将乐县| 阳谷县| 清丰县| 奉节县| 河源市| 襄樊市| 邹城市| 巨野县| 浦城县| 金秀| 宁强县| 东城区| 图片| 罗田县| 疏勒县| 育儿| 江达县| 谷城县| 金塔县| 合川市| 珠海市| 苏尼特左旗| 合阳县| 曲阳县| 罗平县| 牟定县|