引言本文基于Python 1.13.x和LangChain 1.1.2,并采用DeekSeep大模型,介绍LangChain提示词工程的实现。
pip install langchain==1.1.2pip install langchain-openai类似的其他语言和框架的提示词工程实现案例,可以移步:
1.阻塞式对话一个简单的对话实现
model = 'deepseek-chat' 大模型名称model_provider = 'openai' 采用OpenAI标准api_key = os.getenv('DSKEY') 从环境变量获取API_KEYbase_url 接口地址from langchain. chat_models import init_chat_modelimport osmodel = init_chat_model( model = 'deepseek-chat' , model_provider = 'openai' , api_key = os. getenv( 'DSKEY' ) , base_url = 'https://api.deepseek.com' ) print ( model. invoke( '你是谁' ) . content) 2.流式输出遍历llm.stream返回的迭代器对象Iterator[AIMessageChunk],得到实时返回的输出,打印追加
from langchain. chat_models import init_chat_modelimport osllm = init_chat_model( model = 'deepseek-chat' , model_provider = 'openai' , api_key = os. getenv( 'DSKEY' ) , base_url = 'https://api.deepseek.com' ) for trunk in llm. stream( '你是谁' ) : print ( trunk. content, end= '' ) print ( '结束' ) 还可以每次返回和之前的返回拼接在一起
无数trunk对象通过+加在一起,底层是用重写__add__()方法运算符重载实现
from langchain. chat_models import init_chat_modelimport osllm = init_chat_model( model = 'deepseek-chat' , model_provider = 'openai' , api_key = os. getenv( 'DSKEY' ) , base_url = 'https://api.deepseek.com' ) full = None for trunk in llm. stream( '用一句话介绍自己' ) : full = trunk if full is None else full + trunk print ( full. text) print ( full. content_blocks) print ( '结束' ) print ( full. content_blocks) 运行结果:
[]你好[{'type': 'text', 'text': '你好'}]你好,[{'type': 'text', 'text': '你好,'}]你好,我是[{'type': 'text', 'text': '你好,我是'}]你好,我是Deep[{'type': 'text', 'text': '你好,我是Deep'}]你好,我是DeepSe[{'type': 'text', 'text': '你好,我是DeepSe'}]你好,我是DeepSeek[{'type': 'text', 'text': '你好,我是DeepSeek'}]你好,我是DeepSeek,[{'type': 'text', 'text': '你好,我是DeepSeek,'}]你好,我是DeepSeek,一个[{'type': 'text', 'text': '你好,我是DeepSeek,一个'}]你好,我是DeepSeek,一个由[{'type': 'text', 'text': '你好,我是DeepSeek,一个由'}]你好,我是DeepSeek,一个由深度[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度'}]你好,我是DeepSeek,一个由深度求[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求'}]你好,我是DeepSeek,一个由深度求索[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索'}]你好,我是DeepSeek,一个由深度求索公司[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司'}]你好,我是DeepSeek,一个由深度求索公司创造的[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的'}]你好,我是DeepSeek,一个由深度求索公司创造的AI[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助![{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊'}]你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊'}]结束[{'type': 'text', 'text': '你好,我是DeepSeek,一个由深度求索公司创造的AI助手,乐于用热情细腻的方式为你提供帮助!😊'}]还可以加上一个提示词模板PromptTemplate
要想流式,只要改成chain.stream(...)即可
import osfrom langchain. chat_models import init_chat_modelfrom langchain_core. prompts import PromptTemplatefrom langchain_core. output_parsers import StrOutputParserfrom langchain_core. runnables import RunnableSequenceprompt_template = PromptTemplate( template= '做一个关于{topic}的小诗' , input_variables= [ 'topic' ] ) llm = init_chat_model( model = 'deepseek-chat' , model_provider = 'openai' , api_key = os. getenv( 'DSKEY' ) , base_url = 'https://api.deepseek.com' ) parser = StrOutputParser( ) # 提示词=》大模型=》格式化输出 chain = RunnableSequence( prompt_template, llm, parser) resp = chain. invoke( { 'topic' : '霸道总裁爱上做保洁的我' } ) print ( resp) 3.LCEL增强对话功能要理解LCEL,首先要了解Runable,Runable(langchain_core.runnables.base.Runnable)是langchain中可以调用,批处理,流式输出,转换和组合的工作单元,是实现LCEL的基础,通过重写__or__()方法,实现了|运算符的重载,实现了Runable的类对象之间便可以进行一些类似linux命令中的管道(|)操作。
LCEL,全称LangChain Express Language,即LangChain表达式语言,也是LangChain官方推荐的写法,是一种从Runable而来的声明式方法,用于声明,组合和执行各种组件(模型,提示词,工具等),如果要使用LCEL,对应的组件必须实现Runable,使用LCEL创建的Runable称之为链。
例如,将刚刚提示词模板的例子用LCEL重写
import osfrom langchain. chat_models import init_chat_modelfrom langchain_core. prompts import PromptTemplatefrom langchain_core. output_parsers import StrOutputParserprompt_template = PromptTemplate( template= '做一个关于{topic}的小诗' , input_variables= [ 'topic' ] ) llm = init_chat_model( model = 'deepseek-chat' , model_provider = 'openai' , api_key = os. getenv( 'DSKEY' ) , base_url = 'https://api.deepseek.com' ) parser = StrOutputParser( ) # LCEL重写 chain = prompt_template | llm | parserresp = chain. invoke( { 'topic' : '霸道总裁爱上做保洁的我' } ) print ( resp) 还可以自定义一个word_count(text: str) -> int函数,通过langchain的RunnableLambda对象包装,使得函数变为获得链式的执行能力的Runable对象,拼入链中,统计大模型回复的字数
import osfrom langchain. chat_models import init_chat_modelfrom langchain_core. prompts import PromptTemplatefrom langchain_core. output_parsers import StrOutputParserfrom langchain_core. runnables import RunnableLambdaprompt_template = PromptTemplate( template= '做一个关于{topic}的小诗' , input_variables= [ 'topic' ] ) llm = init_chat_model( model = 'deepseek-chat' , model_provider = 'openai' , api_key = os. getenv( 'DSKEY' ) , base_url = 'https://api.deepseek.com' ) parser = StrOutputParser( ) def word_count ( text: str ) - > int : print ( '----------word_count---------' ) return len ( text) word_counter = RunnableLambda( word_count) # LCEL重写 chain = prompt_template | llm | parser | word_counterresp = chain. invoke( { 'topic' : '霸道总裁爱上做保洁的我' } ) print ( resp) 运行:
----------word_count---------232