大模型开发实战

大模型开发实战

本文将以百度的文心一言,阿里巴巴的通义千问,科大讯飞的讯飞星火认知大模型,智谱清言的ChartGLM,腾讯的混元大模型,OpenAI的ChatGPT,这六个模型的api调用进行实战代码讲解。

大模型向量数据库创建

对上传的不同格式文件进行处理

from embedding.call_embedding import get_embedding
from langchain.document_loaders import UnstructuredFileLoader, UnstructuredCSVLoader, CSVLoader
from langchain.document_loaders import UnstructuredMarkdownLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import PyMuPDFLoader
from langchain.vectorstores import Chroma

def file_loader(file, loaders):
    if not os.path.isfile(file):
        [file_loader(os.path.join(file, f), loaders) for f in os.listdir(file)]
        return
    file_type = file.split('.')[-1]
    if file_type == 'pdf':
        loaders.append(PyMuPDFLoader(file))
    elif file_type == 'md':
        loaders.append(UnstructuredMarkdownLoader(file))
    elif file_type == 'txt':
        loaders.append(UnstructuredFileLoader(file))
    elif file_type == 'csv':
        loaders.append(CSVLoader(file))
    return

切分文档

在每段分割的文档前后加上文档名,这样可以保证查询的信息是指定文档内的

def create_db(files=DEFAULT_DB_PATH, persist_directory=DEFAULT_PERSIST_PATH, embeddings="openai"):
    """
    该函数用于加载 PDF 文件,切分文档,生成文档的嵌入向量,创建向量数据库。

    参数:
    file: 存放文件的路径。
    embeddings: 用于生产 Embedding 的模型

    返回:
    vectordb: 创建的数据库。
    """
    if files == None:
        return "can't load empty file"
    if type(files) != list:
        files = [files]
    loaders = []
    [file_loader(file, loaders) for file in files]
    docs = []
    for loader in loaders:
        if loader is not None:
            docs.extend(loader.load())
    # 切分文档
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=1500, chunk_overlap=150)
    split_docs = text_splitter.split_documents(docs[:1000])
    """小技巧"""
    # 在每段分割的文档前后加上文档名,这样可以保证查询的信息是指定文档内的
    for one_chunk in split_docs:
        one_chunk.page_content = one_chunk.metadata["source"].split("/")[-1] + one_chunk.page_content + \
                                 one_chunk.metadata["source"].split("/")[-1]
    if type(embeddings) == str:
        embeddings = get_embedding(embedding=embeddings)

    # 加载数据库
    vectordb = Chroma.from_documents(
        documents=split_docs,
        embedding=embeddings,
        persist_directory=persist_directory  # 允许我们将persist_directory目录保存到磁盘上
    )
    vectordb.persist()
    return vectordb

大模型API调用

腾讯的混元大模型

# 定义一个函数get_completion_hunyuan,用于调用hunyuan原生接口
def get_completion_hunyuan(prompt: str, model: str, temperature: float, secret_id: str, secret_key: str):
    # 判断是否传入secret_id和secret_key,如果没有传入,则从配置文件中解析
    if secret_id == None or secret_key == None:
        secret_id, secret_key = parse_llm_api_key("hunyuan")
    # 使用secret_id和secret_key创建一个认证对象
    cred = credential.Credential(secret_id, secret_key)
    
    # 创建一个客户端配置对象,可以设置连接池大小等参数
    cpf = ClientProfile()
    # 设置预先建立连接的数量,可以降低访问延迟
    cpf.httpProfile.pre_conn_pool_size = 3
    
    # 使用认证对象和客户端配置对象创建一个hunyuan客户端
    client = hunyuan_client.HunyuanClient(cred, "ap-guangzhou", cpf)
    # 创建一个请求对象
    req = models.ChatStdRequest()
    # 创建一个消息对象,设置角色为用户,内容为传入的prompt
    msg = models.Message()
    msg.Role = "user"
    msg.Content = prompt
    # 将消息对象添加到请求对象的Messages列表中
    req.Messages = [msg]
    
    # 调用hunyuan客户端的ChatStd方法,传入请求对象,获取响应
    resp = client.ChatStd(req)
    # 打印响应
    print("resp:", resp)
    # 初始化一个字符串,用于存储完整的响应内容
    full_content = ""
    # 遍历响应中的事件
    for event in resp:
        # 打印事件
        print("event", event)
        # 将事件中的数据解析为json对象
        data = json.loads(event['data'])
        # 遍历json对象中的Choices列表
        for choice in data['Choices']:
            # 将每个Choice中的Content添加到full_content中
            full_content += choice['Delta']['Content']
    # 打印完整的响应内容
    print("full_content:", full_content)
    
    # 返回完整的响应内容
    return full_content

阿里巴巴的通义千问

# 定义一个函数get_completion_qwen,用于调用qwen原生接口
def get_completion_qwen(prompt: str, model: str, temperature: float, api_key: str, max_tokens: int):
    # 判断是否传入api_key,如果没有传入,则从配置文件中解析
    if api_key == None:
        api_key = parse_llm_api_key("qwen")
    # 设置dashscope的api_key,dashscope是一个第三方库,用于简化API调用
    dashscope.api_key = api_key
    
    # 创建一个消息列表,包含用户的消息
    messages = [{"role": "user", "content": prompt}]
    # 调用dashscope.Generation.call方法,传入模型名称、消息列表、温度系数、最大回复长度和结果格式
    response = dashscope.Generation.call(
        model=model,  # 模型名称
        messages=messages,  # 消息列表
        temperature=temperature,  # 模型输出的温度系数,控制输出的随机程度
        max_tokens=max_tokens,  # 回复最大长度
        result_format='message',  # 设置结果格式为"message"
    )
    
    # 打印响应
    print(response)
    
    # 从响应中提取回复内容并返回
    return response.output.choices[0].message["content"]

OpenAI的ChatGPT

# 定义一个函数get_completion_gpt,用于调用OpenAI原生接口
def get_completion_gpt(prompt: str, model: str, temperature: float, api_key: str, max_tokens: int):
    # 判断是否传入api_key,如果没有传入,则从配置文件中解析
    if api_key == None:
        api_key = parse_llm_api_key("openai")
    # 设置OpenAI的api_key,openai是一个第三方库,用于简化API调用
    openai.api_key = api_key
    
    # 创建一个消息列表,包含用户的消息
    messages = [{"role": "user", "content": prompt}]

    # 调用openai.ChatCompletion.create方法,传入模型名称、消息列表、温度系数和最大回复长度
    response = openai.ChatCompletion.create(
        model=model,  # 模型名称
        messages=messages,  # 消息列表
        temperature=temperature,  # 模型输出的温度系数,控制输出的随机程度
        max_tokens=max_tokens,  # 回复最大长度
    )
    
    # 从响应中提取回复内容并返回
    return response.choices[0].message["content"]

百度的文心一言

def get_access_token(api_key, secret_key):
    """
    使用 API Key,Secret Key 获取access_token,替换下列示例中的应用API Key、应用Secret Key
    """
    # 指定网址
    url = f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={api_key}&client_secret={secret_key}"
    # 设置 POST 访问
    payload = json.dumps("")
    headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }
    # 通过 POST 访问获取账户对应的 access_token
    response = requests.request("POST", url, headers=headers, data=payload)
    return response.json().get("access_token")

def get_completion_wenxin(prompt: str, model: str, temperature: float, api_key: str, secret_key: str):
    # 封装百度文心原生接口
    if api_key == None or secret_key == None:
        api_key, secret_key = parse_llm_api_key("wenxin")
    # 获取access_token
    access_token = get_access_token(api_key, secret_key)
    # 调用接口
    url = f"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token={access_token}"
    # 配置 POST 参数
    payload = json.dumps({
        "messages": [
            {
                "role": "user",  # user prompt
                "content": "{}".format(prompt)  # 输入的 prompt
            }
        ]
    })
    headers = {
        'Content-Type': 'application/json'
    }
    # 发起请求
    response = requests.request("POST", url, headers=headers, data=payload)
    # 返回的是一个 Json 字符串
    js = json.loads(response.text)
    return js["result"]

科大讯飞的讯飞星火认知大模型

def get_completion_spark(prompt: str, model: str, temperature: float, api_key: str, appid: str, api_secret: str,
                         max_tokens: int):
    if api_key == None or appid == None and api_secret == None:
        api_key, appid, api_secret = parse_llm_api_key("spark")

    # 配置 1.5、2、3、3.5 的不同环境
    if model == "Spark-1.5":
        domain = "general"
        Spark_url = "wss://spark-api.xf-yun.com/v1.1/chat"  # v1.5环境的地址
    if model == "Spark-2.0":
        domain = "generalv2"  # v2.0版本
        Spark_url = "wss://spark-api.xf-yun.com/v2.1/chat"  # v2.0环境的地址
    if model == "Spark-3.0":
        domain = "generalv3"  # v3.0版本
        Spark_url = "wss://spark-api.xf-yun.com/v3.1/chat"  # v3.0环境的地址
    if model == "Spark-3.5":
        domain = "generalv3.5"  # v3.5版本
        Spark_url = "wss://spark-api.xf-yun.com/v3.5/chat"  # v3.5环境的地址

    question = [{"role": "user", "content": prompt}]
    response = spark_main(appid, api_key, api_secret, Spark_url, domain, question, temperature, max_tokens)
    return response

class Ws_Param(object):
    # 初始化
    def __init__(self, APPID, APIKey, APISecret, Spark_url):
        self.APPID = APPID
        self.APIKey = APIKey
        self.APISecret = APISecret
        self.host = urlparse(Spark_url).netloc
        self.path = urlparse(Spark_url).path
        self.Spark_url = Spark_url
        # 自定义
        self.temperature = 0
        self.max_tokens = 2048

    # 生成url
    def create_url(self):
        # 生成RFC1123格式的时间戳
        now = datetime.now()
        date = format_date_time(mktime(now.timetuple()))

        # 拼接字符串
        signature_origin = "host: " + self.host + "\n"
        signature_origin += "date: " + date + "\n"
        signature_origin += "GET " + self.path + " HTTP/1.1"

        # 进行hmac-sha256进行加密
        signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
                                 digestmod=hashlib.sha256).digest()

        signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')

        authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'

        authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')

        # 将请求的鉴权参数组合为字典
        v = {
            "authorization": authorization,
            "date": date,
            "host": self.host
        }
        # 拼接鉴权参数,生成url
        url = self.Spark_url + '?' + urlencode(v)
        # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
        return url

# 收到websocket错误的处理
def on_error(ws, error):
    print("### error:", error)

# 收到websocket关闭的处理
def on_close(ws, one, two):
    print(" ")

# 收到websocket连接建立的处理
def on_open(ws):
    thread.start_new_thread(run, (ws,))

def run(ws, *args):
    data = json.dumps(gen_params(appid=ws.appid, domain=ws.domain, question=ws.question, temperature=ws.temperature,
                                 max_tokens=ws.max_tokens))
    ws.send(data)

# 收到websocket消息的处理
def on_message(ws, message):
    # print(message)
    data = json.loads(message)
    code = data['header']['code']
    if code != 0:
        print(f'请求错误: {code}, {data}')
        ws.close()
    else:
        choices = data["payload"]["choices"]
        status = choices["status"]
        content = choices["text"][0]["content"]
        print(content, end="")
        global answer
        answer += content
        # print(1)
        if status == 2:
            ws.close()

def gen_params(appid, domain, question, temperature, max_tokens):
    """
    通过appid和用户的提问来生成请参数
    """
    data = {
        "header": {
            "app_id": appid,
            "uid": "1234"
        },
        "parameter": {
            "chat": {
                "domain": domain,
                "random_threshold": 0.5,
                "max_tokens": max_tokens,
                "temperature": temperature,
                "auditing": "default"
            }
        },
        "payload": {
            "message": {
                "text": question
            }
        }
    }
    return data

def spark_main(appid, api_key, api_secret, Spark_url, domain, question, temperature, max_tokens):
    # print("星火:")
    output_queue = queue.Queue()

    def on_message(ws, message):
        data = json.loads(message)
        code = data['header']['code']
        if code != 0:
            print(f'请求错误: {code}, {data}')
            ws.close()
        else:
            choices = data["payload"]["choices"]
            status = choices["status"]
            content = choices["text"][0]["content"]
            # print(content, end='')
            # 将输出值放入队列
            output_queue.put(content)
            if status == 2:
                ws.close()

    wsParam = Ws_Param(appid, api_key, api_secret, Spark_url)
    websocket.enableTrace(False)
    wsUrl = wsParam.create_url()
    ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)
    ws.appid = appid
    ws.question = question
    ws.domain = domain
    ws.temperature = temperature
    ws.max_tokens = max_tokens
    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
    return ''.join([output_queue.get() for _ in range(output_queue.qsize())])

智谱清言的ChartGLM

# 定义一个函数get_completion_glm,用于调用GLM原生接口
def get_completion_glm(prompt: str, model: str, temperature: float, api_key: str, max_tokens: int):
    # 判断是否传入api_key,如果没有传入,则从配置文件中解析
    if api_key == None:
        api_key = parse_llm_api_key("zhipuai")
    # 设置zhipuai的api_key,zhipuai是一个第三方库,用于简化API调用
    zhipuai.api_key = api_key

    # 调用zhipuai.model_api.invoke方法,传入模型名称、提示、温度系数和最大回复长度
    response = zhipuai.model_api.invoke(
        model=model,  # 模型名称
        prompt=[{"role": "user", "content": prompt}],  # 提示
        temperature=temperature,  # 温度系数
        max_tokens=max_tokens  # 最大回复长度
    )
    
    # 从响应中提取回复内容,并去除首尾的引号和空格
    return response["data"]["choices"][0]["content"].strip('"').strip(" ")


如何系统的去学习大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
    • L1.4.1 知识大模型
    • L1.4.2 生产大模型
    • L1.4.3 模型工程方法论
    • L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
    • L2.1.1 OpenAI API接口
    • L2.1.2 Python接口接入
    • L2.1.3 BOT工具类框架
    • L2.1.4 代码示例
    • L2.2 Prompt框架
    • L2.2.1 什么是Prompt
    • L2.2.2 Prompt框架应用现状
    • L2.2.3 基于GPTAS的Prompt框架
    • L2.2.4 Prompt框架与Thought
    • L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
    • L2.3.1 流水线工程的概念
    • L2.3.2 流水线工程的优点
    • L2.3.3 流水线工程的应用
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
    • L3.1.1 Agent模型框架的设计理念
    • L3.1.2 Agent模型框架的核心组件
    • L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
    • L3.2.1 MetaGPT的基本概念
    • L3.2.2 MetaGPT的工作原理
    • L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
    • L3.3.1 ChatGLM的特点
    • L3.3.2 ChatGLM的开发环境
    • L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
    • L3.4.1 LLAMA的特点
    • L3.4.2 LLAMA的开发环境
    • L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

学习计划:

  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值