Langchain Chat Model 和 Chat Prompt Template

农民  金牌会员 | 2024-12-30 22:13:48 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 820|帖子 820|积分 2460

0. 简介

Chat Model 不止是一个用于谈天对话的模子抽象,更紧张的是提供了多角色提示能力(System,AI,Human,Function)。
Chat Prompt Template 则为开发者提供了便捷维护不同角色的提示模板与消息记录的接口。
1. 构造 ChatPromptTemplate

  1. from langchain.prompts.chat import (
  2.     ChatPromptTemplate,
  3.     SystemMessagePromptTemplate,
  4.     AIMessagePromptTemplate,
  5.    HumanMessagePromptTemplate,
  6. )
  7. import os
  8. from dotenv import load_dotenv, find_dotenv
  9. # 删除all_proxy环境变量
  10. if 'all_proxy' in os.environ:
  11.     del os.environ['all_proxy']
  12. # 删除ALL_PROXY环境变量
  13. if 'ALL_PROXY' in os.environ:
  14.     del os.environ['ALL_PROXY']
  15. _ = load_dotenv(find_dotenv())
  16. template = (
  17.     """You are a translation expert, proficient in various languages. \n
  18.     Translates English to Chinese."""
  19. )
  20. system_message_prompt = SystemMessagePromptTemplate.from_template(template)
  21. print(type(system_message_prompt))
  22. print(system_message_prompt)
  23. human_template = "{text}"
  24. human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
  25. print(type(human_message_prompt))
  26. print(human_message_prompt)
  27. print("*"*40)
  28. # 使用 System 和 Human 角色的提示模板构造 ChatPromptTemplate
  29. chat_prompt_template = ChatPromptTemplate.from_messages(
  30.     [system_message_prompt, human_message_prompt]
  31. )
  32. print(type(chat_prompt_template))
  33. print(chat_prompt_template)
  34. print("*"*50)
  35. chat_prompt_prompt_value = chat_prompt_template.format_prompt(text="I love python.")
  36. print(type(chat_prompt_prompt_value))
  37. print(chat_prompt_prompt_value)
  38. print("*"*60)
  39. chat_prompt_list = chat_prompt_template.format_prompt(text="I love python.").to_messages()
  40. print(type(chat_prompt_list))
  41. print(chat_prompt_list)
复制代码
输出:
  1. <class 'langchain_core.prompts.chat.SystemMessagePromptTemplate'>
  2. prompt=PromptTemplate(input_variables=[], input_types={}, partial_variables={}, template='You are a translation expert, proficient in various languages. \n\n    Translates English to Chinese.') additional_kwargs={}
  3. <class 'langchain_core.prompts.chat.HumanMessagePromptTemplate'>
  4. prompt=PromptTemplate(input_variables=['text'], input_types={}, partial_variables={}, template='{text}') additional_kwargs={}
  5. ****************************************
  6. <class 'langchain_core.prompts.chat.ChatPromptTemplate'>
  7. input_variables=['text'] input_types={} partial_variables={} messages=[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], input_types={}, partial_variables={}, template='You are a translation expert, proficient in various languages. \n\n    Translates English to Chinese.'), additional_kwargs={}), HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['text'], input_types={}, partial_variables={}, template='{text}'), additional_kwargs={})]
  8. **************************************************
  9. <class 'langchain_core.prompt_values.ChatPromptValue'>
  10. messages=[SystemMessage(content='You are a translation expert, proficient in various languages. \n\n    Translates English to Chinese.', additional_kwargs={}, response_metadata={}), HumanMessage(content='I love python.', additional_kwargs={}, response_metadata={})]
  11. ************************************************************
  12. <class 'list'>
  13. [SystemMessage(content='You are a translation expert, proficient in various languages. \n\n    Translates English to Chinese.', additional_kwargs={}, response_metadata={}), HumanMessage(content='I love python.', additional_kwargs={}, response_metadata={})]
复制代码
2. LCEL 执行

  1. from langchain_openai import ChatOpenAI
  2. from langchain_core.output_parsers import StrOutputParser
  3. from langchain.prompts.chat import (
  4.     ChatPromptTemplate,
  5.     SystemMessagePromptTemplate,
  6.     AIMessagePromptTemplate,
  7.    HumanMessagePromptTemplate,
  8. )
  9. import os
  10. from dotenv import load_dotenv, find_dotenv
  11. # 删除all_proxy环境变量
  12. if 'all_proxy' in os.environ:
  13.     del os.environ['all_proxy']
  14. # 删除ALL_PROXY环境变量
  15. if 'ALL_PROXY' in os.environ:
  16.     del os.environ['ALL_PROXY']
  17. _ = load_dotenv(find_dotenv())
  18. # 为了结果的稳定性,将 temperature 设置为 0
  19. translation_model = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
  20. template = (
  21.     """You are a translation expert, proficient in various languages. \n
  22.     Translates {source_language} to {target_language} in the style of {name}."""
  23. )
  24. system_message_prompt = SystemMessagePromptTemplate.from_template(template)
  25. human_template = "{text}"
  26. human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
  27. # 使用 System 和 Human 角色的提示模板构造 ChatPromptTemplate
  28. m_chat_prompt_template = ChatPromptTemplate.from_messages(
  29.     [system_message_prompt, human_message_prompt]
  30. )
  31. output_parser = StrOutputParser()
  32. m_translation_chain = m_chat_prompt_template| translation_model |  StrOutputParser(callbacks=[callback_handler])
  33. # Prepare input data
  34. input_data = {
  35.     "source_language": "English",
  36.     "target_language": "Chinese",
  37.     "name": "严复",
  38.     "text": "Life is full of regrets. All we can do is to minimize them.",
  39. }
  40. input_data1 = {
  41.     "source_language": "English",
  42.     "target_language": "Chinese",
  43.     "name": "李白",
  44.     "text": "Life is full of regrets. All we can do is to minimize them.",
  45. }
  46. # Format the prompt
  47. prompt_value = m_chat_prompt_template.format_prompt(**input_data)
  48. print(type(prompt_value))
  49. print(prompt_value)
  50. print(type(prompt_value.to_messages()))
  51. print(prompt_value.to_messages())
  52. result = translation_model.invoke(prompt_value)
  53. print(result)
  54. result = m_translation_chain.invoke(input_data)
  55. print(result)
  56. result = m_translation_chain.invoke(input_data1)
  57. print(result)
复制代码
输出:
  1. <class 'langchain_core.prompt_values.ChatPromptValue'>
  2. messages=[SystemMessage(content='You are a translation expert, proficient in various languages. \n\n    Translates English to Chinese in the style of 严复.', additional_kwargs={}, response_metadata={}), HumanMessage(content='Life is full of regrets. All we can do is to minimize them.', additional_kwargs={}, response_metadata={})]
  3. <class 'list'>
  4. [SystemMessage(content='You are a translation expert, proficient in various languages. \n\n    Translates English to Chinese in the style of 严复.', additional_kwargs={}, response_metadata={}), HumanMessage(content='Life is full of regrets. All we can do is to minimize them.', additional_kwargs={}, response_metadata={})]
  5. content='人生充满了遗憾。我们所能做的就是尽量减少它们。' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 31, 'prompt_tokens': 53, 'total_tokens': 84, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-676a9818-bbbc-44f7-a30e-0ec065aa502f-0' usage_metadata={'input_tokens': 53, 'output_tokens': 31, 'total_tokens': 84, 'input_token_details': {}, 'output_token_details': {}}
  6. 人生充满了遗憾。我们所能做的就是尽量减少它们。
  7. 人生充滿遺憾,唯有盡量減少。
复制代码
translation_model.invoke(input_data) 输入参数是字典时报错
  1. result = translation_model.invoke(input_data)
  2. print(result)
复制代码
报错:
  1. ValueError: Invalid input type <class 'dict'>. Must be a PromptValue, str, or list of BaseMessages.
复制代码
m_translation_chain.invoke(prompt_value) 输入参数是prompt_value时报错
  1. result = m_translation_chain.invoke(prompt_value)
  2. print(result)
复制代码
报错:
  1. TypeError: Expected mapping type as input to ChatPromptTemplate. Received <class 'langchain_core.prompt_values.ChatPromptValue'>.
复制代码
检察属性:
  1. input_schema = m_translation_chain.input_schema.model_json_schema()
  2. print(input_schema)
  3. output_schema = m_translation_chain.output_schema.model_json_schema()
  4. print(output_schema)
复制代码
输出:
  1. {'properties': {'name': {'title': 'Name', 'type': 'string'}, 'source_language': {'title': 'Source Language', 'type': 'string'}, 'target_language': {'title': 'Target Language', 'type': 'string'}, 'text': {'title': 'Text', 'type': 'string'}}, 'required': ['name', 'source_language', 'target_language', 'text'], 'title': 'PromptInput', 'type': 'object'}
  2. {'title': 'StrOutputParserOutput', 'type': 'string'}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表