AI赋能软件测试1

1、AI人工智能基础

1、人工智能和普通 IT系统的区别
  可以根据想要场景提供更方便的交互方式,主动分析人类想要表达的需求【和人需求更匹配】
2、人工智能的较为简单的理解【输入-处理-输出】
  输入:接近人类生活,不定,有可能问天气,有可能问景点
  处理:复杂

3、热门词"大模型"是什么意思
  开发的应用场景更丰富

4、https://ai-bot.cn/ AI工具集地址
5、提示词:跟AI对话,自然语言
  明确指令:让他做什么
  输出结果:明确说明
  给定额外数据:背景,明确说明
  为AI提供一些数据
  "你是一名python教学老师,请你生成python基础中关于数据结构的讲解资料和代码示例"

 2、AI代码智能编写

1、请用Python编写冒泡排序
2、Linux查看日志最后10行
3、帮我实现一个GUI小工具,根据我输入的参数名称以及每个参数的枚举值,计算笛卡尔乘积情况
  要求:参数的数量是不固定的,枚举值的数量是不固定的
  代码报错后:AI输入----代码报错了,错误信息xxx,生成修改后的完整代码
4、代码报错分析
  1、把代码丢给AI+代码报错+报错信息
  2、生成修复后的代码/告诉我那行报错了,怎么修改

  3、AI辅助jmeter应用实战

1、AI输出

 4、模型,训练,微调

模型(model):
手写一个图片数字识别模型,来去理解什么是模型、训练、微调
用一个最简单的实现 去 讲解什么是模型
1.算法思路:如何识别出图片中得内容(简单理解)一张图片 我们不断放大,就会发现一个个小格子,这些小格子咱们理解为像素点。
  这些像素我们理解为一个个矩阵如果出现一张图片,它的像素矩阵内容和图片1很相似,
  我们可以猜测这张图片里面的数字是1(基于汉明距离这个理论进行相似度计算---实现上面这个逻辑的过程,就是实现了一个算法)
2、模型:有算法+数据+推理
  人认识数字:1、脑海有数据 2、推理
3、预训练:收集到的数据按照规范去训练
  模型预设了一大堆数字信息,需要告诉大模型数字2,3,4长什么样子,再给一张其他图片,就能推理出这张图片的内容
  训练:通过不同数据告诉模型2,3,45张什么样子,图片信息放到模型里面
4、微调:调参数【需要了解模型实现算法】
  在预训练基础上,设置特定任务数据集对模型进行进一步训练,微调目标是使模型针对某个特定任务进行优化
  模型识别图片准确度不行,参数限制模型输出,汉明距离小于500才能确定是这个图片,现在微调汉明距离到1000
简单图片对比算法
1、加载图片:大小规范为128*128,黑白二异化处理
2、读取图片像素点位置【像素矩阵】
3、计算图片像素点差异
获取类似一个数字矩阵,一一对比像素点
from PIL import Image

# 算法核心:加载图片,比较像素点
def load_img(img_path):
    """
    加载图片:大小规范为128*128,黑白二异化处理
    :param img_path: 图片路径
    :return:
    """
    image = Image.open(img_path)      # 加载图片
    resized_image = image.resize((128, 128))    # 调整图像大小
    final_img = resized_image.convert('1')    # 非黑既白,二值图像
    return final_img

def read_image_pixel(img):
    """
    读取图片像素点位置/值
    :param img:
    :return:
    """
    pixel_list = []
    for i in range(128):
        """遍历图像中的每个像素"""
        tem = []
        for j in range(128):
            tem.append(img.getpixel((i, j)))
        pixel_list.append(tem)
    return pixel_list

def calculate_hamming_distance(img_1_pixel, img_2_pixel):
    """
    计算图片像素点差异
    :param img_1_pixel:
    :param img_2_pixel:
    :return:
    """
    hamming_distance = 0
    for i in range(128):
        for j in range(128):
            if img_1_pixel[i][j] != img_2_pixel[i][j]:
                hamming_distance += 1
    return hamming_distance
知识蒸馏:模型不是天然就具备各种各样的知识。是模型的开发及训练人员,采集了大量数据让模型进行处理后,才促使模型能够处理某一领域事物的能力。
  如果你自己要开发一个模型,也需要去重新上述的这个大量的训练过程。
  但如果你是基于其他已经训练好的模型,在它们的基础上进行二次的开发训练呢,是不是就降低了训练的成本,提高了速度。
  (站在其他模型的肩膀上)这就可以理解为知识蒸馏
大型语言模型【LLM】:理解和生成人类语言,根据人类输入的自然语言内容,推理生成人类期望回去的内容【NLP自然语言处理】
大型视觉模型【LVM】:图片,视频等非文字类的处理,计算机去理解和生成人类通过视觉上能看到东西
多模态大型语言模型【MLLM】:既能处理文本,也能处理语言,图片,视频等,多合一的推理模型
参数量:是指模型中的可训练数量,这些变量决定了模型的行为和性能,参数量越大的,模型复杂度越好,处理能力越强【类似上面汉明图片算法距离500就是参数】
  参数量是衡量模型规模的一个重要指标,如QWEN3.5:7B,拥有70e参数量,B代表Bilion十亿
提示词【Prompt】:人类提供给大模型的文本内容,大模型基于这些提示内容,推理人类期望得到的内容
推理【Inference】:大模型推理是值使用以及训练好的模型进行实际应用,生成预测或输出结果的过程,列如:大模型根据问题生成答案,根据文本描述生成图片
Token:【处理计算单位】通常指的是文本或数据中的一个基本单元或符号,在自然语言处理中,单词是最常见的"你好,世界!”会被分解为"你”token。例如好"“世界”和这样的token,
  便于机器理解和处理,大模型处理中,token越多,处理量就越大。所以很多大模型收费都是按照token收费的
大模型幻觉:大模型就是靠算法猜测,概率性
  幻觉是指大型语言模型生成的内容看似合理但实际上不准确或虚构的信息。
  原因是尽管模型可以生成符合语言结构的文本,但它们并不具备真正的理解能力,只是基于概率生成下一个词语
AI大模型应用开发是什么:
普通应用开发VS大模型应用开发
一个常见的应用包含前端、后端、数据库。所谓大模型应用开发就是在应用里边的一些功能中调用了AI大模型进行文字/图片或其他内容的处理。

比如我们看到的chatgpt、deepseek 这些网站的页面,就是属于大模型应用中的聊天应用。它们不仅仅具备传统应用的前端后端,更重要的是,
它们这些聊天应用对于内容的处理是调用了AI大模型的。所以可以成为大模型应用。大模型应用开发就是增加了AI大模型相关的使用
传统应用开发数据给接口返回的数据是以知的,大模型是基于推理的返回数据不恒定,不可预知性
基于chatGpt这些基座去开发应用程序--大模型应用开发

   5、HTTP请求方式调用大模型

import requests, json

# 设置API的URL
url = "https://open.bigmodel.cn/api/paas/v4/chat/completions"

# 设置请求头,包含Authorization和Content-Type
headers = {
    "Authorization": "Bearer 3b8230ddd1784124e02acb0735cf05b1.Re2HNjKtMuwubQnk",
    "Content-Type": "application/json"
}


# 设置请求体,包含model和messages
# 消息中的三种角色: user、system、assistant
# 多轮次对话中需要把消息历史信息都发给AI,才能保障连贯性
data ={
    "model": "glm-4-flash",
    "messages": [
        {
            "role": "system", # 非必须。 system角色通过分配特定行为给聊天助手来创建对话的上下文或范围。
            "content": "你是一个小助理,你的名字叫 tony"
        },
        {
            "role": "user", #  user "角色代表实际的最终用户,他正在向ChatGPT发送提示。
            "content": "你是谁"
        },
        {
            "role": "assistant", # 这个角色表示消息是助手(聊天模型)的响应。在当前请求中设置模型的先前响应,以保持对话的连贯性。
            "content": "我是AI小助理,我的名字叫tony"
        },
        {
            "role": "user",
            "content": "你能做什么"
        }
    ]
}

# 发送POST请求
response = requests.post(url, headers=headers, data=json.dumps(data))
# 解析响应内容
result = response.json()
print("AI响应:", result)
View Code

  6、厂商提供的SDK调用大模型

# 每个厂商提供的sdk写法可能都不一样
# 缺点: 程序的兼容性存在问题

from zhipuai import ZhipuAI

client = ZhipuAI(api_key="3b8230ddd1784124e02acb0735cf05b1.Re2HNjKtMuwubQnk") # 填写您自己的APIKey

response = client.chat.completions.create(
    model="glm-4-flash",  # 填写需要调用的模型编码
    messages=[
        {"role": "user", "content": "你是谁"} # 用户
    ],
)
print(response.choices[0].message.content)
View Code

7、基于 OpenAI 开源框架去调用大模型

# 基于 OpenAI 开源框架去调用
# OpenAI 公司不仅开发了 GPT 和 ChatGPT 等 AI产品,还提供了一套 openai 代码框架去调用大模型服务。
# 后续的各种国内外公司提供的大模型,基本上都是兼容 OpenAI 公司的接口设计

from openai import OpenAI # 记得安装依赖 pip install openai

client = OpenAI(
    api_key="3b8230ddd1784124e02acb0735cf05b1.Re2HNjKtMuwubQnk", # 访问key
    base_url="https://open.bigmodel.cn/api/paas/v4/", # web服务地址
) # 这个大模型地址你可以用其他厂商的服务替代

completion = client.chat.completions.create(
    model="glm-4-flash", # 具体使用的大模型代号
    messages=[ # 你和大模型通信的消息内容,就好比你在网页发给大模型的文字
        {"role": "user", "content": "请你开导分手的年轻人"}
    ]
)
print(completion.choices[0].message.content)
View Code

8、langchain框架调用大模型

# 完全基于 厂商SDK,或者纯Openai,在切换大模型基座的情况下,会出现无法兼容的情况
# langchain对此进行了再次包装。封装了各家厂商的SDK,同时对AI应用开发中常用功能进行了包装
# https://www.langchain.com/

# 1. 创建大模型对象 
from langchain_community.chat_models.zhipuai import ChatZhipuAI
model = ChatZhipuAI(api_key="3b8230ddd1784124e02acb0735cf05b1.Re2HNjKtMuwubQnk", 
                    api_base="https://open.bigmodel.cn/api/paas/v4/chat/completions", # 一般不需要配置这个接口地址,langchain框架会根据官方地址调整。 但有时候官方调整了,langchain框架不一定及时更新
                    model_name="glm-4-flash",
                    temperature=0)

# 2. 构建提示词
from langchain_core.messages import SystemMessage, HumanMessage
messages = [
    SystemMessage(content="你是一个情感小助手,你叫TT"),
    HumanMessage(content="你好,你是谁?"),
]

# 3. 构造 chain 链 调用
from langchain_core.output_parsers import StrOutputParser # 构建结果解析器
chain = model | StrOutputParser()  # 模型调用 -> 结果解析

out = chain.invoke(messages)
print("AI响应内容:", out)
View Code
不同厂商发展后在不同大模型上有实现细节差别,使用大模型不同厂商有差距 ---langchain
langchain:底层集成了各式各样厂商,

9、定制化AI应用程序开发 

Flask+前端技术
通义灵码:生成代码【增加一个AI对话功能,包括前端后端,前端用户输入提示词,后端进行处理,前端展示AI返回的对话内容】
提示词:
  1、前端界面需要美化
结合AI开发定制化需求应用

10、RAG检索增强生成概念【大模型增强】【RAG:提示词增加上下文内容-提示词增强】

1、用户输入 不是直接丢给大模型去计算
  根据用户输入-找文字系统提供的知识【私有知识库】-【私有知识库检索出来和问题相关的内容】-附带用户提问以及上下文【检索内容】给大模型来生成返回
  【知识库检索】
Ai有些内容是不知道的-不知道的内容 我们从知识库找到发给AI让他知道-Rag增强

11、RAG之向量数据库的应用思路

检索:根据用户提出问题,找到相关的内容
  例:幼儿园周一吃什么
    吃什么:食谱相关  周一:周一相关
  找到相关内容给AI,节约TOKEN,降低大模型计算工作量,提高Ai应用程序性能
问题:怎么知道用户提出的问题和哪些数据有关 -- 自然语言和数据做匹配【关联查询】哪些内容和用户提出问题相关--NLP
NLP:自然语言处理 -- 向量数据库 -- 关联性查询功能【和sql结构性查询不同】【关联性查询数据库,条件就一句话--输出就是文件和这句话相关的内容】
input-Embedding【一个模型查询-关联数据】-数据-存储到向量数据库保持
huggingface:模型仓库【科技上网】
# 根据用户输入的问题,返回 知识文件里面相关联的内容
# 1. 加载存在文件里面的知识内容
retriever = None

def init_retriever(): 
    """ 初始化检索器 """
    global retriever
    if retriever is not None: return retriever # 已经初始化过后,直接返回

    from langchain_community.document_loaders import TextLoader
    loader = TextLoader(r"E:\AI大模型测试开发\大模型应用开发代码合集\2_RAG增强检索生成\data\食谱.txt", encoding="utf-8")
    docs = loader.load()
    print("加载的文件:", docs)

    # 拆分大文档 多个小块(1.按照分隔符拆分 2. 大于chunk_size会自动拆分 3. Splitter分割后的内容过短,自动合并)
    from langchain_text_splitters import RecursiveCharacterTextSplitter
    def length_function(text: str) : # 定义一个 长度计算方式, 返回一个与chunk_size相同的数值强制让 langchain 分割器不合并文档
        return 4000
    all_splits = RecursiveCharacterTextSplitter(chunk_size=4000, separators=["\n\n"], length_function=length_function).split_documents(docs)
    print("拆分出的文档信息:", all_splits)

    # 2. 知识保存到 向量数据库
    # 选择嵌入模型(它的作用是把你加载的不规范数据 转变 为向量数据)
    # NLP 自然语言处理领域常用, 这里可以用云服务,也可以本地部署
    # (很多平台没有提供免费的 embeddings 服务,所以这里演示本地模型)
    # 这个模型和上面的LLM模型有区别!你可以理解为这个地方是小模型,提供针对特定场景的处理能力
    from langchain_huggingface import HuggingFaceEmbeddings 
    model_name = r"E:\AI大模型测试开发\models\gte-large-zh" # 给一个本地文件夹地址,它会加载本地的
    model_kwargs = {'device': 'cpu'}  
    encode_kwargs = {'normalize_embeddings': False}  
    embeddings = HuggingFaceEmbeddings(  
        model_name=model_name,  
        model_kwargs=model_kwargs,  
        encode_kwargs=encode_kwargs  
    )

    # 创建本地数据库保存起来
    from langchain_chroma import Chroma
    vector_store = Chroma(embedding_function=embeddings)
    vector_store.add_documents(documents=all_splits)
    #将其转换为一个检索器(retriever)。检索器通常用于从向量存储中高效地检索与给定查询相关的文档。
    retriever = vector_store.as_retriever(
        search_type  = "similarity_score_threshold", # 按分数 阈值 过滤
        search_kwargs =  {
            "k" : 4 , # 默认情况返回 排名靠前的 4 个文档
            "score_threshold": 0.5 # 阈值越大,相似度要求越高 低于这个相似度 不要返回, 具体的值你实际运行看效果
        }
    ) 

    # # 3. 根据用户输入的内容进行关联性查询,返回查询的文档内容
    # docs = retriever.invoke("周四吃什么")
    # print(docs)
    return retriever
View Code
# 文档 -> 拆分
#  文档: 知识库里面的数据、 往往拆分多个文档,用于相似度查询。 和问题相关的一些数据,放到提示词里面去,给 LLM 更多的知识
#  拆分: RAG性能调优重点,不合理的拆分,得到的效果不好 

# 根据用户输入的问题,返回 知识文件里面相关联的内容
# 1. 加载存在文件里面的知识内容
from langchain_community.document_loaders import TextLoader
loader = TextLoader(r"E:\AI大模型测试开发\大模型应用开发代码合集\2_RAG增强检索生成\data\食谱.txt", encoding="utf-8")
docs = loader.load()
print("加载的文件:", docs) # 原文档体积比较大

# 拆分大文档 多个小块(1.按照分隔符拆分 2. 大于chunk_size会自动拆分 3. Splitter分割后的内容过短,自动合并)
from langchain_text_splitters import RecursiveCharacterTextSplitter
def length_function(text: str) : # 定义一个 长度计算方式, 返回一个与chunk_size相同的数值强制让 langchain 分割器不合并文档
    return 4000
all_splits = RecursiveCharacterTextSplitter(chunk_size=4000, separators=["\n\n"], length_function=length_function).split_documents(docs)
print("拆分出的文档信息:", all_splits)

# RecursiveCharacterTextSplitter  递归拆分
# CharacterTextSplitter  直接按照分隔符拆分

12、RAG调优之向量召回检索准确性调优

# 根据用户输入的问题,返回 知识文件里面相关联的内容
# 1. 加载存在文件里面的知识内容
from langchain_community.document_loaders import TextLoader
loader = TextLoader(r"E:\AI大模型测试开发\大模型应用开发代码合集\2_RAG增强检索生成\data\食谱.txt", encoding="utf-8")
docs = loader.load()
print("加载的文件:", docs)

# 拆分大文档 多个小块
from langchain_text_splitters import RecursiveCharacterTextSplitter
def length_function(text: str): # 定义一个 长度计算方式, 返回一个与chunk_size相同的数值让 langchain 分割器不合并文档
    return 4000
from langchain_text_splitters import RecursiveCharacterTextSplitter
all_splits = RecursiveCharacterTextSplitter(separators=["\n\n"], length_function=length_function).split_documents(docs)
print("拆分出的文档信息:", all_splits)

# 2. 知识保存到 向量数据库
# 选择嵌入模型(它的作用是把你加载的不规范数据 转变 为向量数据)
# NLP 自然语言处理领域常用, 这里可以用云服务,也可以本地部署
# (很多平台没有提供免费的 embeddings 服务,所以这里演示本地模型)
# 这个模型和上面的LLM模型有区别!你可以理解为这个地方是小模型,提供针对特定场景的处理能力
from langchain_huggingface import HuggingFaceEmbeddings 
model_name = r"E:\AI大模型测试开发\models\gte-large-zh" # 给一个本地文件夹地址,它会加载本地的
model_kwargs = {'device': 'cpu'}  
encode_kwargs = {'normalize_embeddings': False}  
embeddings = HuggingFaceEmbeddings(  
    model_name=model_name,  
    model_kwargs=model_kwargs,  
    encode_kwargs=encode_kwargs  
)

# 创建本地数据库保存起来
from langchain_chroma import Chroma
vector_store = Chroma(embedding_function=embeddings)
vector_store.add_documents(documents=all_splits)
#将其转换为一个检索器(retriever)。检索器通常用于从向量存储中高效地检索与给定查询相关的文档。
retriever = vector_store.as_retriever(
search_type="similarity_score_threshold", # 按分数 阈值 过滤
search_kwargs ={
"score_threshold" : 0.5, # 按照这个相似度,低于这个相似度的不要返回,具体值根据实际运行看效果,值越大要求相似度越高
"k" : 1 # 默认情况返回排名靠前的4个【不设置成按照阈值匹配过滤,反正不像也会返回4个】,现在设置成1个
}) # 3. 根据用户输入的内容进行关联性查询,返回查询的文档内容 docs = retriever.invoke("周三中午吃什么") print(docs)

13、RAG与应用实际结合

import re
from flask import Flask, render_template, request, jsonify

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')


# 1. 创建大模型对象 
from langchain_community.chat_models.zhipuai import ChatZhipuAI
model = ChatZhipuAI(api_key="3b8230ddd1784124e02acb0735cf05b1.Re2HNjKtMuwubQnk", 
                    api_base="https://open.bigmodel.cn/api/paas/v4/chat/completions", # 一般不需要配置这个接口地址,langchain框架会根据官方地址调整。 但有时候官方调整了,langchain框架不一定及时更新
                    model_name="glm-4-flash",
                    temperature=0)

@app.route('/chat', methods=['POST'])
def chat():
    user_input = request.json.get('user_input') # 用户提示词
    # RAG 检索(AI不具备的知识里面 找出来 发给AI)
    from SearchUtil import init_retriever
    retriever = init_retriever() 
    docs = retriever.invoke(user_input) # 检索出知识库 关联的文档信息内容
    context = "\n\n".join(doc.page_content for doc in docs) # 把查找到各个文件里面的关联内容,组合为文字

    # https://smith.langchain.com/hub/rlm/rag-prompt
    from langchain_core.prompts import PromptTemplate
    prompt_template  = PromptTemplate(template="""
        你的任务是回答问题,根据上下文内容,针对用户的问题提供准确的回答。
        你的回答都要基于上下文内容,如果不知道就回答不知道。
        
        问题: {user_input}
        上下文:{context}
        答案: 根据学校安排,<你的回答>
                    """)
    

    # AI 调用
    # 2. 构建提示词
    from langchain_core.messages import SystemMessage, HumanMessage
    messages = prompt_template.invoke({
        "user_input": user_input,
        "context": context
    }).to_messages()

    print("实际传输给大模型的提示词内容:", messages)

    # 3. 构造 chain 链 调用
    from langchain_core.output_parsers import StrOutputParser # 构建结果解析器
    chain = model | StrOutputParser()  # 模型调用 -> 结果解析

    out = chain.invoke(messages)

    return jsonify({'response': out})

if __name__ == '__main__':
    # 启动flask
    app.run(debug=True)
APP
# 根据用户输入的问题,返回 知识文件里面相关联的内容
# 1. 加载存在文件里面的知识内容
retriever = None

def init_retriever(): 
    """ 初始化检索器 """
    global retriever
    if retriever is not None: return retriever # 已经初始化过后,直接返回

    from langchain_community.document_loaders import TextLoader
    loader = TextLoader(r"E:\AI大模型测试开发\大模型应用开发代码合集\2_RAG增强检索生成\data\食谱.txt", encoding="utf-8")
    docs = loader.load()
    print("加载的文件:", docs)

    # 拆分大文档 多个小块(1.按照分隔符拆分 2. 大于chunk_size会自动拆分 3. Splitter分割后的内容过短,自动合并)
    from langchain_text_splitters import RecursiveCharacterTextSplitter
    def length_function(text: str) : # 定义一个 长度计算方式, 返回一个与chunk_size相同的数值强制让 langchain 分割器不合并文档
        return 4000
    all_splits = RecursiveCharacterTextSplitter(chunk_size=4000, separators=["\n\n"], length_function=length_function).split_documents(docs)
    print("拆分出的文档信息:", all_splits)

    # 2. 知识保存到 向量数据库
    # 选择嵌入模型(它的作用是把你加载的不规范数据 转变 为向量数据)
    # NLP 自然语言处理领域常用, 这里可以用云服务,也可以本地部署
    # (很多平台没有提供免费的 embeddings 服务,所以这里演示本地模型)
    # 这个模型和上面的LLM模型有区别!你可以理解为这个地方是小模型,提供针对特定场景的处理能力
    from langchain_huggingface import HuggingFaceEmbeddings 
    model_name = r"E:\AI大模型测试开发\models\gte-large-zh" # 给一个本地文件夹地址,它会加载本地的
    model_kwargs = {'device': 'cpu'}  
    encode_kwargs = {'normalize_embeddings': False}  
    embeddings = HuggingFaceEmbeddings(  
        model_name=model_name,  
        model_kwargs=model_kwargs,  
        encode_kwargs=encode_kwargs  
    )

    # 创建本地数据库保存起来
    from langchain_chroma import Chroma
    vector_store = Chroma(embedding_function=embeddings)
    vector_store.add_documents(documents=all_splits)
    #将其转换为一个检索器(retriever)。检索器通常用于从向量存储中高效地检索与给定查询相关的文档。
    retriever = vector_store.as_retriever(
        search_type  = "similarity_score_threshold", # 按分数 阈值 过滤
        search_kwargs =  {
            "k" : 4 , # 默认情况返回 排名靠前的 4 个文档
            "score_threshold": 0.5 # 阈值越大,相似度要求越高 低于这个相似度 不要返回, 具体的值你实际运行看效果
        }
    ) 

    # # 3. 根据用户输入的内容进行关联性查询,返回查询的文档内容
    # docs = retriever.invoke("周四吃什么")
    # print(docs)
    return retriever
SearchUtil

 14、大模型增强FunctionCalling工具调用

使用场景:
  1、今天长沙使用什么天气【正常AI无法搜索】
    AI模型运行过程中发现不能实现某个功能时候,通过程序扩展工具去调用,让AI应用具备更多功能
    定义方法让AI调用
import re
from flask import Flask, render_template, request, jsonify

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

from langchain_core.tools import tool
@tool
def get_weather(city: str) -> str: # str 数据格式类型
    """查询城市的实时天气信息
    Args:
        city: 城市的名称.
    """
    print("获取天气的方法呗调用:", city)
    import requests
    # 发起接口网络请求
    response = requests.get("http://apis.juhe.cn/simpleWeather/query", params={
        'key': 'ffbf9c21c8a2c31814bb5106be49a27c',
        'city': f'{city}',
    })
    weather_info = response.json()["result"]["realtime"] # 接口返回的实时天气信息 
    weather_description = weather_info["info"]
    temperature = weather_info['temperature']
    # return f"{city} 的天气为: {weather_description} ,温度为: {temperature}°C." # 不调用,模拟方法调用
    import datetime
    return f"今天是{datetime.date.today()},{city}今天的天气为: {weather_description} ,温度为: {temperature}°C."

tools = {
    "get_weather": get_weather
}

# 1. 创建大模型对象 
from langchain_community.chat_models.zhipuai import ChatZhipuAI
model = ChatZhipuAI(api_key="3b8230ddd1784124e02acb0735cf05b1.Re2HNjKtMuwubQnk", 
                    api_base="https://open.bigmodel.cn/api/paas/v4/chat/completions", # 一般不需要配置这个接口地址,langchain框架会根据官方地址调整。 但有时候官方调整了,langchain框架不一定及时更新
                    model_name="glm-4-flash",
                    temperature=0)

# 为大模型调用 绑定 工具
model = model.bind_tools(tools.values())

@app.route('/chat', methods=['POST'])
def chat():
    user_input = request.json.get('user_input') # 用户提示词
    # AI 调用
    # 2. 构建提示词
    from langchain_core.messages import SystemMessage, HumanMessage
    messages = [
        SystemMessage(content="你是一个AI小助手,你叫Tony"),
        HumanMessage(content=f"{user_input}"),
    ]

    print("第一次发送提示词:", messages)
    ai_response = model.invoke(messages)
    print("第一次AI返回的消息", ai_response)
    if ai_response.tool_calls:
        messages.append(ai_response) # 保障对话的完整性,消息中记录 AI的回复
        # 需要继续调用一个 工具, 结合工具的返回内容,进一步处理
        for tool_call in ai_response.tool_calls:
            function_name = tool_call["name"]
            tool_msg = tools[function_name].invoke(tool_call) # langchain调用函数,返回 message
            messages.append(tool_msg)
        
        print("第二次消息内容:", messages)
        # 再次调用大模型
        ai_response = model.invoke(messages)
        print("第二次AI响应:", ai_response)
        return jsonify({'response': ai_response.content})

    else:
         return jsonify({'response': ai_response.content})
    # 3. 构造 chain 链 调用
    # from langchain_core.output_parsers import StrOutputParser # 构建结果解析器
    # chain = model | StrOutputParser()  # 模型调用 -> 结果解析

    # out = chain.invoke(messages)

   

if __name__ == '__main__':
    # 启动flask
    app.run(debug=True)
View Code
from langchain_core.tools import tool
@tool
def get_weather(city: str) -> str: # str 数据格式类型
    """查询城市的实时天气信息
    Args:
        city: 城市的名称.拿到城市信息调用接口,从而拿到城市天气信息
    """
    print("获取天气的方法被调用:", city)
    import requests
    # 发起接口网络请求
    response = requests.get("http://apis.juhe.cn/simpleWeather/query", params={
        'key': 'ffbf9c21c8a2c31814bb5106be49a27c',
        'city': f'{city}',
    })
    weather_info = response.json()["result"]["realtime"] # 接口返回的实时天气信息 
    weather_description = weather_info["info"]
    temperature = weather_info['temperature']
    # return f"{city} 的天气为: {weather_description} ,温度为: {temperature}°C." # 不调用,模拟方法调用
    import datetime
    return f"今天是{datetime.date.today()},{city}今天的天气为: {weather_description} ,温度为: {temperature}°C."

tools = {
    "get_weather": get_weather
}

15、AI用例生成之功能设计

前端实现:AI coding
  需要实现多个功能:
    1、文件上传,只允许上传markdown文件,文件报错到/uploads目录下面,如果不存在这个文件,在这个目录帮我创建
    2、文件解析功能,解析文件里面的内容,返回前端进行展示
    3、文档信息前端展示功能,根据文件解析操作后的结构,前端以表格形式展示返回的内容,表头为:模块,功能,操作区域,每一行后面有两个操作按钮:分析测试点,生成测试用例
       点击这两个按钮会触发接口调用,并且将接口返回的内容,弹窗弹出提示窗口进行展示
  index.html:美化界面

16、midscene 字节开源 AI自动化测试

 

posted @ 2026-06-22 00:11  至高无上10086  阅读(5)  评论(0)    收藏  举报