LangChain实战入门(四):融合篇——打造有记忆、能协作的AI应用
现在,我们的AI已经具备了很强的单次任务处理能力。但在真实的人机交互中,我们期望的不仅仅是"一问一答",而是连续的、有上下文的对话,是能够记住历史、理解语境的智能体验。
从独立工具到智能系统,构建能真正理解上下文的AI助手
开篇回顾与本期聚焦
经过前三篇的学习,我们已经掌握了LangChain的三大核心能力:
现在,我们的AI已经具备了很强的单次任务处理能力。但在真实的人机交互中,我们期望的不仅仅是"一问一答",而是连续的、有上下文的对话,是能够记住历史、理解语境的智能体验。
想象一下这些场景:
-
一个能记住你偏好的个人助理,知道你喜欢什么、讨厌什么
-
一个能基于之前讨论内容继续深入的分析助手
-
一个能协调多个工具完成复杂项目的协作系统
这就是我们今天要探索的领域:Memory(记忆) 与 Chains(工作流) 的融合。让我们打造真正有"记忆力"、能"团队协作"的AI应用。
一、核心理论:从单次对话到连续协作
1. Memory(记忆):为AI赋予"记忆力"
Memory模块的核心价值是:在多轮对话中持久化状态信息,让AI能够基于完整的上下文进行回应。
记忆的几种类型:
-
会话记忆 (
ConversationBufferMemory)-
最简单直接:保存所有的对话历史
-
优点:信息完整
-
缺点:随着对话增长,token消耗快速增加
-
-
会话窗口记忆 (
ConversationBufferWindowMemory)-
只保留最近N轮对话
-
平衡了上下文长度和记忆能力
-
适合大多数日常应用场景
-
-
会话摘要记忆 (
ConversationSummaryMemory)-
自动对历史对话进行摘要
-
用摘要代替原始对话内容
-
适合长周期、多话题的对话
-
-
实体记忆 (
ConversationEntityMemory)-
专门记忆对话中提到的实体信息(人物、地点、事件等)
-
结构化存储,便于精准召回
-
2. Chains(工作流):让AI组件"团队协作"
Chains模块的核心思想是:将多个LangChain组件(或其他Chain)组合起来,构建复杂的工作流程。
Chains的关键价值:
-
可组合性:像搭积木一样组合功能模块
-
可维护性:清晰的工作流便于调试和优化
-
可复用性:一次构建,多处使用
-
可靠性:内置错误处理和重试机制
LCEL(LangChain Expression Language):
使用 | 操作符(也叫管道操作符)优雅地组合组件,让代码既简洁又强大。
二、项目实战:构建有记忆的智能研究助理
现在,让我们构建一个能记住研究上下文、协调多个工具完成复杂研究任务的智能助理。
1、项目目标
创建一个具有长期记忆的研究助理,能够基于对话历史进行深入分析,并协调搜索、计算、文档处理等工具完成研究任务。
技术栈:LangChain Memory + Chains + 自定义Tools + HTTP请求调用
完整代码如下:
import requests
import json
import re
from datetime import datetime
from typing import Dict, List, Any
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.schema import BaseOutputParser
from langchain_core.messages import HumanMessage, AIMessage
# ==================== 全局配置 ====================
# 聚合平台 http://www.ufunai.cn 配置
BASE_URL = "https://api.ufunai.cn/v1"
API_KEY = "sk-xxxxx" # 替换为你的API密钥
MODEL_NAME = "gpt-4" # 指定要测试的模型名称
# 1. 自定义HTTP模型类(复用之前代码)
class HTTPChatModel:
def __init__(self, base_url: str, api_key: str, model: str = "gpt-4"):
self.base_url = base_url
self.api_key = api_key
self.model = model
def invoke(self, messages: list) -> str:
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {self.api_key}"
}
payload = {
"model": self.model,
"messages": messages,
"temperature": 0.1,
"max_tokens": 800
}
try:
response = requests.post(
f"{self.base_url}/chat/completions",
headers=headers,
json=payload,
timeout=60
)
response.raise_for_status()
result = response.json()
return result["choices"][0]["message"]["content"]
except requests.exceptions.RequestException as e:
print(f"HTTP请求错误: {e}")
if hasattr(e, 'response') and e.response is not None:
print(f"响应内容: {e.response.text}")
raise
# 2. 记忆系统实现
class ConversationMemory:
def __init__(self, window_size: int = 5):
self.window_size = window_size # 记忆窗口大小
self.conversation_history = [] # 完整的对话历史
self.entity_memory = {} # 实体记忆
self.summary = "" # 对话摘要
def add_message(self, role: str, content: str):
"""添加消息到记忆"""
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
message = {
"role": role,
"content": content,
"timestamp": timestamp
}
self.conversation_history.append(message)
# 自动提取实体信息
self._extract_entities(content, role)
# 维护记忆窗口
if len(self.conversation_history) > self.window_size * 2: # 乘以2因为包含用户和AI的消息
self._update_summary()
def _extract_entities(self, content: str, role: str):
"""简单实体提取(实际应用中可以使用NER模型)"""
# 提取可能的人物、项目、主题等
if role == "user":
# 简单的规则提取,实际应该用更复杂的方法
if "我叫" in content:
name_match = re.search(r"我叫(\w+)", content)
if name_match:
self.entity_memory["user_name"] = name_match.group(1)
if "研究" in content and "主题" in content:
topic_match = re.search(r"研究(.*?)(主题|方向)", content)
if topic_match:
self.entity_memory["research_topic"] = topic_match.group(1).strip()
def _update_summary(self):
"""更新对话摘要"""
if len(self.conversation_history) > 4:
# 简单的摘要生成,实际应该用模型生成
recent_conversation = self.conversation_history[-4:]
summary_parts = []
for msg in recent_conversation:
if msg["role"] == "user":
summary_parts.append(f"用户: {msg['content'][:50]}...")
else:
summary_parts.append(f"助手: {msg['content'][:50]}...")
self.summary = " | ".join(summary_parts)
# 保留最近的对话,移除较早的
self.conversation_history = self.conversation_history[-self.window_size * 2:]
def get_context(self) -> Dict[str, Any]:
"""获取记忆上下文"""
recent_messages = self.conversation_history[-self.window_size * 2:] if len(
self.conversation_history) > self.window_size * 2 else self.conversation_history
return {
"recent_conversation": recent_messages,
"entities": self.entity_memory,
"summary": self.summary,
"total_conversations": len(self.conversation_history)
}
# 3. 工具系统(扩展之前的工具)
class ResearchTools:
def __init__(self):
self.tools = {
"search": {
"function": self.search_research,
"description": "搜索研究资料,获取最新研究成果和论文信息"
},
"analyze_data": {
"function": self.analyze_data,
"description": "分析研究数据,进行统计计算和趋势分析"
},
"literature_review": {
"function": self.literature_review,
"description": "生成文献综述,总结现有研究成果"
},
"research_plan": {
"function": self.create_research_plan,
"description": "制定研究计划,包括时间安排和任务分配"
}
}
def search_research(self, query: str) -> str:
"""模拟研究资料搜索"""
mock_research_data = {
"机器学习": "最新研究显示,Transformer架构在多个领域取得突破,注意力机制成为研究热点。",
"人工智能": "多模态AI成为趋势,视觉-语言模型的性能持续提升。",
"区块链": "DeFi和NFT应用持续发展,跨链技术成为解决互操作性的关键。",
"量子计算": "量子霸权实现新突破,错误校正技术取得重要进展。"
}
for keyword in mock_research_data:
if keyword in query:
return f"研究热点 '{keyword}': {mock_research_data[keyword]}"
return f"已搜索研究主题: '{query}'。建议关注:机器学习、人工智能、区块链、量子计算等方向。"
def analyze_data(self, data_description: str) -> str:
"""模拟数据分析"""
analysis_templates = {
"统计": "数据分析结果:样本量充足,分布基本符合正态分布,p值<0.05具有统计显著性。",
"趋势": "趋势分析:呈现明显上升趋势,季度增长率约15%,预计未来6个月持续向好。",
"相关性": "相关性分析:发现强正相关关系(r=0.85),变量间存在显著关联。"
}
for key in analysis_templates:
if key in data_description:
return analysis_templates[key]
return f"数据分析完成。针对'{data_description}',建议进一步收集数据并验证假设。"
def literature_review(self, topic: str) -> str:
"""生成文献综述"""
return f"""
关于'{topic}'的文献综述:
1. 理论基础:该领域的基础理论已经相对成熟,近年来主要在应用层面取得突破。
2. 研究现状:当前研究主要集中在效率提升和跨领域应用两个方向。
3. 关键挑战:数据质量、计算资源、模型可解释性仍是主要挑战。
4. 未来趋势:预计未来将向更高效的算法和更广泛的应用场景发展。
建议关注近3年的顶会论文和权威期刊。
"""
def create_research_plan(self, project_description: str) -> str:
"""制定研究计划"""
return f"""
研究计划:{project_description}
阶段安排:
1. 文献调研(2周):全面了解研究现状,确定创新点
2. 数据收集(3周):获取和清洗实验数据,建立基准
3. 方法设计(4周):提出改进方法,设计实验方案
4. 实验验证(5周):进行对比实验,分析结果
5. 论文撰写(4周):整理研究成果,撰写论文
总周期:18周
关键节点:每阶段结束进行成果评估和方案调整
"""
# 4. 智能研究助理系统
class ResearchAssistant:
def __init__(self, model, memory, tools):
self.model = model
self.memory = memory
self.tools = tools
self.setup_chains()
def setup_chains(self):
"""设置工作流链"""
# 上下文分析链
self.context_chain = self._create_context_chain()
# 工具调用链
self.tool_chain = self._create_tool_chain()
# 响应生成链
self.response_chain = self._create_response_chain()
def _create_context_chain(self):
"""创建上下文分析链"""
template = """
基于以下对话历史和实体信息,分析当前的对话上下文:
实体记忆:
{entities}
对话摘要:
{summary}
最近对话:
{recent_conversation}
当前问题:{current_question}
请分析:
1. 用户的研究兴趣和偏好
2. 当前对话的上下文关系
3. 需要延续或深化的主题
"""
return ChatPromptTemplate.from_template(template)
def _create_tool_chain(self):
"""创建工具调用链"""
template = """
根据上下文分析和用户问题,决定是否需要使用研究工具:
可用工具:
- search: 搜索研究资料
- analyze_data: 分析研究数据
- literature_review: 生成文献综述
- research_plan: 制定研究计划
上下文分析:{context_analysis}
用户问题:{current_question}
请选择最合适的工具(如不需要工具,回答"无"):
"""
return ChatPromptTemplate.from_template(template)
def _create_response_chain(self):
"""创建响应生成链"""
template = """
你是一个专业的研究助理,具有深厚的学术背景。基于以下信息生成回应:
对话历史:{conversation_history}
工具结果:{tool_results}
当前问题:{current_question}
请生成专业、有帮助的回应,保持对话的连贯性:
"""
return ChatPromptTemplate.from_template(template)
def process_query(self, user_input: str) -> str:
"""处理用户查询的完整工作流"""
# 1. 获取记忆上下文
context = self.memory.get_context()
# 2. 上下文分析
context_prompt = self.context_chain.format(
entities=json.dumps(context["entities"], ensure_ascii=False),
summary=context["summary"],
recent_conversation=json.dumps(context["recent_conversation"], ensure_ascii=False),
current_question=user_input
)
context_messages = [{"role": "user", "content": context_prompt}]
context_analysis = self.model.invoke(context_messages)
print(f" 上下文分析: {context_analysis[:100]}...")
# 3. 工具调用决策
tool_prompt = self.tool_chain.format(
context_analysis=context_analysis,
current_question=user_input
)
tool_messages = [{"role": "user", "content": tool_prompt}]
tool_decision = self.model.invoke(tool_messages)
tool_results = ""
if "无" not in tool_decision:
# 解析工具选择
for tool_name in self.tools.tools:
if tool_name in tool_decision.lower():
print(f" 使用工具: {tool_name}")
tool_func = self.tools.tools[tool_name]["function"]
tool_results = tool_func(user_input)
print(f" 工具结果: {tool_results[:100]}...")
break
# 4. 生成最终响应
conversation_text = self._format_conversation_history(context["recent_conversation"])
response_prompt = self.response_chain.format(
conversation_history=conversation_text,
tool_results=tool_results,
current_question=user_input
)
response_messages = [{"role": "user", "content": response_prompt}]
final_response = self.model.invoke(response_messages)
# 5. 更新记忆
self.memory.add_message("user", user_input)
self.memory.add_message("assistant", final_response)
return final_response
def _format_conversation_history(self, history: List[Dict]) -> str:
"""格式化对话历史"""
formatted = []
for msg in history:
role = "用户" if msg["role"] == "user" else "助理"
formatted.append(f"{role}: {msg['content']}")
return "\n".join(formatted)
# 5. 主程序
def main():
# 初始化组件
chat_model = HTTPChatModel(
base_url = BASE_URL,
api_key = API_KEY,
model = MODEL_NAME
)
memory = ConversationMemory(window_size=3)
tools = ResearchTools()
# 初始化研究助理
assistant = ResearchAssistant(chat_model, memory, tools)
print("智能研究助理已启动!")
print("我是一个具有记忆能力的研究助手,能够记住我们的对话历史")
print("我可以帮您:搜索资料、分析数据、撰写综述、制定计划")
print("输入'退出'结束对话\n")
# 示例对话引导
demo_questions = [
"你好,我想研究机器学习在医疗诊断中的应用",
"这个领域最近有什么新进展?",
"帮我制定一个研究计划",
"我记得我们之前讨论过医疗诊断,现在想看看金融风控方面的应用"
]
print("您可以这样开始对话:")
for i, question in enumerate(demo_questions, 1):
print(f"{i}. {question}")
print()
# 交互式对话
conversation_count = 0
while True:
user_input = input("用户: ").strip()
if user_input.lower() in ['退出', 'exit', 'quit']:
break
if not user_input:
continue
print("\n" + "=" * 60)
print(" 思考中...")
response = assistant.process_query(user_input)
print(f"\n 研究助理: {response}")
# 显示记忆状态(调试信息)
context = memory.get_context()
print(f"\n 记忆状态: {len(context['recent_conversation'])}轮对话 | 实体: {len(context['entities'])}个")
if context['entities']:
print(f" 记忆实体: {context['entities']}")
print("=" * 60 + "\n")
conversation_count += 1
if __name__ == "__main__":
main()
2、代码深度解读
-
对话记忆系统 (
ConversationMemory):-
实现了多层次的记忆:对话历史、实体记忆、对话摘要
-
自动维护记忆窗口,平衡上下文长度和记忆能力
-
简单的实体提取机制,记住关键信息
-
-
研究工作流链 (
ResearchAssistant):-
上下文分析链:分析对话历史,理解当前语境
-
工具调用链:智能决策何时使用何种研究工具
-
响应生成链:基于所有信息生成连贯的回应
-
-
研究工具集 (
ResearchTools):-
专业的研究辅助工具:文献搜索、数据分析、综述生成、计划制定
-
模拟真实研究场景的工作流程
-
-
完整的记忆感知流程:
-
每次对话都基于完整的历史上下文
-
自动更新和维护记忆状态
-
实现真正的连续对话体验
-
运行效果演示:
智能研究助理已启动!
我是一个具有记忆能力的研究助手,能够记住我们的对话历史
我可以帮您:搜索资料、分析数据、撰写综述、制定计划
输入'退出'结束对话
您可以这样开始对话:
1. 你好,我想研究机器学习在医疗诊断中的应用
2. 这个领域最近有什么新进展?
3. 帮我制定一个研究计划
4. 我记得我们之前讨论过医疗诊断,现在想看看金融风控方面的应用
【用户: 你好,我想研究机器学习在医疗诊断中的应用】
============================================================
思考中...
上下文分析: 分析:
1. 用户的研究兴趣和偏好:
用户表达了对于机器学习在医疗诊断领域应用的研究兴趣。这表明用户可能对医疗技术、人工智能和数据分析等领域有一定的了解和兴趣。
2. 当前对话的上下文关系:...
使用工具: literature_review
工具结果:
关于'你好,我想研究机器学习在医疗诊断中的应用'的文献综述:
1. 理论基础:该领域的基础理论已经相对成熟,近年来主要在应用层面取得突破。
2. 研究现状:当前研究主要集中在效率提升和跨领域应用两...
研究助理: 你好!很高兴你对机器学习在医疗诊断中的应用感兴趣。根据你提供的文献综述,你已经有了一个很好的起点。接下来,我建议你可以从以下几个方面深入研究:
1. **理论研究**:虽然基础理论已经比较成熟,但深入理解这些理论对于应用开发和优化仍然至关重要。你可以考虑研究最新的理论进展,特别是那些针对医疗诊断特定问题的理论。
2. **效率提升**:研究如何通过改进算法或设计新的算法框架来提高诊断的效率。这可能包括减少模型的计算需求、提高数据处理速度等。
3. **跨领域应用**:探索机器学习在不同类型的医疗诊断中的应用,比如影像诊断、基因序列分析等。了解这些不同领域的特定需求和挑战,可以帮助你找到创新的解决方案。
4. **解决关键挑战**:关注如何提高数据质量、优化计算资源利用和增强模型的可解释性。这些都是当前研究的热点和难点。
5. **文献调研**:如前所述,关注近3年的顶级会议论文和权威期刊,这将帮助你了解最前沿的研究动态和技术进展。
希望这些建议对你的研究有所帮助!如果你有更具体的问题或需要进一步的指导,请随时联系我。祝你研究顺利!
记忆状态: 2轮对话 | 实体: 0个
============================================================
【用户: 这个领域最近有什么新进展】
============================================================
思考中...
上下文分析: 1. 用户的研究兴趣和偏好:
用户表达了对机器学习在医疗诊断中应用的兴趣。用户可能是一名研究者或学生,正在寻找关于如何将机器学习技术应用于医疗诊断领域的深入信息。用户对理论研究、效率提升、跨领域...
使用工具: search
工具结果: 已搜索研究主题: '这个领域最近有什么新进展'。建议关注:机器学习、人工智能、区块链、量子计算等方向。...
研究助理: 在机器学习在医疗诊断领域的最新进展方面,近年来有几个值得关注的重点:
1. **深度学习技术的应用**:深度学习模型,特别是卷积神经网络(CNNs)和循环神经网络(RNNs),在医学影像分析和基因数据解析中显示出了极高的效能。这些模型能够从复杂数据中学习深层特征,提高了诊断的准确性和效率。
2. **可解释性和透明度的提升**:随着机器学习模型在医疗领域的应用越来越广泛,模型的可解释性变得尤为重要。研究者们正在开发新的技术和方法,以提高模型决策过程的透明度,使医生和患者能够更好地理解模型的输出。
3. **联邦学习和数据隐私**:在遵守严格的数据隐私法规的同时,如何有效地利用分散的医疗数据是一个挑战。联邦学习提供了一种解决方案,它允许多个机构协作训练模型,而无需共享数据本身。
4. **多模态数据融合**:研究者们正在探索如何整合来自不同来源(如医学影像、电子健康记录、基因信息等)的数据,以构建更全面的诊断模型。这种融合有助于提供更精确的诊断和个性化的治疗方案。
5. **实时监测和预测**:利用机器学习进行实时健康监测和疾病预测正在成为研究的热点。例如,通过分析心电图(ECG)数据,模型可以实时预测心脏病发作的风险。
这些进展不仅提高了医疗诊断的准确性和效率,还为患者提供了更加个性化和及时的治疗方案。继续关注这些领域的最新研究成果,将有助于你在机器学习和医疗诊断领域的研究中保持领先。
记忆状态: 4轮对话 | 实体: 0个
============================================================
【用户: 帮我制定一个研究计划】
============================================================
思考中...
上下文分析: 1. 用户的研究兴趣和偏好:
用户对机器学习在医疗诊断中的应用表现出了浓厚的兴趣。他们希望了解该领域的最新进展,并寻求具体的研究方向和建议。用户的兴趣可能集中在深度学习技术的应用、模型的可解释性...
使用工具: search
工具结果: 已搜索研究主题: '帮我制定一个研究计划'。建议关注:机器学习、人工智能、区块链、量子计算等方向。...
研究助理: 当然,很高兴帮助你制定一个针对机器学习在医疗诊断中应用的研究计划。以下是一个建议的研究计划框架:
1. **文献回顾**:
- 开始你的研究之前,进行全面的文献回顾是非常重要的。这包括阅读最新的研究论文、会议记录和专业书籍,特别是那些关于机器学习在医疗诊断中应用的文献。
- 重点关注深度学习、联邦学习、多模态数据融合等领域的最新进展。
2. **确定研究问题**:
- 根据文献回顾,确定一个具体的研究问题。例如,你可以选择研究如何通过深度学习技术提高特定类型的医疗影像诊断的准确性。
- 确定研究问题后,明确你的研究目标和预期达到的成果。
3. **数据收集和处理**:
- 确定你将使用哪些数据集进行研究,以及如何获取这些数据。考虑数据的可用性、合法性和伦理性。
- 设计数据预处理和清洗的方法,以确保数据质量。
4. **模型开发和训练**:
- 选择合适的机器学习模型和算法。对于医疗诊断,深度学习模型如CNN和RNN可能是好的选择。
- 进行模型训练和参数调优,使用交叉验证等技术来评估模型的性能。
5. **结果评估和优化**:
- 使用适当的评估指标(如准确率、召回率、F1分数等)来评估模型的诊断性能。
- 根据评估结果对模型进行进一步的优化和调整。
6. **撰写研究报告和发表**:
- 将研究结果整理成论文,提交至相关的学术期刊或会议。
- 准备展示材料,如可能的话,在学术会议上展示你的研究成果。
7. **后续研究和应用**:
- 根据研究结果,探索后续的研究方向或潜在的临床应用。
- 与医疗专业人士合作,探讨将你的研究成果转化为实际应用的可能性。
希望这个研究计划能为你的研究提供一个清晰的方向和结构。如果你有任何
记忆状态: 6轮对话 | 实体: 0个
============================================================
三、高级特性:记忆优化策略
在实际应用中,可以进一步优化记忆系统(提供思路哈!不做具体实现,嘻嘻~~):
1. 分层记忆管理
class HierarchicalMemory:
def __init__(self):
self.short_term = [] # 短期记忆(最近对话)
self.long_term = {} # 长期记忆(重要实体、事实)
self.working_memory = {} # 工作记忆(当前任务相关)
def consolidate_memory(self):
"""记忆巩固:将重要的短期记忆转移到长期记忆"""
# 基于重要性评估和重复频率
pass
2. 记忆检索优化
def retrieve_relevant_memory(self, current_query: str) -> Dict[str, Any]:
"""基于当前查询检索相关记忆"""
relevant_entities = {}
relevant_history = []
# 基于语义相似度检索相关记忆
for entity, info in self.long_term.items():
if self.semantic_similarity(current_query, entity) > 0.7:
relevant_entities[entity] = info
return {
"entities": relevant_entities,
"history": relevant_history
}
四、总结与展望
通过本篇的学习,我们成功构建了一个具有记忆能力和协作工作流的智能研究助理,实现了从单次对话到连续协作的跨越。
本篇核心收获:
-
Memory系统:掌握了为AI应用添加记忆能力的完整方案
-
Chains工作流:学会了构建复杂、可维护的AI工作流程
-
上下文感知:理解了如何让AI基于完整对话历史进行回应
-
系统集成:将前几篇学到的所有能力融合成完整应用
生产环境建议:
-
使用专业的向量数据库进行记忆存储和检索
-
实现记忆的持久化存储,支持跨会话记忆
-
添加记忆的隐私和安全保护机制
-
优化记忆检索的效率和准确性
下一篇预告
LangChain实战入门(五):项目篇——构建企业级AI应用系统,在前四篇中,我们系统学习了LangChain的各个核心模块。现在,是时候将这些知识融会贯通,构建一个真正可用于生产环境的企业级AI应用系统了!
在下一篇中,我们将:
-
整合所有模块:Model I/O + Retrieval + Agents + Memory + Chains
-
构建真实项目:开发一个企业知识管理系统
-
优化生产部署:性能、安全、监控、成本控制
-
分享最佳实践:大型AI项目的架构设计和开发流程
这将是我们LangChain实战入门系列的收官之作,带你从学习者成长为真正的AI应用架构师!
另:需要源码的同学,请关注微信公众号(优趣AI)在留言区点赞留言评论获取!!!
创作不易,码字更不易,如果觉得这篇文章对你有帮助,记得点个关注、在看或收藏,给作者一点鼓励吧~!
AI开发入门到精通宝藏地图,理论+实战往期精彩文章
2、一文看懂Embedding:用代码给大家讲清这个核心概念
3、告别接力!Transformer的「圆桌会议」才是AI的高效沟通术
7、函数调用:让AI学会使用工具,从“思考者”变身“行动派”
8、LangChain实战入门(一):告别“裸调”API,从Model I/O开始优雅构建AI应用
更多推荐



所有评论(0)