案例1:寫一篇短文,然后對這篇短文進行打分
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory, RunnableLambda
from langchain_openai import ChatOpenAIllm_zhipu = ChatOpenAI(temperature=0.9,model='glm-4-air-0111',api_key='****',base_url='https://open.bigmodel.cn/api/paas/v4/'
)parser = StrOutputParser()prompt1 = ChatPromptTemplate.from_template('給我寫一篇關于{key_word}的{type},字數不超過{count}。')
prompt2 = ChatPromptTemplate.from_template('請簡單評價一下這篇短文,如果總分是10分,請給這篇短文打分:{text_context}。')chain1 = prompt1 | llm_zhipu | StrOutputParser()
#這樣組裝,不會輸出chain1的內容
# chain2 = {'text_context':chain1} | prompt2 | llm_zhipu | StrOutputParser()def print_chain1(input):print(input)print('*'*30)return {'text_context':input}
chain2 = chain1 | RunnableLambda(print_chain1) | prompt2 | llm_zhipu | parserprint(chain2.invoke({'key_word': '請寫一篇關于春天的文章', 'type': '散文', 'count': 500}))
輸出:
案例2:根據用戶輸入的點餐偏好,推薦2-3家餐廳,并給出推薦理由
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory, RunnableLambda
from langchain_openai import ChatOpenAIllm = ChatOpenAI(temperature=1,model='deepseek-r1',api_key='****',base_url='https://dashscope.aliyuncs.com/compatible-mode/v1'
)parser = StrOutputParser()
user_preperences_prompt = ChatPromptTemplate.from_template('用戶輸入了一些餐廳偏好:\n{user_input}\n,請將用戶的偏好總結為清晰的需求:')recommend_preperences_prompt = ChatPromptTemplate.from_template('基于用戶的需求:\n{recommend_input}\n,請推薦3家適合的餐廳,并說明推薦的理由:')summarize_preperences_prompt = ChatPromptTemplate.from_template('以下是餐廳推薦和推薦的理由:\n{summarize_input}\n,請總結成2-3句話,供用戶參考:')chain = user_preperences_prompt | llm | recommend_preperences_prompt | llm | summarize_preperences_prompt | llm | parser
print(chain.invoke({'user_input': '我喜歡吃辣,環境要安靜點的餐廳,價格要實惠,又好吃的菜'}))
輸出:
案例3:用戶會問到各個領域的問題,根據不同的領域定義不同的提示詞模板,動態的選擇合適的任務模板去完成
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory, RunnableLambda, RouterRunnable, RunnableSequence
from langchain_openai import ChatOpenAIllm = ChatOpenAI(temperature=1,model='deepseek-r1',api_key='*****',base_url='https://dashscope.aliyuncs.com/compatible-mode/v1'
)#用戶會問到各個領域的問題,根據不同的領域定義不同的提示詞模板,動態的選擇合適的任務模板去完成
parser = StrOutputParser()math_prompt = ChatPromptTemplate.from_template('你是一位數學家,擅長分步驟解決各種數學問題,以下是問題的內容:{input}')
physics_prompt = ChatPromptTemplate.from_template('你是一位物理教授,擅長用通俗易懂的語言回答各種物理問題,以下是問題的內容:{input}')
history_prompt = ChatPromptTemplate.from_template('你是一位歷史研究學家,對歷史事件和背景很精通,以下是問題的內容:{input}')
computer_prompt = ChatPromptTemplate.from_template('你是一位非常自身的計算機科學家,擅長算法,大數據,編程問題,以下是問題的內容:{input}')
default_prompt = ChatPromptTemplate.from_template('輸入內容無法歸類,請直接回答:{input}')default_chain = default_prompt | llm
computer_chain = computer_prompt | llm
history_chain = history_prompt | llm
physics_chain = physics_prompt | llm
math_chain = math_prompt | llmdef route(input):"""根據大模型第一次處理的值輸出來,動態判斷各種領域的任務:param input::return:"""if '物理' in input['type']:print('1號路由')return {'key':'physics','input':input['input']}elif '數學' in input['type']:print('2號路由')return {'key':'math','input':input['input']}elif '歷史' in input['type']:print('3號路由')return {'key':'history','input':input['input']}elif '計算機' in input['type']:print('4號路由')return {'key':'computer','input':input['input']}else :print('5號路由')return {'key':'default','input':input['input']}#創建一個路由的節點
route_runnable = RunnableLambda(route)
router = RouterRunnable(runnables={'physics':physics_chain,'math':math_chain,'history': history_chain,'computer': computer_chain,'default': default_chain
})#第一個提示詞模板:
first_prompt = ChatPromptTemplate.from_template('不要回答下面用戶的問題,只要根據用主呢的輸入來判斷分類,一共有【物理、歷順、計算機、數學、其他】5種類別\n\n\用戶的輸入:{input}\n\n\最后的輸出包含分類的類別和用戶輸入的內容,輸出的格式為json,其中類別的key為type,用戶輸入內容的key為input'
)chain1 = first_prompt | llm | JsonOutputParser()
chain2 = RunnableSequence(chain1,route_runnable,router) # chain1 | route_runnable | routerinputs = [{'input':'什么是黑體輻射?'},{'input':'1+1真的等于2嗎?'},{'input':'介紹一下第一次世界大戰的背景?'},{'input':'如何快速實現冒泡算法?'}
]for inp in inputs:result = chain2.invoke(inp)print(f'問題:{inp}\n 回答:{result.content}\n')
輸出: