基于Ollama+AnythingLLM快速搭建本地RAG系统

基于Ollama+AnythingLLM快速搭建本地RAG系统

本次使用的操作系统及硬件信息如下:

  • 操作系统:windows11 23H2
  • CPU: intel i7-12700
  • MEM: 16GB
  • GPU: NVIDIA GeFor
  • ce GTX 1650
  • Disk: 512GB SSD
  • Python:3.10.0

1. 下载安装Ollama

1.1 安装ollama

下载ollama并安装,傻瓜式安装。

1.2 下载预训练模型

需要下载两种模型:

  1. llm模型: gemma:2B
ollama pull gemma:2B
  1. embedding模型: nomic-embed-text
ollama pull nomic-embed-text

1.3 启动ollama服务

C:\Users\Admin>ollama serve
time=2024-04-21T14:44:06.139+08:00 level=INFO source=images.go:817 msg="total blobs: 24"
time=2024-04-21T14:44:06.150+08:00 level=INFO source=images.go:824 msg="total unused blobs removed: 0"
time=2024-04-21T14:44:06.150+08:00 level=INFO source=routes.go:1143 msg="Listening on 127.0.0.1:11434 (version 0.1.32)"
time=2024-04-21T14:44:06.238+08:00 level=INFO source=payload.go:28 msg="extracting embedded files" dir=C:\Users\Admin\AppData\Local\Temp\ollama3090016095\runners
time=2024-04-21T14:44:06.434+08:00 level=INFO source=payload.go:41 msg="Dynamic LLM libraries [cpu cpu_avx cpu_avx2 cuda_v11.3 rocm_v5.7]"

执行上述命令会在本地的114343端口启动服务,可以供外部调用。

C:\Users\Admin>netstat -ano | findstr 11434
  TCP    127.0.0.1:11434        0.0.0.0:0              LISTENING       29472

C:\Users\Admin>tasklist | findstr ollama
ollama.exe                   29472 Console                    1     47,432 K

2. 下载安装AnythingLLM

访问官网下载windows安装包,双击下一步安装即可。

安装后搜索AnythingLLM或在桌面快捷方式打开程序,兼容多种LLM模型。

2.1 开始配置

2.2 LLM Preference配置如下:

  • LLM provider: ollama
  • Ollama Base URL:http://127.0.0.1:11434
  • Chat Model Selection: gemma:2b
  • Token context window: 4096

2.3 Embedding Preference

选择ollama并配置如下参数:

  • Ollama Base URL:http://127.0.0.1:11434
  • Embedding Model Selection: nomic-embed-text:latest
  • Token context window: 8192

2.4 Vector Database

向量数据库选择LanceDB。

2.5 Data handing

2.6 welcome to AnythingLLM

填写调查信息。

2.7 创建工作区

3. 知识库创建与测试

3.1 测试文档

测试的两个文档,分别为英文和中文:

  1. paul_graham_essay.txt
  2. 中华人民共和国民法典.pdf

3.2 上传并做向量化

在上述创建的工作区,上传文档:

选择测试文档并移动到工作区:

保存并进行嵌入向量化处理:

3.3 对话问答测试

prompt 1: What was the author‘s age when in 9th grade?

prompt 2: What did the author do in 9th grade?

prompt 3: 民法典第一条内容是什么?

从chat对话中可以看出基于上传的文档,可以回答简单的问题;对于中文文档推理的效果较差。

<think>我们正在处理用户关于ANSA二次开发的问题。用户之前询问了`base.CollectEntities`的用法,现在遇到了新的错误:`AttributeError: module 'base' has no attribute 'CurrentSelection'`。 根据用户提供的错误信息,问题出现在尝试调用`base.CurrentSelection`时。在ANSA二次开发中,`base`模块确实提供了`CurrentSelection`函数,但错误提示表明在当前环境中找不到这个属性。 分析可能的原因: 1. **ANSA版本问题**:用户使用的ANSA版本可能较旧,不支持`CurrentSelection`函数。该函数在较新的ANSA版本中引入,旧版本中可能不存在。 2. **导入方式问题**:用户可能没有正确导入`base`模块,或者导入了同名的其他模块(如Python标准库中的`base`模块)。 3. **函数名拼写错误**:虽然用户提供的错误信息中显示的是`CurrentSelection`,但实际代码中可能存在大小写或拼写错误。 在ANSA二次开发中,获取当前选中实体的标准方法是使用`base.CurrentSelection`函数。该函数返回当前在图形界面中选中的实体列表。 ### 解决方案 #### 1. 确认ANSA版本 首先,请确认您使用的ANSA版本是否支持`CurrentSelection`函数。该函数在ANSA v15.1.0及以上版本中可用。您可以通过以下代码检查ANSA版本: ```python import ansa print(ansa.GetANSAVersion()) ``` 如果版本低于v15.1.0,您需要使用旧版方法获取当前选择: ```python # 旧版ANSA获取当前选择的方法 from ansa import guitk selected = guitk.ANSA_GUI.GetSelectedEntities() ``` #### 2. 检查导入的模块 确保您正确导入了ANSA的`base`模块,而不是其他名为`base`的模块。在ANSA脚本环境中,通常使用: ```python from ansa import base ``` #### 3. 使用正确的函数名 注意函数名的大小写:`CurrentSelection`(首字母大写)。尝试以下代码: ```python selected_entities = base.CurrentSelection(deck) ``` #### 4. 替代方法(如果上述均失败) 如果上述方法都不可行,可以尝试使用`guitk`模块中的选择获取方法: ```python from ansa import guitk, constants # 获取当前选择(返回实体列表) selected_entities = guitk.ANSA_GUI.GetSelectedEntities() # 过滤出属性(PROPERTY)实体 selected_props = [ent for ent in selected_entities if ent._type == '__PROPERTIES__'] # 提取PID(以NASTRAN为例) deck = base.CurrentDeck() # 或指定为特定求解器,如constants.NASTRAN selected_pids = [] for prop in selected_props: # 获取PID字段的值 pid_value = prop._get_entity_values(deck, ('PID',)).get('PID', None) if pid_value is not None: selected_pids.append(pid_value) ``` ### 各ANSA版本选择API对比 | ANSA版本 | 推荐方法 | 说明 | |------------|-----------------------------------|--------------------------| | **≥v15.1** | `base.CurrentSelection(deck)` | 返回当前选择的实体列表 | | **<v15.1** | `guitk.ANSA_GUI.GetSelectedEntities()` | 返回当前选择的实体列表 | ### 常见错误排查 1. **模块导入冲突** 避免使用`import base`,而是使用`from ansa import base`,确保导入的是ANSA的模块。 2. **未设置求解器模板** `CurrentSelection`需要传入求解器模板(如`constants.NASTRAN`),否则可能返回空列表。 3. **无选中实体** 如果当前没有选中任何实体,函数将返回空列表。请确保在运行脚本前已选中属性(PROPERTY)。 ### 完整示例(兼容新旧版本) ```python from ansa import base, constants, guitk def get_selected_pids(): deck = base.CurrentDeck() # 方法1:尝试使用base.CurrentSelection(新版本) try: selected_entities = base.CurrentSelection(deck) except AttributeError: # 方法2:回退到guitk方法(旧版本) selected_entities = guitk.ANSA_GUI.GetSelectedEntities() # 过滤属性实体并提取PID selected_pids = [] for ent in selected_entities: if ent._type == '__PROPERTIES__': # 根据求解器获取PID字段名 if deck == constants.ABAQUS: field_name = 'id' else: # NASTRAN, LSDYNA等 field_name = 'PID' # 获取字段值 values = ent.get_entity_values(deck, (field_name,)) pid_val = values.get(field_name) if pid_val is not None: selected_pids.append(pid_val) return selected_pids # 使用示例 if __name__ == '__main__': pids = get_selected_pids() print("选中的PID:", pids) ``` ### 相关问题 §§相关问题§§ 1. 如何在ANSA中通过脚本选择指定PID的实体? 2. ANSA二次开发中如何获取属性关联的单元和材料? 3. 不同ANSA版本API变化如何兼容处理?</think>### AttributeError: module 'base' has no attribute 'CurrentSelection' 原因与解决方案 这个错误表明您在使用ANSA二次开发API时,尝试调用了`base.CurrentSelection()`方法,但当前环境中的`base`模块没有这个属性。以下是可能的原因和解决方案: #### 错误原因分析 1. **ANSA版本不兼容**(最常见原因) `CurrentSelection`是较新的ANSA API(v15.1+引入),旧版本可能不支持[^1]。 **验证方法**:在ANSA脚本窗口运行: ```python import ansa print(ansa.GetANSAVersion()) # 检查版本是否≥15.1 ``` 2. **模块导入错误** 可能导入了错误的`base`模块(如Python标准库的`base`而非ANSA的`base`): ```python # 错误方式 ❌ import base # 可能导入了Python内置模块 # 正确方式 ✅ from ansa import base # 明确指定ansa包的base模块 ``` 3. **API使用方式错误** `CurrentSelection`需要传递求解器模板参数: ```python # 错误用法 ❌ base.CurrentSelection() # 正确用法 ✅ deck = base.CurrentDeck() # 获取当前求解器模板 selected = base.CurrentSelection(deck) # 必须传入deck参数 ``` #### 兼容性解决方案 ##### 方案1:使用新版API(推荐) ```python from ansa import base, constants # 获取当前求解器模板(如NASTRAN) deck = base.CurrentDeck() # 或直接指定 constants.NASTRAN # 获取当前选择的实体 selected_entities = base.CurrentSelection(deck) # v15.1+ # 过滤属性实体 selected_props = [ent for ent in selected_entities if ent._type == '__PROPERTIES__'] ``` ##### 方案2:旧版ANSA的替代方法(v15.0及以下) ```python from ansa import guitk # 旧版获取选择集的方法 selected_entities = guitk.ANSA_GUI.GetSelectedEntities() # 提取属性PID(以NASTRAN为例) selected_pids = [] for ent in selected_entities: if ent._type == '__PROPERTIES__': # 获取PID字段值 values = ent.get_entity_values(constants.NASTRAN, ('PID',)) selected_pids.append(values['PID']) ``` #### 版本兼容性封装函数 ```python def get_selected_properties(): """兼容不同ANSA版本的属性获取函数""" try: # 尝试新API (v15.1+) from ansa import base deck = base.CurrentDeck() selected = base.CurrentSelection(deck) except AttributeError: # 回退到旧API (v15.0-) from ansa import guitk selected = guitk.ANSA_GUI.GetSelectedEntities() # 过滤属性实体 return [ent for ent in selected if ent._type == '__PROPERTIES__'] # 使用示例 props = get_selected_properties() for prop in props: print(f"属性PID: {prop.PID}") # 直接访问PID字段 ``` #### 关键注意事项 1. **求解器字段差异**: ABAQUS中PID字段名为`'id'`,需特殊处理: ```python if deck == constants.ABAQUS: pid_value = prop.get_entity_values(deck, ('id',))['id'] ``` 2. **实体类型验证**: 使用前检查实体类型避免错误: ```python if not hasattr(ent, '_type'): continue # 跳过非标准实体 ``` 3. **错误处理**: 添加异常捕获防止脚本崩溃: ```python try: selected = base.CurrentSelection(deck) except Exception as e: print(f"API调用失败: {str(e)}") selected = [] ``` > 通过`dir(base)`可查看当前版本支持的API列表: > ```python > print([func for func in dir(base) if not func.startswith('__')]) > ``` ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lldhsds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值