langchian 批次调用 prompt

目录

基础不使用批次

batch

批次调用


关于 langchian 额一些应用,可以查看案例:

GitHub - 5zjk5/prompt-engineering: prompt 工程项目案例

基础不使用批次

python 复制代码
from dotenv import load_dotenv
import time
import os
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain

load_dotenv('key.env')

from langchain_community.llms import Tongyi
def tongyi_qwen_plus(temperature=1):
    # 通义 qwen_plus
    model = Tongyi(temperature=temperature, model_name='qwen-plus', dashscope_api_key=os.getenv('DASHSCOPE_API_KEY'))
    return model
llm = tongyi_qwen_plus()


prompt = [
    '说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
'说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
'说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
'说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
'说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
]
start = time.time()


def base_llm_chain(model, prompt, **kwargs):
    """
    https://python.langchain.com/docs/modules/model_io/prompts/composition/#string-prompt-composition
    基础链,带有变量的 prompt ,model 两个组成链
    :param model: llm
    :param prompt: prompt 其中的变量是用 {} 括起来的
    :param kwargs: prompt 中的变量
    :return:
    """
    prompt = PromptTemplate.from_template(prompt)
    chain = LLMChain(llm=model, prompt=prompt)
    res = chain.run(kwargs)
    return res
res = []
for p in prompt:
    _ = base_llm_chain(llm, p)
    res.append(_)
end = time.time()
t = end - start
print(t)

batch

Quickstart | 🦜️🔗 LangChain

python 复制代码
from dotenv import load_dotenv
import time
import os
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain

load_dotenv('key.env')

from langchain_community.llms import Tongyi
def tongyi_qwen_plus(temperature=1):
    # 通义 qwen_plus
    model = Tongyi(temperature=temperature, model_name='qwen-plus', dashscope_api_key=os.getenv('DASHSCOPE_API_KEY'))
    return model
llm = tongyi_qwen_plus()


prompt = [
    '说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
'说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
'说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
'说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
'说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
]
start = time.time()
def batch_base_llm_chain_no_var(model, prompt):
    """
    基础链,批次调用
    不带变量的,传入的 prompt 是一个列表
    这种方式经过测试,没有用,测试了通义,智谱,这应该是专门为 openai 设计的接口
    需要真正批次调用使用 batch_base_llm_chain 方法,经测试有用
    """
    res = model.batch(prompt)
    return res
# res = Chain.batch_base_llm_chain(llm, '{prompt_string}', max_concurrency=16, prompt_string=prompt)
res = batch_base_llm_chain_no_var(llm, prompt)
end = time.time()
t = end - start
print(t)

跑几次都是 22s 左右,跟一条一条调用没有区别,测试了通义,智谱都一样,这应该是专门为 openai 设计的接口。

批次调用

下面这个方法才有用

python 复制代码
from dotenv import load_dotenv
import time
import os
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain

load_dotenv('key.env')

from langchain_community.llms import Tongyi
def tongyi_qwen_plus(temperature=1):
    # 通义 qwen_plus
    model = Tongyi(temperature=temperature, model_name='qwen-plus', dashscope_api_key=os.getenv('DASHSCOPE_API_KEY'))
    return model
llm = tongyi_qwen_plus()


prompt = [
    '说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
'说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
'说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
'说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
'说出"你好",不需要输出其他字',
    '说出"中国在哪里?",不需要输出其他字',
    '说出"你能做什么?",不需要输出其他字',
    '说出"讲一个小白兔故事",不需要输出其他字',
]
start = time.time()


def batch_base_llm_chain(model, prompt, max_concurrency=5, **kwargs):
    """
    https://python.langchain.com/docs/modules/model_io/prompts/composition/#string-prompt-composition
    基础链,带有变量的 prompt ,与不带变量的都可以用,model 两个组成链,批次调用
    :param model: llm
    :param prompt: prompt 其中的变量是用 {} 括起来的
    :param kwargs: prompt 中的变量
    :param max_concurrency: 并发请求数
    e.g: 带变量的调用
        prompt = 'tell me a joke about {other} and {topic2}'
        other = ['bear', 'dog']
        topic2 = ['cat', 'monkey']
        Chain.batch_base_llm_chain(llm, prompt, other=other, topic2=topic2)

        传进来后的 kwargs: kwargs = {'topic1': ['bear', 'dog'], 'topic2': ['cat', 'monkey']}
        处理后 batch_list: batch_list = [{"topic1": "bears", "topic2": "cat"}, {"topic1": "dog", "topic2": "monkey"}]

    e.g: 不带变量的调用
        prompt = '{prompt_string}'
        prompt_lst = ['xxx', 'xxx'...]
        Chain.batch_base_llm_chain(llm, '{prompt_string}', max_concurrency=16, prompt_string=prompt_lst)

    :return:
    """
    prompt = PromptTemplate.from_template(prompt)
    chain = LLMChain(llm=model, prompt=prompt)

    # 确保所有列表长度相同,构造批次列表
    keys = list(kwargs.keys())
    first_list_length = len(kwargs[keys[0]])
    if all(len(kwargs[key]) == first_list_length for key in keys):
        # 使用zip函数将所有值配对
        paired_values = zip(*[kwargs[key] for key in keys])
        # 遍历配对后的值,构造新的字典列表
        batch_list = [dict(zip(keys, values)) for values in paired_values]
    else:
        print("批次对应列表长度不一致,无法转换。")
        return None

    res = chain.batch(batch_list, config={"max_concurrency": max_concurrency})
    return res
res = batch_base_llm_chain(llm, '{prompt_string}', max_concurrency=16, prompt_string=prompt)
end = time.time()
t = end - start
print(t)

快了 2-3 倍

相关推荐
SomeB1oody2 天前
获取OpenAI官方给ChatGPT的系统定义Prompt
人工智能·语言模型·chatgpt·prompt
旷野..2 天前
GPT 时代,精进编程思维 + 熟练 Prompt 是否是新的编程范式?
python·gpt·prompt
AIzealot无2 天前
论文解读之Chain-of-Thought Prompting Elicits Reasoning in Large Language Models(CoT)
人工智能·语言模型·自然语言处理·prompt·提示词
confiself3 天前
大模型系列——投机解码:Prompt Lookup Decoding代码解读
prompt
杨过过儿3 天前
【Prompt Engineering】7 聊天机器人
人工智能·机器人·prompt
学习前端的小z3 天前
【AIGC】ChatGPT 结构化 Prompt 的高级应用
chatgpt·prompt·aigc
学习前端的小z3 天前
【AIGC】从CoT到BoT:AGI推理能力提升24%的技术变革如何驱动ChatGPT未来发展
chatgpt·prompt·aigc
AIGC大时代4 天前
告别机器人味:如何让ChatGPT写出有灵魂的内容
人工智能·chatgpt·机器人·prompt·aigc·ai写作
三月七(爱看动漫的程序员)4 天前
The Rise and Potential of Large Language ModelBased Agents:A Survey---讨论
人工智能·语言模型·自然语言处理·chatgpt·prompt
杨过过儿5 天前
【Prompt Engineering】4 推断
人工智能·自然语言处理·prompt