• 【langchain手把手2】构造Prompt模版


    提示词是模型的输入,通过编写提示词可以和模型进行交互。LangChain中提供了许多模板和函数用于模块化构建提示词。开发者可以:

    • 模块化构建:通过模板和函数,LangChain允许用户以模块化的方式构建提示词,这意味着可以重复使用某些构建块来创建新的提示词,从而提高效率和一致性。
    • 灵活性:模板可以提供灵活的方法来生成提示词,允许用户根据需要调整和定制提示词,以适应不同的场景和需求。
    • 复用性:通过模板,LangChain 允许提示词的复用,这意味着一旦创建了一个有效的提示词模板,它可以被多次用于不同的上下文,而无需从头开始编写。
    • 通用模板:这些模板可能用于生成适用于各种模型的通用提示词。
    • 聊天提示词模板:专门设计用于聊天机器人或对话系统的模板,这些模板可能包含特定的结构或语言风格,以适应对话交互的特点。
    • 调用模型的方式:LangChain可能支持不同的模型调用方式,提示词模板会根据调用方式的不同而有所区别,以确保最佳性能和交互效果。

    参考官方API文档:https://api.python.langchain.com/en/latest/core_api_reference.html#module-langchain_core.prompts

    示例文档:https://python.langchain.com/v0.1/docs/modules/model_io/prompts/quick_start/

    接上一节,依旧以星火模型为例。

    #星火认知大模型调用秘钥信息,请前往讯飞开放平台控制台(https://console.xfyun.cn/services/bm35)查看
    SPARKAI_APP_ID = '*'
    SPARKAI_API_SECRET = '*'
    SPARKAI_API_KEY = '*'
    #星火认知大模型Spark3.5 Max的URL值,其他版本大模型URL值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
    SPARKAI_URL = 'wss://spark-api.xf-yun.com/v1.1/chat'
    # SPARKAI_URL = 'wss://spark-api.xf-yun.com/v3.1/chat' # Spark Pro
    #星火认知大模型Spark3.5 Max的domain值,其他版本大模型domain值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
    SPARKAI_DOMAIN = 'general' # 这里选用星火Lite
    # SPARKAI_DOMAIN = 'generalv3' # Spark Pro
    

    Prompt templates可以理解为预先定义好的参数化的prompt,可以动态传入不同的参数值而成为prompt;它是一个模版,可以包含命令、少样本示例、具体上下文和特定的问题。LangChain封装好了很多相关的工具可以让我们方便地使用prompt。

    示例1:Use PromptTemplate to create a template for a string prompt.

    # Use PromptTemplate to create a template for a string prompt.
    from langchain_core.prompts import PromptTemplate
    
    prompt_template = PromptTemplate.from_template(
        "Tell me a {adjective} joke about {content}."
    )
    prompt_template.format(adjective="funny", content="chickens")
    

    输出

    'Tell me a funny joke about chickens.'
    

    示例2:通过ChatPromptTemplate去形成多轮对话

    形成Prompt,包含各种角色信息,问题是你的名字叫什么,再隔了一次问答之后看看模型是否能正确回答

    # 每条聊天消息都与内容和一个名为role的附加参数相关联。例如,在OpenAI聊天完成API中,聊天消息可以与AI助手、人类或系统角色相关联。
    # 以下根据官方代码实现一个多轮对话
    
    from langchain_core.prompts import ChatPromptTemplate
    
    chat_template = ChatPromptTemplate.from_messages(
        [
            # 星火的三个角色是system、human、assistant
            ("system", "You are a helpful AI bot. Your name is {name}."),
            ("human", "Hello, how are you doing?"), # 上轮问题
            ("assistant", "I'm doing well, thanks!"), # 上轮回答
            ("human", "{user_input}")
        ]
    )
    
    messages = chat_template.format_messages(name="LLM硬着陆", newName="哈哈", user_input="What is your name?")
    
    print(messages)
    

    输出:

    [SystemMessage(content='You are a helpful AI bot. Your name is LLM硬着陆.'), HumanMessage(content='Hello, how are you doing?'), AIMessage(content="I'm doing well, thanks!"), HumanMessage(content='What is your name?')]
    

    引入星火模型进行对话

    # 引入星火模型
    from langchain_community.chat_models.sparkllm import ChatSparkLLM
    
    chatLLM = ChatSparkLLM(
        api_key=SPARKAI_API_KEY,
        api_secret=SPARKAI_API_SECRET,
        app_id=SPARKAI_APP_ID,
        spark_api_url=SPARKAI_URL, # 默认3.5,这里需要配置一下
        spark_llm_domain=SPARKAI_DOMAIN, # 默认3.5,这里需要配置一下
        top_k=6 # 取值为[1,6],默认为4,为了每次结果的随机性,这里设成最大
    )
    
    chatLLM(messages)
    

    输出

    `AIMessage(content='My name is iFLYTEK Spark. How can I assist you today?', response_metadata={'token_usage': {'question_tokens': 5, 'prompt_tokens': 20, 'completion_tokens': 17, 'total_tokens': 37}}, id='run-7665b56a-f4c4-421d-a76e-e0b81f39b808-0')`
    

    发现并没有正确回答,研究对照之后,发现prompt_tokens明显不对,切换到Spark Pro(3.1)/Spark Max(3.5)版本后可以正常回答,结果如下

    • Spark Lite:AIMessage(content='My name is iFLYTEK Spark. How can I assist you today?', response_metadata={'token_usage': {'question_tokens': 5, 'prompt_tokens': 20, 'completion_tokens': 17, 'total_tokens': 37}}, id='run-7665b56a-f4c4-421d-a76e-e0b81f39b808-0')
    • Spark Pro:AIMessage(content='My name is LLM硬着陆. How may I assist you today?', response_metadata={'token_usage': {'question_tokens': 5, 'prompt_tokens': 35, 'completion_tokens': 15, 'total_tokens': 50}}, id='run-52a592e9-a688-4418-ae1d-206844e21713-0')
    • Spark Max:AIMessage(content='My name is LLM硬着陆. How may I assist you today?', response_metadata={'token_usage': {'question_tokens': 5, 'prompt_tokens': 35, 'completion_tokens': 15, 'total_tokens': 50}}, id='run-f3b9bb20-acfc-4b2c-acb3-32c9d1c6e919-0')

    Spark Pro和Spark Max都能正常回答问题。可以从结果上看到,Lite的prompt_tokens受到了限制,不支持多轮对话。

    这样,通过ChatPromptTemplate就构造了一个多轮会话的Prompt。一个简单的示例,此外通过Prompts能

    • 连接特征库
    • 自定义propmt模版
    • 少样本prompt模版
    • 输出模版
    • MessagePromptTemplate
    • 部分prompt模版
    • prompt组合
    • prompt序列化
    • prompt模版校验

    请关注LLM硬着陆公众号,共同学习进步

    在这里插入图片描述

  • 相关阅读:
    MAC地址_MAC地址格式_以太网的MAC帧_基础知识
    MySQL远程链接踩坑
    OneFlow技术年货:800+页免费“大模型”电子书
    使用Excel批量生成SQL语句,用过的人都说好
    这份阿里P8架构师学习路线仅一晚GitHub狂揽6W+赞,巅峰之作?
    OpenGL-光照
    MybatisPlus学习笔记
    Chrome vs Firefox 性能之争,到底哪家强?
    极端气候?自然灾害?【实战】机器学习预测森林火灾
    有什么不起眼却挣钱的副业?
  • 原文地址:https://blog.csdn.net/weixin_41028208/article/details/139435447