精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

LangChain4J中的工具鏈,你知道嗎?

人工智能
大語言模型(LLM)除了生成文本,還可以通過工具調用觸發特定操作。該機制允許開發者為模型定義功能函數(如數學計算、API 調用等),當模型識別用戶需求需要外部工具輔助時,會在響應中表達調用意圖,開發者根據此意圖執行工具并將結果返回給模型。

咱們繼續來聊 langchain4j。

最近松哥和大伙聊的基本上都是大模型應用開發的入門知識,松哥這邊后面會開始做集團的知識庫,到時候再和大家分享一些項目中的實踐經驗。

一、Function Calling

大語言模型(LLM)除了生成文本,還可以通過工具調用觸發特定操作。該機制允許開發者為模型定義功能函數(如數學計算、API 調用等),當模型識別用戶需求需要外部工具輔助時,會在響應中表達調用意圖,開發者根據此意圖執行工具并將結果返回給模型。

特別是在一些涉及到數學運算的場景,大家知道大模型并不擅長于此,如果能夠直接調用我們自己的 API,就會方便很多。或者是一些涉及到內部 API 調用的場景,通過 Function Calling 就可以非常方便的實現。

1.1 三要素

  • 名稱:明確的功能標識(如squareRoot)
  • 描述:說明功能及適用場景(如"計算數的平方根")
  • 參數說明:每個參數的語義定義(如x表示待計算數值)

1.2 執行流程

通過工具調用機制,大模型突破了自身在實時性、準確性和功能擴展性方面的限制。

開發者需要重點掌握工具定義規范、執行流程編排和錯誤處理策略,結合 ReAct 等框架實現更智能的 AI 應用。最新技術如 LLMCompiler 的并行調用優化,以及 OpenManus 的任務分解機制,正在推動該領域向更高階的自主智能演進。

二、兩種方案

LangChain4j 中對于工具的調用提供了兩種不同的抽象層次。

2.1 Low-Level

Low-Level 直接使用 ChatLanguageModel 和 ToolSpecification API 來實現。Low-Level 具有如下一些特點:

  • 完全控制:開發者需手動定義工具規格(ToolSpecification),包括工具名稱、描述、參數結構(JSON Schema)等。
  • 靈活性強:適用于復雜場景,如第三方 API 集成或需要動態配置參數。
  • 開發成本高:需編寫大量膠水代碼處理消息構建、工具執行及結果反饋。

適用場景:

  • 需要精細控制工具邏輯(如參數校驗、錯誤處理)
  • 集成非標準接口的外部服務

2.2 High-Level

High-Level 是通過 AI Services 和 @Tool 注解的 Java 方法High-Level  具有如下一些特點:

  • 聲明式開發:使用 @Tool 注解自動生成工具規格,無需手動定義。
  • 自動化流程:框架自動處理工具調用、結果注入和多輪對話管理。
  • 代碼簡潔:隱藏底層復雜度,類似 Spring Data JPA 的 Repository 接口。

適用場景:

  • 快速構建標準化工具(如內部業務 API)
  • 需要與 Spring Boot 集成的項目

接下來我會逐一和大家介紹這兩種方案。

三、Low-Level

下面我們通過一個完整的天氣查詢案例,展示如何在 LangChain4j 中手動構造ToolSpecification并實現工具調用流程。

3.1 定義工具規格

3.1.1 手動定義

// 步驟1:手動構建天氣查詢工具規格
ToolSpecification weatherTool = ToolSpecification.builder()
    .name("getWeather")
    .description("返回指定城市明日天氣預報,當用戶詢問未來24小時天氣時調用")
    .parameters(JsonObjectSchema.builder()
        .addStringProperty("city", "需要查詢的城市名稱,如北京、London")
        .addEnumProperty("unit", List.of("CELSIUS", "FAHRENHEIT"), "溫度單位,默認使用CELSIUS")
        .required("city")  // 顯式聲明必填參數
        .build())
    .build();

List<ToolSpecification> toolSpecifications = List.of(weatherTool);

關鍵設計原則:

  1. 命名規范:getWeather采用動詞+名詞結構,明確功能定位
  2. 描述清晰:包含觸發條件("當用戶詢問未來 24 小時天氣時調用")
  3. 參數約束:
  • 城市參數添加示例值增強可理解性
  • 溫度單位使用枚舉類型約束取值范圍
  • 通過 required() 顯式標記必填參數

3.1.2 注解定義

也可以利用注解工具自動定義這個規格,如下:

class WeatherTools {

    @Tool("返回指定城市明日天氣預報,當用戶詢問未來24小時天氣時調用")
    String getWeather(@P("需要查詢的城市名稱,如北京、London") String city, String temperatureUnit) {
        return "2025-03-16深圳天氣:多云轉晴,氣溫18-25°C,濕度65%";
    }
}
List<ToolSpecification> toolSpecifications = ToolSpecifications.toolSpecificationsFrom(WeatherTools.class);

3.2 完整交互

步驟1:初始請求構建
// 步驟1:構造初始聊天請求
ChatRequest request = ChatRequest.builder()
    .messages(UserMessage.from("2025年3月16日深圳的天氣如何?"))
    .toolSpecifications(toolSpecifications)
    .build();

// 發送請求并獲取響應
ChatResponse response = model.chat(request);
AiMessage aiMessage = response.aiMessage();

此時若模型判斷需要調用工具,aiMessage.toolExecutionRequests()將包含:

{
  "name": "getWeather",
  "arguments": {"city": "深圳", "unit": "CELSIUS"}
}
步驟2:工具執行與結果反饋
// 步驟2:執行工具邏輯(模擬實現)
if (aiMessage.hasToolExecutionRequests()) {
    ToolExecutionRequest request = aiMessage.toolExecutionRequests().get(0);
    Map<String, Object> args = parseJson(request.arguments());
    
    // 模擬工具執行(實際應調用外部API)
    String result = "2025-03-16深圳天氣:多云轉晴,氣溫18-25°C,濕度65%";
    
    // 構造結果消息
    ToolExecutionResultMessage resultMsg = ToolExecutionResultMessage.from(request, result);
    
    // 構建二次請求
    ChatRequest followupRequest = ChatRequest.builder()
        .messages(List.of(
            UserMessage.from("2025年3月16日深圳的天氣如何?"),
            aiMessage,
            resultMsg
        ))
        .toolSpecifications(toolSpecifications)
        .build();
    
    // 獲取最終響應
    ChatResponse finalResponse = model.chat(followupRequest);
    System.out.println(finalResponse.aiMessage().text()); 
    // 輸出:"2025年3月16日深圳將有多云轉晴天氣,溫度范圍18-25攝氏度"
}

3.3 技術要點

3.3.1 參數結構

JsonObjectSchema.builder()
    .addStringProperty("city", "城市中文或英文名稱,如'New York'需轉換為'紐約'")
    .addEnumProperty("unit", List.of("CELSIUS", "FAHRENHEIT"), 
        "單位轉換需求,如用戶特別說明華氏度時使用")
    .build()
  • 類型校驗:通過addStringProperty/addEnumProperty確保參數合法性
  • 語義增強:在描述中補充數據轉換規則(如英文城市名轉中文)

3.3.2 異常處理機制

try {
    // 工具執行邏輯
} catch (InvalidCityException e) {
    return ToolExecutionResultMessage.error(request, "城市名稱無效: " + e.getMessage());
} catch (ApiTimeoutException e) {
    return ToolExecutionResultMessage.error(request, "天氣接口響應超時");
}
  • 錯誤碼規范:定義業務異常類型輔助模型理解
  • 錯誤信息結構化:通過error()方法返回標準錯誤格式

3.3.3 多工具協作模式

// 添加多個工具規格
ToolSpecification airQualityTool = ToolSpecification.builder()
    .name("getAirQuality")
    .description("獲取城市空氣質量指數,當用戶詢問 PM2.5 或空氣質量時調用")
    .parameters(/* 參數定義 */)
    .build();

List<ToolSpecification> tools = List.of(weatherTool, airQualityTool);
  • 工具組合策略:天氣與空氣質量工具形成互補
  • 調用優先級:通過描述中的觸發條件引導模型選擇

四、High-Level

4.1 核心機制

@Tool 注解驅動開發,主要是通過 Java 注解自動生成工具規格,無需手動定義 JSON Schema。

@Tool("計算兩個數之和")
public double add(@P("第一個數") int a, 
                  @P(value = "第二個數", required = false) Integer b) {
    return a + (b != null ? b : 0);
}

自動生成效果:

{
  "name": "add",
  "description": "計算兩個數之和",
  "parameters": {
    "type": "object",
    "properties": {
      "a": {"type": "integer", "description": "第一個數"},
      "b": {"type": "integer", "description": "第二個數"}
    },
    "required": ["a"]
  }
}

4.2 交互時序

4.3 代碼實踐

來看個具體的代碼案例吧,也是官方給的案例:

public class CalculatorDemo01 {
    staticclass Calculator {

        @Tool("計算字符串的長度")
        int stringLength(String s) {
            System.out.println("計算字符串的長度 s='" + s + "'");
            return s.length();
        }

        @Tool("計算兩個數的和")
        int add(int a, int b) {
            System.out.println("計算兩個數的和 a=" + a + ", b=" + b);
            return a + b;
        }

        @Tool("計算一個數的平方根")
        double sqrt(int x) {
            System.out.println("計算一個數的平方根 x=" + x);
            return Math.sqrt(x);
        }
    }

    public static void main(String[] args) {

        ChatLanguageModel model = ZhipuAiChatModel.builder()
                .apiKey(API_KEY)
                .model("glm-4")
                .temperature(0.6)
                .maxToken(1024)
                .maxRetries(1)
                .callTimeout(Duration.ofSeconds(60))
                .connectTimeout(Duration.ofSeconds(60))
                .writeTimeout(Duration.ofSeconds(60))
                .readTimeout(Duration.ofSeconds(60))
                .build();

        Assistant assistant = AiServices.builder(Assistant.class)
                .chatLanguageModel(model)
                .tools(new Calculator())
                .chatMemory(MessageWindowChatMemory.withMaxMessages(10))
                .build();

        String question = "字符串 \"hello\" 和 \"world\" 長度總和的平方根是多少?";

        String answer = assistant.chat(question);

        System.out.println(answer);
    }
}

來看下執行結果:

圖片圖片

上面代碼比較簡單,就不啰嗦解釋了。

注意,在 @Tool 注解中,包含觸發條件和數據來源。

4.4 注意事項

4.4.1 參數類型支持矩陣

參數類型

支持情況

示例

基本類型


完全支持(int, double)

void log(String message)

集合類型

List/Set/Map

List<User> findUsers(Query)

嵌套POJO

支持遞歸結構

Order create(OrderRequest)

枚舉

自動識別取值范圍

Status update(Status status)

復雜參數處理:

@Description("用戶查詢條件")
class Query {
    @Description("篩選狀態:ACTIVE/INACTIVE")
    Status status;
    
    @Description("返回結果數量限制")
    @P(required = false) 
    Integer limit;
}

@Tool("查找用戶")
List<User> findUsers(Query query) { ... }

4.4.2 動態工具配置

根據上下文動態加載工具。舉個例子。

下面是一個使用 ToolProvider 實現動態工具加載的完整示例,該示例模擬酒店預訂場景,根據用戶消息內容動態選擇工具:

場景描述
  • 當用戶消息包含 "預定" 關鍵詞時,動態加載 預定查詢工具
  • 當用戶消息包含 "天氣" 關鍵詞時,動態加載 天氣查詢工具
  • 其他情況不加載任何工具
工具定義
// 預定查詢工具(靜態定義)
publicclass BookingTools {

    @Tool("根據預定號查詢預定詳情,預定號格式為B-后接5位數字")
    public String getBookingDetails(
            @P("預定號,例如B-12345") String bookingNumber) {
        // 模擬數據庫查詢
        return"預定號: " + bookingNumber + ", 狀態: 已確認, 房型: 豪華套房";
    }
}
publicclass WeatherTools {

    @Tool("返回指定城市明日天氣預報,當用戶詢問未來24小時天氣時調用")
    String getWeather(@P("需要查詢的城市名稱,如北京、London") String city, String temperatureUnit) {
        return"2025-03-16深圳天氣:多云轉晴,氣溫18-25°C,濕度65%";
    }

    public static ToolExecutor getWeatherExecutor() {
        return (request, memoryId) -> {
            return"2023-10-15  天氣: 晴, 溫度20-25°C ";
        };
    }
}
動態工具提供者
public class DynamicToolProvider implements ToolProvider {

    @Override
    public ToolProviderResult provideTools(ToolProviderRequest request) {
        String userMessage = request.userMessage().singleText().toLowerCase();

        Map<ToolSpecification, ToolExecutor> tools = new HashMap<>();

        // 預定相關工具
        if (userMessage.contains("預定")) {
            // 通過反射獲取@Tool注解的方法規格
            ToolSpecification bookingSpec = null;
            try {
                bookingSpec = ToolSpecifications.toolSpecificationFrom(
                        BookingTools.class.getDeclaredMethod("getBookingDetails", String.class)
                );
            } catch (NoSuchMethodException e) {
                thrownew RuntimeException(e);
            }

            // 方法引用執行器
            ToolExecutor bookingExecutor = (req, memId) -> {
                return"bookingExecutor";
            };

            tools.put(bookingSpec, bookingExecutor);
        }

        // 天氣相關工具
        if (userMessage.contains("天氣")) {
            tools.put(
                    ToolSpecifications.toolSpecificationsFrom(WeatherTools.class).get(0),
                    WeatherTools.getWeatherExecutor()
            );
        }

        return ToolProviderResult.builder()
                .addAll(tools)
                .build();
    }
}
AI 服務配置與使用
public class Demo01 {
    // 1. 定義AI服務接口
    interface TravelAssistant {
        Result<String> handleRequest(String userMessage);
    }

    // 2. 配置AI服務
    TravelAssistant assistant = AiServices.builder(TravelAssistant.class)
            .chatLanguageModel(createOpenAiModel()) // 創建模型實例
            .toolProvider(new DynamicToolProvider())
            .build();

    private ChatLanguageModel createOpenAiModel() {
        ChatLanguageModel chatModel = ZhipuAiChatModel.builder()
                .apiKey(API_KEY)
                .model("glm-4")
                .temperature(0.6)
                .maxToken(1024)
                .maxRetries(1)
                .callTimeout(Duration.ofSeconds(60))
                .connectTimeout(Duration.ofSeconds(60))
                .writeTimeout(Duration.ofSeconds(60))
                .readTimeout(Duration.ofSeconds(60))
                .build();
        return chatModel;
    }

    // 3. 測試不同場景
    public static void main(String[] args) {
        Demo01 demo01 = new Demo01();
        // 案例1: 預定查詢
        demo01.testRequest("我的預定號B-12345的狀態是什么?");

        // 案例2: 天氣查詢
        demo01.testRequest("今天巴黎的天氣如何?");

        // 案例3: 普通咨詢
        demo01.testRequest("酒店的早餐時間是幾點?");
    }

    private void testRequest(String message) {
        Result<String> result = assistant.handleRequest(message);
        System.out.println("用戶問題: " + message);
        System.out.println("最終回答: " + result.content());
        result.toolExecutions().forEach(exec ->
                System.out.println("調用工具: " + exec.request().name() + ", 參數: " + exec.request().arguments())
        );
        System.out.println("-------------------");
    }
}
執行結果輸出
用戶問題: 我的預定號B-12345的狀態是什么?
最終回答: 根據查詢結果,您的預定號B-12345的狀態是bookingExecutor。如果您需要更詳細的預定詳情,請提供更多信息,我將盡力幫助您。
調用工具: getBookingDetails, 參數: {"arg0":"B-12345"}
-------------------
用戶問題: 今天巴黎的天氣如何?
最終回答: 根據我獲取的信息,巴黎今天的天氣是晴天,溫度在20-25°C之間。
調用工具: getWeather, 參數: {"arg0":"Paris","arg1":"today"}
-------------------
用戶問題: 酒店的早餐時間是幾點?
最終回答: 酒店的早餐時間通常根據酒店的規定而有所不同,但一般而言,大多數酒店的早餐時間可能在以下范圍內:

- 早上6:00至上午10:00
- 早上7:00至上午11:00

有些酒店可能提供更早或更晚的早餐服務,以適應不同客人的需求。如果您正在計劃前往某家酒店并想了解具體的早餐時間,建議您直接聯系酒店的前臺或查看官方網站上的信息,以獲取最準確的時間安排。
-------------------

4.4.3 執行結果追蹤

獲取工具執行記錄:

Result<String> result = assistant.chat("查看訂單123狀態");
List<ToolExecution> executions = result.toolExecutions();

executions.forEach(exec -> {
    System.out.println("調用工具: " + exec.request().name());
    System.out.println("參數: " + exec.request().arguments());
    System.out.println("結果: " + exec.result());
});

4.4.4 異常處理

結構化錯誤反饋:

@Tool
String getStockPrice(String symbol) {
    try {
        return apiClient.fetchPrice(symbol);
    } catch (InvalidSymbolException e) {
        throw new ToolExecutionException("STOCK_SYMBOL_INVALID", e.getMessage());
    }
}

錯誤類型定義:

class ToolExecutionException extends RuntimeException {
    private String errorCode;
    
    public ToolExecutionException(String code, String message) {
        super(message);
        this.errorCode = code;
    }
    
    // Getters
}

4.4.5 性能優化

緩存機制:

@Tool("查詢城市信息")
@Cacheable(value = "cityCache", key = "#cityName")
public CityInfo getCityInfo(String cityName) { ... }

批量處理:

@Tool("批量查詢溫度")
public Map<String, Double> batchGetTemperatures(List<String> cities) { ... }

4.5  VS REST API

維度

傳統REST API

LangChain4j工具API

接口定義

Swagger/OpenAPI

Java注解自動生成

參數校驗

手動實現

自動類型轉換+JSON Schema

調用方式

顯式HTTP調用

LLM動態決策調用

錯誤處理

HTTP狀態碼

結構化異常消息反饋

協議耦合

強依賴HTTP

與協議解耦

通過高階API,開發者可以快速將現有業務能力轉化為大語言模型可用的工具,顯著提升開發效率。結合動態工具配置和結果追蹤功能,能夠構建出高度智能化的對話系統。最新實踐顯示,采用該模式可使工具集成開發時間縮短約 60%。

五、方案對比

維度

低階API

高階API

靈活性

高(完全自定義)

中(依賴框架自動生成邏輯)

開發效率

低(需手動處理所有細節)

高(注解驅動,減少重復代碼)

適用階段

探索性開發、復雜集成

成熟業務場景、標準化工具

學習成本

高(需掌握 JSON Schema 等細節)

低(通過注解簡化)

六、最佳實踐

  • 優先使用高階API快速驗證功能
  • 需深度定制時切換至低階API
責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2025-10-10 09:03:18

2025-04-22 03:00:00

模型SpringAI

2024-08-06 11:27:23

LLM鏈系統AI

2024-06-03 14:27:08

ThisAPIThat

2020-09-11 06:39:29

ThreadLocal線程

2019-01-07 13:01:08

Linux驚嘆用法命令

2025-05-06 08:09:50

2018-09-04 22:50:19

區塊鏈去中心化區塊鏈技術

2023-12-12 08:41:01

2024-05-14 09:57:10

人工智能QuarkusLLM

2019-06-18 08:15:07

區塊鏈數字貨幣比特幣

2022-09-29 15:32:58

云計算計算模式

2021-10-14 06:52:47

算法校驗碼結構

2024-09-18 07:00:00

消息隊列中間件消息隊列

2024-04-07 00:00:00

ESlint命令變量

2024-05-28 09:12:10

2021-03-14 10:43:25

僵尸網絡虛假信息錯誤信息

2021-03-02 08:49:00

區塊鏈比特幣技術

2022-03-10 08:25:27

JavaScrip變量作用域

2019-12-12 09:23:29

Hello World操作系統函數庫
點贊
收藏

51CTO技術棧公眾號

亚洲深夜福利网站| 亚洲国产精品一区二区www | 久久精品三级视频| 激情亚洲小说| 亚洲一卡二卡三卡四卡无卡久久 | 亚洲人成精品久久久久久| 999久久久| 亚洲精品男人的天堂| 欧美性感美女一区二区| 欧美一区二区三区日韩| 99精品人妻少妇一区二区| 尤物网在线观看| 成人动漫中文字幕| 欧美丝袜丝交足nylons| 日韩不卡一二区| 性感美女福利视频| 国内外成人在线| 欧美亚洲第一区| 国产午夜手机精彩视频| 色综合中文网| 精品国产sm最大网站| 成人一区二区三| 都市激情久久综合| 1区2区3区国产精品| 欧美国产一区二区在线| www.桃色av嫩草.com| 色婷婷亚洲mv天堂mv在影片| 精品毛片乱码1区2区3区 | 欲香欲色天天天综合和网| 国产成人综合网站| 国产精品美女免费看| 日本在线视频免费| 欧美二区不卡| 精品国模在线视频| 人妻aⅴ无码一区二区三区| 国产精品毛片久久久| 欧美人动与zoxxxx乱| 99精品免费在线观看| 动漫一区二区| 一区二区三区四区蜜桃| 最新国产精品久久| 91xxx在线观看| 国产亚洲精品免费| 欧美久久综合性欧美| 污污网站免费在线观看| 丁香五精品蜜臀久久久久99网站 | 99国产精品久久久久久久成人| 乱码第一页成人| 91成人天堂久久成人| 亚洲调教欧美在线| 97精品久久| 日韩精品影音先锋| 亚洲精品久久久久久| 国产亚av手机在线观看| 综合在线观看色| 亚洲一区二区三区免费看| 国产一级免费在线观看| 久久久久久久电影| 久久99导航| 男人的天堂在线| 久久久.com| 新呦u视频一区二区| av在线电影免费观看| 欧美国产在线观看| 夜夜爽www精品| 久热国产在线| 伊人婷婷欧美激情| 国产资源在线免费观看| a在线视频v视频| 欧美日韩中文在线| 日韩毛片在线免费看| 日韩另类视频| 亚洲综合一二三区| 2019日韩中文字幕mv| 日本在线啊啊| 在线观看免费亚洲| 91国在线高清视频| 日本aa在线| 欧美视频在线免费| 欧美成人福利在线观看| 国产精品亚洲四区在线观看| 日韩一区二区三区高清免费看看| 乱码一区二区三区| 欧美大胆a级| 在线精品国产成人综合| 麻豆天美蜜桃91| 精品1区2区3区4区| 国产成人高潮免费观看精品| 亚洲影院一区二区三区| 高清不卡一二三区| 日本一区不卡| av在线app| 欧美午夜片在线免费观看| 亚洲最大综合网| 香蕉大人久久国产成人av| 日韩成人中文电影| 国产午夜手机精彩视频| 亚洲日本免费| 国产精品视频一| 蜜桃av中文字幕| 国产网站一区二区三区| 穿情趣内衣被c到高潮视频| 欧美aa免费在线| 欧美日韩国产精选| 国产女主播在线播放| 亚洲欧美在线综合| 亚洲福利视频二区| 懂色av蜜臀av粉嫩av永久| 亚洲精品偷拍| 亚洲一区二区三区777| 精品999视频| 亚洲一区二区不卡免费| 日本不卡一区在线| 美女亚洲一区| 欧美激情在线视频二区| 一区两区小视频| 91在线观看免费视频| 欧洲金发美女大战黑人| 欧美在线va视频| 一本色道久久综合亚洲aⅴ蜜桃| 国产乱码一区二区三区四区| 最新精品国偷自产在线| 欧美日韩国产成人高清视频| 亚洲精品一区二区二区| 91性感美女视频| 国产91在线亚洲| 亚洲欧洲二区| 中文字幕av日韩| 性色av免费观看| caoporn国产精品| 伊人久久在线观看| 青青草国产一区二区三区| 亚洲人线精品午夜| 国产区一区二区三| 成人av免费在线播放| 日韩精品久久一区二区| 四虎精品永久免费| 色综合伊人色综合网| 日本一区二区免费电影| 99国产精品久久久久久久久久 | 亚洲少妇自拍| 国产精选在线观看91| 手机av免费在线| 亚洲综合色成人| 天天色天天综合网| 欧美高清视频手机在在线| 国产精品久久久久av| 黄色在线小视频| 在线观看一区二区视频| 国产毛片久久久久久久| 西西裸体人体做爰大胆久久久| 国产精品亚洲不卡a| 欧美女同一区| 亚洲第一页中文字幕| 国产真实乱人偷精品视频| 成人一区在线观看| 欧美午夜小视频| 欧美sss在线视频| 国产91精品在线播放| 一级做a爱片性色毛片| 国产欧美精品一区| av污在线观看| 影视一区二区| 不卡一卡2卡3卡4卡精品在| 免费污视频在线| 亚洲国产精品悠悠久久琪琪| 91网站免费入口| 日日摸夜夜添夜夜添精品视频 | 国产精品免费播放| 欧美视频中文字幕| 欧美风情第一页| 成人精品一区二区三区中文字幕 | 免费看一级大片| 懂色av一区二区在线播放| 男人添女人下部高潮视频在观看| 日韩三区在线| 色婷婷av一区二区三区在线观看| 亚洲特级黄色片| 亚洲免费观看高清完整版在线| 免费欧美一级片| 国产欧美日韩一级| 日韩精品一区二区三区色偷偷| 成人18视频在线观看| 久久精品国产一区二区电影| 欧日韩在线视频| 91福利区一区二区三区| 日韩精品一区在线视频| 成午夜精品一区二区三区软件| 97免费在线视频| 成年人视频网站在线| 91精品国产日韩91久久久久久| 免费网站看av| 2020国产精品久久精品美国| 熟女熟妇伦久久影院毛片一区二区| 电影91久久久| 1769国内精品视频在线播放| melody高清在线观看| 欧美成人vr18sexvr| 波多野结衣av无码| 一区二区三区在线看| 国精产品一区二区三区| 国产精品一区免费视频| 北条麻妃在线一区| 亚洲免费二区| 欧美人与物videos另类| 日韩精品一区二区三区中文 | 青青视频免费在线观看| 国产一区日韩| 国产九区一区在线| 亚洲资源在线| 国产成人精品999| 激情图片在线观看高清国产| 最好看的2019的中文字幕视频| 亚洲精品网站在线| 中文字幕一区二区三区在线播放 | 97人洗澡人人免费公开视频碰碰碰| 国产福利第一视频在线播放| 亚洲成人a级网| 国产精品熟女久久久久久| 色狠狠一区二区三区香蕉| 国产一级片免费| 中文字幕综合网| 中字幕一区二区三区乱码| 成人18视频日本| 宇都宫紫苑在线播放| 日本麻豆一区二区三区视频| 99视频在线免费播放| 欧美久久九九| 中文字幕一区二区三区在线乱码| 蜜桃精品wwwmitaows| 国产精品麻豆免费版| 日韩免费高清视频网站| 91精品久久久久久久久久久久久久 | 亚洲大奶少妇| 91精品视频在线看| 玖玖精品在线| 国产精品福利网站| 欧美一级大片| 日韩免费观看网站| 是的av在线| 69av在线视频| 韩国精品一区| 欧美一级淫片videoshd| www.九色在线| 2019亚洲男人天堂| 日韩欧美精品一区二区三区| 国模叶桐国产精品一区| 婷婷开心激情网| 精品国产乱码久久久久久老虎 | www..com久久爱| 美女扒开腿免费视频| 国产xxx精品视频大全| 激情成人在线观看| 国产精品99久久久久久宅男| 色偷偷中文字幕| 国产成人亚洲精品青草天美| 无码人妻一区二区三区精品视频| 国产suv一区二区三区88区| 国产伦理在线观看| 成人免费视频app| 亚洲国产精品无码久久久久高潮| 97se亚洲国产综合在线| 久久久久亚洲av无码专区桃色| 久久综合九色综合欧美就去吻| 六月婷婷七月丁香| 国产精品免费视频观看| 秘密基地免费观看完整版中文| 国产成人在线看| 亚洲一区二区三区四区av| 91理论电影在线观看| 亚洲精品国产91| 日本一区免费视频| 成人在线观看免费完整| 亚洲电影中文字幕在线观看| 精品欧美一区二区三区免费观看| 色综合久久88色综合天天6| 欧美激情一区二区三区免费观看| 91精品国产黑色紧身裤美女| 日本黄视频在线观看| 亚洲人成在线观看网站高清| 久久精品视频免费看| 欧美激情在线狂野欧美精品| 久久精品女人天堂av免费观看| 川上优av一区二区线观看| 国产成人aa在线观看网站站| 日本高清视频一区二区三区| 香蕉精品视频在线观看| 日本福利视频一区| 免费在线视频一区| 男人的天堂免费| 国产视频911| 青娱乐在线视频免费观看| 欧美性xxxx在线播放| 一级黄色片在线观看| 337p日本欧洲亚洲大胆精品| aaa日本高清在线播放免费观看| 欧美精品一区二区免费| 国产成人精品亚洲日本在线观看| 91成人免费在线观看| 国产精品一区二区99| 国产高清www| 久久激情综合网| 国产精品久久不卡| **欧美大码日韩| 天堂网视频在线| 精品国产亚洲在线| av网在线观看| 91干在线观看| 精品一区二区三区视频在线播放| 欧美日韩一区二| 欧美日韩精品| 日本不卡一区在线| 久久精品视频免费观看| 久久久久久国产精品视频| 欧美视频完全免费看| 久久国产精品二区| 欧洲激情一区二区| 亚洲av成人无码网天堂| 九九九久久国产免费| 六九午夜精品视频| 日本一区二区三区视频在线播放| 亚洲成人资源| 日本中文字幕有码| 国产精品久久久久久久久免费丝袜| 日本中文字幕在线免费观看| 日韩无一区二区| 日韩伦理在线观看| 国产精品老女人精品视频| 西野翔中文久久精品字幕| 亚洲国产精品无码观看久久| 国产精品综合在线视频| 黄色片网站在线播放| 欧美丝袜丝nylons| 超碰97在线免费观看| 日韩av快播网址| 天海翼精品一区二区三区| 亚洲熟妇无码一区二区三区| 国产精品一二三区| 四虎影院中文字幕| 91精品国产综合久久蜜臀| 成人黄色在线观看视频| www.欧美精品一二三区| 欧美91在线|欧美| 影音先锋在线亚洲| 久久aⅴ国产欧美74aaa| 成人午夜免费影院| 欧美日韩国产高清一区二区三区| 川上优的av在线一区二区| 国产精品第一视频| av中文一区| 在线观看免费视频高清游戏推荐| 欧美国产一区二区| 中文字幕一区二区三区人妻四季 | 欧美一区二区三区在线观看免费| 国产精品第一视频| 日韩美女一区二区三区在线观看| 中文字幕国内自拍| 国产精品久久久久一区| 国产丝袜在线视频| 九九九久久久久久| 欧美日韩看看2015永久免费| 国产91对白刺激露脸在线观看| 91丝袜国产在线播放| 51国产偷自视频区视频| 亚洲品质视频自拍网| 国产精品第一| 亚洲色婷婷久久精品av蜜桃| 国产成人h网站| 在线天堂中文字幕| 在线观看欧美成人| а天堂中文最新一区二区三区| 在线观看18视频网站| 99精品偷自拍| 国产精品第6页| 久久91精品国产91久久跳| 国产精品45p| 丁香婷婷激情网| 亚洲免费观看在线观看| 偷拍自拍在线视频| 日韩一级裸体免费视频| 国产日韩在线观看视频| 天天夜碰日日摸日日澡性色av| 久久亚洲精精品中文字幕早川悠里 | 欧美日韩人人澡狠狠躁视频| 韩国精品视频| 亚洲tv在线观看| 99在线精品视频在线观看| 久久久久久久久久久久久久久国产| 亚洲精品午夜久久久| 特黄视频在线观看| 国产精品永久免费| 伊人久久综合| 又色又爽的视频| 亚洲成人久久一区| 欧美性aaa| 日韩精品一区二区三区久久| 亚洲天天做日日做天天谢日日欢 | 最新中文字幕亚洲| 九色丨蝌蚪丨成人| 在线观看岛国av|