当前位置: 首页 > ds >正文

langchain调用本地ollama语言模型和嵌入模型

参考:ollama兼容OpenAIEmbeddings的解决思路

解决代码:

访问embedding模型代码

# 测试以下两个引用都可以
from langchain_openai import OpenAIEmbeddings
#from langchain_community.embeddings import OpenAIEmbeddings 
from typing import List, Optionalclass OllamaCompatibleEmbeddings(OpenAIEmbeddings):def _tokenize(self, texts: List[str], chunk_size: int) -> tuple:"""禁用 Tokenization,直接返回原始文本和索引"""indices = list(range(len(texts)))return (range(0, len(texts), chunk_size), texts, indices)def _get_len_safe_embeddings(self, texts: List[str], *, engine: str, chunk_size: Optional[int] = None) -> List[List[float]]:"""直接传递原始文本,跳过 Token 化步骤"""_chunk_size = chunk_size or self.chunk_sizebatched_embeddings: List[List[float]] = []# 直接遍历原始文本分块for i in range(0, len(texts), _chunk_size):chunk = texts[i: i + _chunk_size]# 关键修改:input 直接使用文本列表response = self.client.create(input=chunk,  # 直接使用原始文本列表model=self.model,  # 显式传递模型参数**{k: v for k, v in self._invocation_params.items() if k != "model"})if not isinstance(response, dict):response = response.model_dump()batched_embeddings.extend(r["embedding"] for r in response["data"])# 跳过空文本处理(Ollama 不需要)return batched_embeddingsasync def _aget_len_safe_embeddings(self, texts: List[str], *, engine: str, chunk_size: Optional[int] = None) -> List[List[float]]:"""异步版本处理逻辑"""_chunk_size = chunk_size or self.chunk_sizebatched_embeddings: List[List[float]] = []for i in range(0, len(texts), _chunk_size):chunk = texts[i: i + _chunk_size]response = await self.async_client.create(input=chunk,model=self.model,**{k: v for k, v in self._invocation_params.items() if k != "model"})if not isinstance(response, dict):response = response.model_dump()batched_embeddings.extend(r["embedding"] for r in response["data"])  # 注意: 实际应为 "embedding"return batched_embeddingsembeddings = OllamaCompatibleEmbeddings(model="bge-m3:latest",openai_api_base='http://localhost:11434/v1',#说明一下,openai会自己拼接成http://127.0.0.1:11434/v1/embeddingsapi_key="ollama",# 任意字符串即可chunk_size=512)
output = embeddings.embed_query("你好")   
print(output)

访问LLM模型代码

from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage# 配置ChatOpenAI类指向本地Ollama API
llm = ChatOpenAI(model_name="deepseek-r1:1.5b",  # 指定Ollama部署的模型名称openai_api_base="http://localhost:11434/v1",  # Ollama API地址api_key="ollama",  # 任意字符串,仅用于兼容格式temperature=0.7,  # 控制输出随机性,0为确定性,1为最大随机性max_tokens=2000,  # 最大生成长度
)# 定义提问函数
def ask_llm(question: str) -> str:"""向本地DeepSeek-R1模型提问并获取回答"""# 创建HumanMessage对象messages = [HumanMessage(content=question)]# 调用模型生成回答response = llm.invoke(messages)# 提取回答内容return response.content# 测试示例
if __name__ == "__main__":question = "请简要介绍量子计算的基本原理"answer = ask_llm(question)print(f"问题: {question}")print("\n回答:")print(answer)

http://www.xdnf.cn/news/16010.html

相关文章:

  • 线程状态线程安全
  • gradle微服务依赖模版
  • 软件反调试(5)- 基于注册表实时调试器检测
  • [Python] -项目实战7- 用Python和Tkinter做一个图形界面小游戏
  • 我的世界-推理
  • 基于Event Sourcing和CQRS的微服务架构设计与实战
  • 连接语言大模型(LLM)服务进行对话
  • 随着GPT-5测试中泄露OpenAI 预计将很快发布 揭秘GPT-5冲击波:OpenAI如何颠覆AI战场,碾压谷歌和Claude?
  • [硬件电路-58]:根据电子元器件的控制信号的类型分为:电平控制型和脉冲控制型两大类。
  • 威力导演 12:革新级影音创作平台——专业特效与极致效率的完美融合
  • 算法题(176):three states
  • 100个GEO基因表达芯片或转录组数据处理27 GSE83456
  • [simdjson] 实现不同CPU调度 | 自动硬件适配的抽象
  • JAVA面试宝典 -《API设计:RESTful 与 GraphQL 对比实践》
  • Linux操作系统之线程(四):线程控制
  • RabbitMQ核心组件浅析:从Producer到Consumer
  • 【Django】DRF API版本和解析器
  • ubuntu-linux-pycharm-社区版安装与django配置
  • 高性能熔断限流实现:Spring Cloud Gateway 在电商系统的实战优化
  • Linux网上邻居局域网络共享工具Samba及Smb协议,smbd,nmbd服务,smbpasswd,pdbedit命令,笔记250720
  • 数组算法之【合并两个有序数组】
  • 无线通信相关概念
  • 【机器学习深度学习】魔塔社区模型后缀全解析:Base、Chat、Instruct、Bit、Distill背后的技术密码
  • 【Elasticsearch】冷热集群架构
  • 力扣 hot100 Day50
  • 在Ubuntu22系统上离线部署ai-infra-guard教程【亲测成功】
  • windows C#-本地函数
  • 【计算机组成原理】原码、补码和移码
  • ZooKeeper学习专栏(一):分布式协调的核心基石
  • 阶段1--Linux中的计划任务