这是一个基于 LangChain 框架和通义千问(Qwen)大语言模型构建的检索增强生成(RAG)智能问答系统的教程。该系统是基于最基础的功能点,如大语言模型调用,文档处理,嵌入模型向量化,向量存储和检索,智能对话构建而成,最后用streamlit生成一个web界面,将功能可视化。本篇为教程第二章,之前章节请参考:

https://blog.csdn.net/zx79122564/article/details/157181513?spm=1001.2014.3001.5502

上一节,我们完成了系统的基本介绍和环境搭建,接下来进入第二章 客户端封装

第二章 大模型客户端封装

本节中,我们要创建一个专门封装通义千问(Qwen)大语言模型 API 调用的客户端类,为整个 RAG 对话系统提供核心的 AI 能力。参考如下代码层级,创建qwen_client.py文件。

qwen_client.py文件的完整代码如下:

# 文件: src/qwen_client.py
import os
from typing import Optional, List, Dict, Any
from dotenv import load_dotenv
from openai import OpenAI
from langchain_openai import ChatOpenAI
from langchain_openai.embeddings import OpenAIEmbeddings

# 加载环境变量
load_dotenv()

class QwenClient:
    """通义千问客户端封装"""

    def __init__(self, api_key: Optional[str] = None, model: Optional[str] = None):
        self.api_key = api_key or os.getenv("DASHSCOPE_API_KEY")
        self.model = model or os.getenv("QWEN_MODEL", "qwen-plus")

        if not self.api_key:
            raise ValueError("请设置DASHSCOPE_API_KEY环境变量")

        # 初始化OpenAI兼容客户端
        self.client = OpenAI(
            api_key=self.api_key,
            base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
        )

        print(f"通义千问客户端已初始化,使用模型: {self.model}")

    # 核心聊天功能
    def chat_completion(self, messages: List[Dict[str, str]], **kwargs) -> str:
        """聊天补全"""
        try:
            response = self.client.chat.completions.create(
                model=self.model,
                messages=messages,
                **kwargs
            )
            return response.choices[0].message.content
        except Exception as e:
            print(f"❌ 调用通义千问失败: {e}")
            raise

    def get_langchain_llm(self, **kwargs):
        """获取LangChain兼容的LLM对象"""
        return ChatOpenAI(
            model=self.model,
            openai_api_key=self.api_key,
            openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
            temperature=kwargs.get("temperature", 0.3),
            max_tokens=kwargs.get("max_tokens", 2000),
            streaming=kwargs.get("streaming", False)
        )


    def test_connection(self) -> bool:
        """测试连接"""
        try:
            response = self.chat_completion([
                {"role": "system", "content": "你是一个测试助手"},
                {"role": "user", "content": "请回复'连接成功'"}
            ])
            print(f"✅ 通义千问连接测试: {response}")
            return True
        except Exception as e:
            print(f"❌ 连接测试失败: {e}")
            return False


# 使用示例
if __name__ == "__main__":
    qwen = QwenClient()
    if qwen.test_connection():
        # 测试对话
        response = qwen.chat_completion([
            {"role": "user", "content": "你好,请介绍一下你自己"}
        ])
        print(f"🤖 Qwen回复: {response}")

代码运行结果如下:

qwen-client.py运行结果

代码解读:

  1. 什么是OpenAI兼容客户端?
    相关代码块:
 # 初始化OpenAI兼容客户端
        self.client = OpenAI(
            api_key=self.api_key,
            base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
        )

        print(f"通义千问客户端已初始化,使用模型: {self.model}")

这是一种"翻译官"机制,让我们用OpenAI的代码格式,调用其他AI服务(如此处的通义千问)。这样大大降低开发者的学习成本,只学习OpenAI的SDK就可以调用其他模型。请参考下面原生API调用与OpenAI兼容模式调用

通义千问原生API调用

# 需要专门学习DashScope的SDK
from dashscope import Generation

response = Generation.call(
    model='qwen-plus',
    prompt='你好'
)

兼容模式调用(用熟悉的OpenAI格式):

# 用OpenAI SDK的知识就能写
from openai import OpenAI

client = OpenAI(
    api_key="你的密钥",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"  # 关键!
)

response = client.chat.completions.create(
    model="qwen-plus",
    messages=[{"role": "user", "content": "你好"}]
)

2. 代码中chat_completion和get_langchain_llm两种调用API的方式有什么区别?

直接调用 vs 框架集成

chat_completion - 直接 API 调用

特点: 直接调用 OpenAI 兼容的 API 返回原始文本响应,适合简单的一次性对话

get_langchain_llm - LangChain 集成

特点: 返回 LangChain 的 ChatOpenAI 对象 可以集成到复杂的对话链中 ,支持流式输出、记忆管理等高级功能

使用场景

chat_completion

# 简单对话
response = qwen.chat_completion([
    {"role": "user", "content": "你好"}
])
print(response)  # 直接得到文本


get_langchain_llm

# 集成到 LangChain 对话链
llm = qwen.get_langchain_llm(temperature=0.7)

# 构建复杂的对话系统
from langchain.chains import ConversationChain
conversation = ConversationChain(
    llm=llm,
    memory=ConversationBufferMemory()
)
response = conversation.run("你好")

以上内容完成,我们就可以调用大模型的能力了,接下来我们会介绍如何做文档的处理。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐