From 97e319d4fc7c573845c097a86dcd8cc7e9d632ea Mon Sep 17 00:00:00 2001 From: "2287551746@qq.com" <2287551746@example.com> Date: Tue, 28 Oct 2025 17:41:39 +0800 Subject: [PATCH] 2025.10.28 --- 04_langchain_basics/01_Models.py | 18 ++++++ 04_langchain_basics/02_Prompt.py | 32 +++++++++++ 04_langchain_basics/03_Chain.py | 33 +++++++++++ 04_langchain_basics/04_Memory.py | 89 ++++++++++++++++++++++++++++++ 04_langchain_basics/05_practice.py | 65 ++++++++++++++++++++++ 04_langchain_basics/README.md | 55 ++++++++++++++++++ 6 files changed, 292 insertions(+) create mode 100644 04_langchain_basics/01_Models.py create mode 100644 04_langchain_basics/02_Prompt.py create mode 100644 04_langchain_basics/03_Chain.py create mode 100644 04_langchain_basics/04_Memory.py create mode 100644 04_langchain_basics/05_practice.py create mode 100644 04_langchain_basics/README.md diff --git a/04_langchain_basics/01_Models.py b/04_langchain_basics/01_Models.py new file mode 100644 index 0000000..f1fdda2 --- /dev/null +++ b/04_langchain_basics/01_Models.py @@ -0,0 +1,18 @@ +import os +from dotenv import load_dotenv + +load_dotenv() +api_key = os.getenv("OPENAI_API_KEY") + +from langchain_openai import ChatOpenAI + +# 初始化模型 +llm = ChatOpenAI( + model="deepseek-chat", + api_key=api_key, + base_url="https://api.deepseek.com" +) + +# 调用模型 +response = llm.invoke('你好喵') +print(response.content) diff --git a/04_langchain_basics/02_Prompt.py b/04_langchain_basics/02_Prompt.py new file mode 100644 index 0000000..8e5dc29 --- /dev/null +++ b/04_langchain_basics/02_Prompt.py @@ -0,0 +1,32 @@ +import os +from dotenv import load_dotenv + +load_dotenv() +api_key = os.getenv("OPENAI_API_KEY") + + +from langchain_core.prompts import ChatPromptTemplate + +# 定义提示词模板(推荐写法) +prompt = ChatPromptTemplate.from_messages([ + ("system","你非常可爱,说话末尾会带个喵"), + ("human","{input}") # {input}:占位符 +]) +# 格式化输出 +formatted_prompt = prompt.invoke({"input":"你好喵"}) +print(formatted_prompt) + + + + + + + + + + + + + + + diff --git a/04_langchain_basics/03_Chain.py b/04_langchain_basics/03_Chain.py new file mode 100644 index 0000000..944b3a7 --- /dev/null +++ b/04_langchain_basics/03_Chain.py @@ -0,0 +1,33 @@ +import os +from dotenv import load_dotenv + +load_dotenv() +api_key = os.getenv("OPENAI_API_KEY") + + +from langchain_core.prompts import ChatPromptTemplate +from langchain_openai import ChatOpenAI +from langchain_core.output_parsers import StrOutputParser + +# 定义提示词模板 +prompt = ChatPromptTemplate.from_messages([ + ("system", "你非常可爱,说话末尾会带个喵"), + ("human", "{input}") # {input}:占位符 +]) + +# 初始化模型 +llm = ChatOpenAI( + model="deepseek-chat", + api_key=api_key, + base_url="https://api.deepseek.com" +) + +# 定义解析器,把LLM返回的AIMessage转成字符串 +parser = StrOutputParser() + +# 组成Chain +chain = prompt | llm | parser + +# 最终调用 +result = chain.invoke({"input": "你好喵"}) +print(result) diff --git a/04_langchain_basics/04_Memory.py b/04_langchain_basics/04_Memory.py new file mode 100644 index 0000000..1a7a342 --- /dev/null +++ b/04_langchain_basics/04_Memory.py @@ -0,0 +1,89 @@ +import os +from dotenv import load_dotenv + + +load_dotenv() +api_key = os.getenv("OPENAI_API_KEY") + + + +from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholder +from langchain_openai import ChatOpenAI +from langchain_core.output_parsers import StrOutputParser +from langchain_community.chat_message_histories import ChatMessageHistory +from langchain_core.runnables import RunnableWithMessageHistory + + +prompt = ChatPromptTemplate.from_messages([ + ("system", "你非常可爱,说话末尾会带个喵"), + MessagesPlaceholder(variable_name="history"), + ("human", "{input}") # {input}:占位符 +]) +llm = ChatOpenAI( + model="deepseek-chat", + api_key=api_key, + base_url="https://api.deepseek.com" +) +parser = StrOutputParser() + +chain = prompt | llm | parser + +# 存储所有会话历史(可用数据库替换) +# 此处用字典模拟,也可替换成Redis、SQL等 +store = {} + +def get_session_history(session_id:str): + """根据session_id获取该用户的聊天历史""" + if session_id not in store: + store[session_id] = ChatMessageHistory() # 创建新的历史记录 + return store[session_id] + + +# 包装成带记忆的Runnable +runnable_with_memory = RunnableWithMessageHistory( + runnable=chain, + get_session_history=get_session_history, + input_messages_key="input", + history_messages_key="history" +) + +session_id = 'user_123' +while 1: + user_input = input("\n你:") + if user_input=="quit": + print('拜拜喵!') + break + response = runnable_with_memory.invoke( + {"input":user_input}, + config={"configurable":{"session_id":session_id}} + ) + print(f'AI:{response}') + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/04_langchain_basics/05_practice.py b/04_langchain_basics/05_practice.py new file mode 100644 index 0000000..c55c1f5 --- /dev/null +++ b/04_langchain_basics/05_practice.py @@ -0,0 +1,65 @@ +import os +from dotenv import load_dotenv + +load_dotenv() + +def create_client(): + api_key = os.getenv("OPENAI_API_KEY") + return api_key + + +from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholder +from langchain_openai import ChatOpenAI +from langchain_core.output_parsers import StrOutputParser +from langchain_community.chat_message_histories import ChatMessageHistory +from langchain_core.runnables import RunnableWithMessageHistory + + +def create_bot(llm,sys_prompt): + """ + :param sys_prompt: 系统提示词 + :param llm: 已配置好的语言模型实例 + :return: + """ + prompt = ChatPromptTemplate.from_messages([ + ("system",sys_prompt), + MessagesPlaceholder(variable_name="history"), + ("human","{input}") + ]) + parser = StrOutputParser() + chain = prompt | llm | parser + store = {} + + def get_session_history(session_id): + return store.setdefault(session_id,ChatMessageHistory()) + + return RunnableWithMessageHistory( + runnable=chain, + get_session_history=get_session_history, + input_messages_key="input", + history_messages_key="history" + ) + +def main(): + # 此处集中配置LLM + llm = ChatOpenAI( + model="deepseek-chat", + api_key=create_client(), + base_url="https://api.deepseek.com" + ) + prompt = """你是‘小智’,一位专业、耐心且记忆力出色的 AI 助手。 + 你善于倾听,能记住用户之前提到的信息,并在后续对话中自然提及。 + 回答时简洁明了,避免冗余。""" + bot = create_bot(llm,prompt) + session_id = '123' + while 1: + user_input = input('\n你:') + if user_input == "quit": + print('拜拜') + break + response = bot.invoke({"input":user_input},config={"configurable":{"session_id":session_id}}) + print("AI:",response) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/04_langchain_basics/README.md b/04_langchain_basics/README.md new file mode 100644 index 0000000..f8ad2c8 --- /dev/null +++ b/04_langchain_basics/README.md @@ -0,0 +1,55 @@ +## 🧩 模块说明:LangChain 基础核心组件 + +📌 **核心知识点**: +LLM 调用|Prompt 设计|Chain 构建|Memory 记忆|实战练习 + +--- + +### 1. `01_Models.py`(模型调用) +封装 LLM 实例,实现标准调用流程。 + +✅ 掌握点: +- 如何初始化 ChatOpenAI 或 DeepSeek +- 设置 API Key 和 base_url + +--- + +### 2. `02_Prompt.py`(提示词构建) +使用 `ChatPromptTemplate` 构建可复用的 Prompt 模板。 + +✅ 掌握点: +- 系统提示 + 历史消息 + 用户输入 +- 使用 `{input}` 占位符 +- 多轮对话的基础结构 + +--- + +### 3. `03_Chain.py`(链式调用) +将 Prompt + LLM + Parser 组合成 Chain。 + +✅ 掌握点: +- 使用 `|` 操作符连接组件 +- 创建可复用的处理流程 +- 输出解析为字符串 + +--- + +### 4. `04_Memory.py`(记忆功能) +添加会话记忆,实现多轮对话。 + +✅ 掌握点: +- 使用 `ChatMessageHistory` 存储历史 +- `RunnableWithMessageHistory` 包装 Chain +- 保持上下文连贯性 + +--- + +### 5. `05_practice.py`(综合实践) +整合所有组件,搭建一个带记忆的 AI 对话机器人。 + +✅ 掌握点: +- 完整流程串联 +- 实际运行体验 +- 可直接扩展为 Web 应用 + +💡 建议:跑通后,试试让 AI 记住你喜欢的颜色,并在后续对话中提及。 \ No newline at end of file