76 lines
2.6 KiB
Python
76 lines
2.6 KiB
Python
# 目前:已经测试到05_文件夹,代码测试完毕能跑通,但新旧写法尚未确定,明天要改写法+改博客
|
|
|
|
from config import OPENAI_API_KEY
|
|
from langchain_openai import ChatOpenAI
|
|
from langchain_classic.agents import AgentExecutor
|
|
from langchain_classic.agents import create_tool_calling_agent
|
|
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
|
|
from langchain_core.tools import tool # 导入 @tool
|
|
from langchain_community.chat_message_histories import ChatMessageHistory
|
|
from langchain_core.runnables import RunnableWithMessageHistory
|
|
from langchain_core.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
|
|
|
|
|
|
# 配置llm
|
|
llm = ChatOpenAI(
|
|
model="deepseek-chat",
|
|
api_key=OPENAI_API_KEY,
|
|
base_url="https://api.deepseek.com",
|
|
streaming=True,
|
|
callbacks=[StreamingStdOutCallbackHandler()]
|
|
)
|
|
# 配置prompt(新增俩占位符 一个为对话历史记录,一个为agent的思考过程)
|
|
prompt = ChatPromptTemplate.from_messages([
|
|
('system','你是小智,一个帮助他人的智能助手。当你无法解答当前问题时,会调用工具来解决问题。'),
|
|
MessagesPlaceholder(variable_name="history"),
|
|
('human','{input}'),
|
|
MessagesPlaceholder(variable_name="agent_scratchpad")
|
|
])
|
|
|
|
# 配置tool
|
|
@tool
|
|
def get_weather(location):
|
|
"""模拟获得天气信息"""
|
|
return f"{location}当前天气:23℃,晴,风力2级"
|
|
|
|
|
|
tools = [get_weather]
|
|
# 配置agent
|
|
agent = create_tool_calling_agent(llm=llm,prompt=prompt,tools=tools)
|
|
# 配置AgentExecutor
|
|
agent_executor = AgentExecutor(agent=agent,tools=tools) # 这里没加verbose=True,想打印日志看思考链的可以自行打印
|
|
|
|
|
|
# 记忆存储--包装agent_executor
|
|
store = {}
|
|
def get_session_history(session_id:str):
|
|
if session_id not in store:
|
|
store[session_id] = ChatMessageHistory()
|
|
return store[session_id]
|
|
|
|
|
|
agent_with_memory = RunnableWithMessageHistory(
|
|
runnable=agent_executor,
|
|
get_session_history=get_session_history,
|
|
input_messages_key="input",
|
|
history_messages_key="history"
|
|
)
|
|
# 打印测试
|
|
session_id = 'user123'
|
|
|
|
if __name__ == '__main__':
|
|
while 1:
|
|
user_input = input('\n你:')
|
|
if user_input == 'quit':
|
|
print('拜拜~')
|
|
break
|
|
# 用于标记"AI:"这个内容
|
|
# flush=True保证"AI:"立即输出,而不是等缓存区存满再输出
|
|
print("AI: ", end="", flush=True)
|
|
response = agent_with_memory.invoke(
|
|
{'input': user_input},
|
|
config={'configurable': {'session_id': session_id}}
|
|
)
|
|
print()
|
|
|