本文旨在解決LangChain與Chainlit集成時(shí)常見的`input_variables`配置錯(cuò)誤及`cl.user_session`誤用問題。文章將詳細(xì)解釋如何正確定義提示模板的輸入變量,并著重糾正“UserSession.set() missing 1 required positional argument”這一常見錯(cuò)誤,通過提供代碼示例和最佳實(shí)踐,確保開發(fā)者能夠構(gòu)建穩(wěn)定、高效的會話式AI應(yīng)用。
在開發(fā)基于大型語言模型(LLM)的會話式AI應(yīng)用時(shí),LangChain提供了強(qiáng)大的鏈?zhǔn)教幚砟芰Γ鳦hainlit則提供了一個(gè)直觀的前端界面,兩者結(jié)合能夠快速構(gòu)建功能豐富的聊天機(jī)器人。然而,在集成過程中,開發(fā)者常會遇到一些關(guān)于提示模板(PromptTemplate)的input_variables配置以及Chainlit會話狀態(tài)管理(cl.user_session)的問題。理解并正確處理這些問題是確保應(yīng)用穩(wěn)定運(yùn)行的關(guān)鍵。
在使用LangChain和Chainlit構(gòu)建檢索增強(qiáng)生成(RAG)應(yīng)用時(shí),以下兩個(gè)問題尤為突出:
LangChain的PromptTemplate通過input_variables來定義在渲染模板時(shí)需要填充的動(dòng)態(tài)變量。對于RetrievalQA.from_chain_type,特別是當(dāng)chain_type設(shè)置為"stuff"時(shí),它會期望一個(gè)用于填充檢索到文檔的變量名,默認(rèn)通常是"context"。
用戶遇到的問題: 報(bào)告的錯(cuò)誤信息是"1 validation error for StuffDocumentsChain root document_variable_name context was not found in llm_chain input_variables: ['', 'question']"。 雖然用戶提供的custom_prompt_template和set_custom_prompt函數(shù)中,PromptTemplate明確定義了input_variables = ['context', 'question'],并且模板字符串中也包含Context: {},但這個(gè)錯(cuò)誤提示表明在鏈的內(nèi)部,StuffDocumentsChain未能正確識別或接收到'context'變量。這可能發(fā)生在:
代碼示例(用戶原始的PromptTemplate定義,這部分本身是正確的):
custom_prompt_template = """Use the following pieces of information to answer the user's question. If you don't know the answer, please just say that you don't know the answer, don't try to make up an answer. Context: {} Question: {question} Only returns the helpful answer below and nothing else. Helpful answer: """ def set_custom_prompt(): prompt = PromptTemplate(template = custom_prompt_template, input_variables = ['context','question']) return prompt
cl.user_session是Chainlit提供的一種便捷機(jī)制,用于在用戶與機(jī)器人交互的整個(gè)會話生命周期中存儲和檢索用戶特定的數(shù)據(jù)。正確使用set()和get()方法對于維護(hù)會話狀態(tài)至關(guān)重要。
用戶遇到的問題: 報(bào)告的錯(cuò)誤是"UserSession.set() missing 1 required positional argument: 'value'"。 這個(gè)錯(cuò)誤清晰地指出cl.user_session.set()函數(shù)被錯(cuò)誤地調(diào)用了。
用戶原始的@cl.on_message函數(shù)中的問題代碼:
@cl.on_message async def main(message): chain = cl.user_session.set("chain") # <-- 問題所在 # ... 后續(xù)代碼
在@cl.on_chat_start函數(shù)中,cl.user_session.set('chain', chain)已經(jīng)將chain對象存儲到了會話中。當(dāng)用戶發(fā)送消息時(shí),@cl.on_message函數(shù)需要從會話中獲取這個(gè)已存儲的chain對象,而不是嘗試再次設(shè)置它。cl.user_session.set("chain")只提供了一個(gè)鍵,缺少了要存儲的值,因此導(dǎo)致了missing 1 required positional argument: 'value'的錯(cuò)誤。
針對上述問題,核心解決方案在于正確使用cl.user_session以及確保傳遞給LangChain鏈的輸入格式正確。
將@cl.on_message函數(shù)中錯(cuò)誤的set操作改為正確的get操作:
原代碼:
chain = cl.user_session.set("chain")
修正后:
chain = cl.user_session.get("chain")
通過cl.user_session.get("chain"),我們可以從當(dāng)前用戶的會話中檢索到在@cl.on_chat_start時(shí)已經(jīng)初始化并存儲的LangChain chain對象。
當(dāng)用戶在Chainlit界面輸入消息時(shí),@cl.on_message裝飾器會將用戶消息封裝成一個(gè)cl.Message對象傳遞給main函數(shù)。LangChain鏈通常期望接收一個(gè)字符串作為查詢輸入,而不是整個(gè)cl.Message對象。
原代碼:
res = await chain.acall(message, callbacks = [cb])
修正后:
res = await chain.acall(message.content, callbacks = [cb])
通過message.content,我們提取了用戶輸入的實(shí)際文本內(nèi)容,并將其傳遞給LangChain鏈進(jìn)行處理。
結(jié)合上述兩點(diǎn)修正,@cl.on_message函數(shù)應(yīng)更新為:
import chainlit as cl # ... 其他導(dǎo)入和函數(shù)定義保持不變 ... @cl.on_chat_start async def start(): chain = qa_bot() msg = cl.Message(content="Starting the bot......") await msg.send() msg.content = "Hi, Welcome to the Medical Bot. What is your query?" await msg.update() cl.user_session.set('chain', chain) # 正確設(shè)置chain @cl.on_message async def main(message: cl.Message): # 建議明確類型提示 chain = cl.user_session.get("chain") # 正確獲取chain cb = cl.AsyncLangchainCallbackHandler( stream_final_answer = True, answer_prefix_tokens = ["FINAL", "ANSWER"] ) cb.answer_reached = True # 確保將消息內(nèi)容傳遞給鏈 res = await chain.acall(message.content, callbacks = [cb]) answer = res["result"] sources = res["source_documents"] if sources: answer += f"\nSources:" + str(sources) else: answer += f"\nNo Sources Found" await cl.Message(content = answer).send()
通過正確區(qū)分cl.user_session.set()和cl.user_session.get()的用途,并確保將cl.Message對象的content屬性傳遞給LangChain鏈,我們可以有效解決在LangChain與Chainlit集成過程中常見的會話管理和輸入處理問題。這些修正不僅能消除運(yùn)行時(shí)錯(cuò)誤,還能使你的會話式AI應(yīng)用更加健壯和用戶友好。
以上就是如何正確管理Chainlit中LangChain應(yīng)用的會話狀態(tài)的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進(jìn)程會占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號