diff --git a/2025.11.03_langchain/.env b/2025.11.03_langchain/.env new file mode 100644 index 0000000..6321e48 --- /dev/null +++ b/2025.11.03_langchain/.env @@ -0,0 +1,2 @@ +OPENAI_API_KEY=xxx +DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 \ No newline at end of file diff --git a/2025.11.03_langchain/langchain_example.py b/2025.11.03_langchain/langchain_example.py new file mode 100644 index 0000000..9b2c7ff --- /dev/null +++ b/2025.11.03_langchain/langchain_example.py @@ -0,0 +1,34 @@ +import langchain_openai +from langchain_core.prompts import ChatPromptTemplate +import dotenv +import os + +# 加载环境变量(包含API密钥) +dotenv.load_dotenv() + +# 创建聊天模型 +llm = langchain_openai.ChatOpenAI( + api_key=os.getenv("OPENAI_API_KEY"), # 从环境变量获取 API 密钥 + base_url=os.getenv("DASHSCOPE_BASE_URL"), # 指定 API 端点 + model="qwen-plus", # 使用通义千问 Plus 模型 + temperature=0.7, # 控制回复的随机性(0-1,越高越有创意) + streaming=True, # 启用流式模式 +) + +# 创建简单的提示词模板 +prompt = ChatPromptTemplate.from_messages([ + ("system", "你是一个友好的聊天助手。"), # 系统角色设定 + ("human", "{question}") # 用户输入占位符 +]) + +# 创建处理链 +chain = prompt | llm # 使用管道操作符连接组件 + +# 使用 stream() 实现流式输出 +for chunk in chain.stream({"question": "你好"}): + print(chunk.content, end="", flush=True) +print() # 换行 + +# # 非流式输出 +# response = chain.invoke({"question": "你好"}) +# print(response.content) \ No newline at end of file diff --git a/2025.11.03_langchain/langchain_example_with_memory.py b/2025.11.03_langchain/langchain_example_with_memory.py new file mode 100644 index 0000000..b79ddbd --- /dev/null +++ b/2025.11.03_langchain/langchain_example_with_memory.py @@ -0,0 +1,61 @@ +import os +from dotenv import load_dotenv +from langchain_openai import ChatOpenAI +from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder +from langchain_core.runnables.history import RunnableWithMessageHistory +from langchain_community.chat_message_histories import ChatMessageHistory + +# 加载 .env 中的 API 密钥等配置 +load_dotenv() + +# 初始化大模型 +llm = ChatOpenAI( + api_key=os.getenv("OPENAI_API_KEY"), + base_url=os.getenv("DASHSCOPE_BASE_URL"), + model="qwen-plus", + temperature=0.7 +) + +# 定义带历史记录的提示模板 +prompt = ChatPromptTemplate.from_messages([ + ("system", "你是一个乐于助人的助手。"), + MessagesPlaceholder("history"), # 历史消息占位符 + ("human", "{input}") # 当前用户输入 +]) + +# 创建基础链 +chain = prompt | llm + +# 内存存储:用字典模拟会话历史(仅用于演示) +store = {} + +def get_session_history(session_id: str): + if session_id not in store: + store[session_id] = ChatMessageHistory() + return store[session_id] + +# 包装成带记忆的链 +chatbot = RunnableWithMessageHistory( + chain, + get_session_history, + input_messages_key="input", + history_messages_key="history", +) + +def chat_with_agent(input_message, session_id): + print(f"用户: {input_message}") + print("助手: ", end="", flush=True) + for chunk in chatbot.stream( + {"input": input_message}, + config={"configurable": {"session_id": session_id}} # 多轮对话(使用同一个 session_id) + ): + print(chunk.content, end="", flush=True) + print("\n\n---\n") + +chat_with_agent(input_message='一句话解释下人工智能。', session_id="user_001") + +chat_with_agent(input_message='我们都聊了什么?', session_id="user_001") + +chat_with_agent(input_message='我们都聊了什么?', session_id="user_002") + +chat_with_agent(input_message='我们都聊了什么?', session_id="user_001") \ No newline at end of file